是否可以破解基於散列的分組密碼?
讓我們定義以下分組密碼:
$ C_n = M_n \oplus H(k + n) $ 在哪裡 $ C_n $ 是第 n 個密文塊, $ M_n $ 是第 n 個明文塊, $ H $ 是一個密碼散列函式,並且 $ k $ 是秘鑰。
解密可以很簡單,通過計算 $ M_n = C_n \oplus H(k + n) $ .
假設一個正確的操作模式,例如 CBC,我們將如何攻擊這樣的方案?這個方案是否可以證明是安全的 $ H $ 是?
這不是“分組密碼”,因為分組密碼是給定大小的塊空間的密鑰相關排列。在這裡,您按塊處理數據,但“加密”部分是通過與值進行異或運算來完成的 $ H(k+n) $ 這取決於關鍵 $ k $ 並在“塊號”上 $ n $ . 因此,您沒有一個排列(對於給定的鍵),而是很多排列。
相應地,目前還不清楚“CBC”在這樣的野獸身上會是什麼樣子。如果你想像它是這樣的:
$$ C_0 = M_0 \oplus IV \oplus H(k+0) $$ $$ C_n = M_n \oplus C_{n-1} \oplus H(k+n) $$ 那麼不幸的是,如果您使用相同的密鑰加密兩個不同的消息,即使您使用不同的 IV,這也是無可救藥的弱點——因為 XOR 與 $ IV $ 和 $ C_{n-1} $ 任何人都可以輕易取消( $ x\oplus y \oplus y = x $ 對全部 $ x $ 和 $ y $ ) 你最終得到了臭名昭著的“兩次墊”。
正如@PaŭloEbermann 所說,你的密碼建議是一個流密碼:它與一個依賴於密鑰的偽隨機流進行異或,從密鑰生成 $ k $ 但獨立於明文。這裡,偽隨機數生成器是由散列函式建構的。有幾種方法可以做到這一點,但並不是都很好,因為一些著名的散列函式(MD5 和整個 SHA 系列)遭受稱為長度擴展攻擊的東西。從散列函式建構 PRNG 的“安全”方法是使用 HMAC,稱為 HMAC_DRBG。它是NIST 標準。相同的標准定義了 Hash_DRBG,它更快(並且與您的提議相似)但可能更弱,因為它依賴於底層雜湊函式的一些定義不明確的屬性。
當然,應該添加 IV,而不是像上面解釋的那樣添加一種 CBC。相反,更換你的鑰匙 $ k $ 和 $ IV||k $ (IV 和密鑰的連接)。同樣,微妙的弱點可能潛伏著。
無論哪種方式,都可以從散列函式建構(流)密碼,但它需要小心,並且通常提供相當差的性能。事實上,散列函式在處理大量輸入數據方面速度很快。在這裡,您希望它產生大量輸出數據——為此,散列函式不是很快。即使使用 SHA-1 和 Hash_DRBG,生成的密碼也會比普通的 AES 慢。