Hash
在最後一次壓縮中改變輪數會防止長度擴展攻擊嗎?
假設我們有一些 Merkle-Damgård 散列函式。假設壓縮功能支持它並且在更多輪次中同樣安全。
更改最後一個分組密碼壓縮的輪數(例如將它們加倍)會防止長度擴展攻擊嗎?
剩下的問題是猜測壓縮函式是什麼,以及它如何使用輪次。未指定,不,增加最後一個壓縮函式的輪數並不能保證防止長度擴展攻擊,即使壓縮函式被改變,而是通過增加更多輪數來改進。
反例證明:將 SHA-512 修改為
- 去除每個壓縮函式末尾的異或,實際上直接利用Davies-Meyer壓縮函式的分組密碼作為壓縮函式;
- 並修改該密碼的密鑰調度,使其在壓縮函式的分組密碼中使用的輪數之後重複(但該分組密碼在其他方面是安全的)
- 並在最後一個壓縮函式中將該分組密碼中的輪數加倍,重用與前半部分相同的常數
這種組合實際上對擴展消息的最後一個塊進行了兩倍的雜湊處理,並使用了一個可逆的壓縮函式。這使得雜湊在理論上被削弱了一些攻擊,但從所有實際的角度來看仍然是牢不可破的。這使得它在某些情況下容易受到長度擴展攻擊。例如,當未知輸入是一個消息塊(128 字節)並且我們知道它是散列時,我們可以確定地計算一個 3 塊(384 字節)輸入的散列,從原始輸入開始,然後是已知的兩倍塊等於 SHA-512 的填充塊,用於 128 字節輸入。
另一方面,如果我們在最後一個壓縮函式中所做的更改使其與正常壓縮基本無關,是的,我們顯然可以免受長度擴展攻擊。毫無疑問,改變在 SHA-2 中的 Davies-Meyer 或Matyas-Meyer-Oseas壓縮函式的分組密碼的每一輪使用的常數(不改變輪數)會做到這一點。因此,將輪數加倍並在下半場使用新的常數。我沒有聲明將相同常數的輪數加倍。