Hash

為什麼不只輸出一部分雜湊狀態來防禦長度擴展攻擊呢?

  • May 30, 2018

據我了解長度擴展攻擊,它們取決於大多數加密散列函式的巧合屬性,即散列值恰好是散列最後一個數據塊後的散列函式狀態。這使攻擊者能夠使用“停止”狀態初始化他們自己的雜湊函式。

既然如此,為什麼散列函式沒有簡單地定義為輸出其狀態的 n 字節前綴(即對於 256 位散列,保持 512 位狀態)?我假設這沒有完成是有根本原因的,但我無法找到任何專門解決它的文獻。

與您的假設相反,這樣做是安全**的:例如,雜湊函式SHA-224 和 SHA-384與 SHA-256 和 SHA-512 的算法基本相同!唯一的區別在於內部使用的Merkle-Damgård構造的初始值,當然,只有第一個 $ 224 $ 或者 $ 384 $ 結果雜湊的位被輸出。這些雜湊函式可以抵抗長度擴展攻擊,因為攻擊者必須猜測內部狀態的剩餘(太多)位。(請注意,不同初始值的選擇與此問題無關,因此僅截斷 SHA-256 或 SHA-512 也會產生抗長度擴展雜湊。)

作為另一個幾乎例子:在某種意義上,Keccak/SHA3的第一個 $ r $ 輸出位只是消耗最後一個塊後內部狀態的前綴,而狀態的其餘部分是保密的(並且可能用於計算更多的輸出位,這些輸出位又是內部狀態的前綴,通過重複應用所謂的“海綿功能”)。有了這種結構,人們可以爭辯說,事實上,這被宣傳為 Keccak 的一個特性,即鍵控散列 $ \operatorname{Keccak}(\mathit{key}\mathbin\Vert\mathit{data}) $ 產生一個安全的 MAC,而 Merkle-Damgård 雜湊的相同結構容易受到長度擴展攻擊。

引用自:https://crypto.stackexchange.com/questions/26920