Hash

散列消息長度縮短一字節的長度擴展攻擊和安全性

  • December 22, 2021

MD5、SHA1、SHA2 容易受到長度擴展攻擊Wikipedia:Length extension attack

也可以生成 $ H(\text{message}[1..n-1]) $ 從 $ H(\text{message}[1..n]) $ 如果我知道最後一個字節?

它與 md5 本質上是相同的問題:是否可能進行反向長度擴展攻擊?

當我只想在 MD5、SHA1 或 SHA2 中的任何一個中將消息縮短一個字節時,這是否可能?或者我至少可以降低蠻力攻擊的計算成本嗎?

也可以生成 $ H(\text{message}[1..n-1]) $ 從 $ H(\text{message}[1..n]) $ 如果我知道最後一個字節?

不,長度擴展攻擊並非完全如此。讓我們看看 MD5 是如何運作的;

MD5 將消息劃分為 512 位塊,以Merkle -Damgård方式對1進行操作。每條消息都被填充。消息用 1 填充並跟隨許多零,因此填充的消息大小是 512 的倍數,消息長度附加在以 64 位表示的末尾。在始終添加 1 的最小方式中,零的數量可以為零。

更正式地說,添加位1而不是添加所需的位0,直到消息長度以位為單位 $ \equiv 448 \pmod{512} $ 然後添加 64 位的消息長度。這也限制了可以使用 MD5 散列的文件大小。

所以 $ message[1..n-1] $ 計算為 $ message[1..n-1] \mathbin| padding $ . 在填充消息之後,可以執行長度擴展攻擊。帶有填充的擴展消息是;

$$ \text{message}[1..n-1] \mathbin| \text{padding} \mathbin| \text{extension}\mathbin|\text{padding} $$

為了執行長度擴展攻擊,人們用雜湊替換目標雜湊函式的初始值。在此之後,像通常的散列一樣計算擴展散列。正式地

  • 讓 $ \text{MD5}’(m,\text{MD5IV}) = \text{MD5}(m) $ . 是的 $ \text{MD5}’ $ 可以控制 MD5 的 IV。
  • 讓 $ h = MD5(m) $ 一條消息 $ m $ .
  • 然後 $ h’ = MD5’(m’, h) = MD5(m\mathbin|pad_1\mathbin|m’\mathbin|pad_2) $ 在哪裡 $ pad_1 $ 是填充 $ m $ 當使用 MD5 和 $ pad_2 $ 是填充 $ m\mathbin|pad_1\mathbin|m’ $

這 $ h’ $ 是長度擴展散列。

當我只想在 MD5、SHA1 或 SHA2 中的任何一個中將消息縮短一個字節時,這是否可能?或者我至少可以降低蠻力攻擊的計算成本嗎?

在 SHA3 之後,還有 SHA2 的變體,例如SHA512-256,它計算輸出大小為 512 位的雜湊,然後截斷為 256。這幾乎消除了長度擴展攻擊的可能性。SHA512-256 的初始值與分隔域的 SHA512-512 不同。換句話說,它們是不同的隨機預言機。

當然,抗原像性和二次原像性抗性和抗碰撞性會減弱 $ 2^8 $ , $ 2^8 $ , 和 $ \sqrt{2^8} $ , 分別。


1劃分不是特定於 MD5 的,劃分大小可能會隨著每個散列函式而變化,例如 SHA512 使用 1024 位塊大小

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