MD5實現中的加法步驟
在 MD5 中,有四輪。在每一輪之後,為什麼我們需要添加計算的 $ Q $ 值到初始值,然後將此值作為下一輪的輸入。例如在第一輪之後,我們計算
$$ Q^{\text{new}}1=Q{60}+Q_{-4}, \ Q^{\text{new}}2=Q{61}+Q_{-3}, \ Q^{\text{new}}3=Q{62}+Q_{-2}, \ Q^{\text{new}}4=Q{63}+Q_{-1} $$ 為什麼我們不能直接將計算值作為下一輪的輸入而不將它們添加到初始值中?
我們之所以在壓縮函式的末尾將輸入添加到壓縮函式,那是因為否則壓縮函式將是可逆的,那會很糟糕。
如果沒有最後一步,壓縮函式在這個意義上將是可逆的:給定所需的壓縮函式輸出和消息塊,我們將能夠找到壓縮函式輸入。我們之所以能夠做到這一點,是因為 MD5 壓縮函式由 64 個步驟組成,並且每個步驟本身很容易反轉。在最後添加壓縮輸入會破壞這種可逆性,因為分析人員無法反轉最後一步(因為他還不知道壓縮函式輸入)。他可以在那個階段猜測輸入,然後向後執行其餘的壓縮函式;事實證明,這並不比僅僅猜測壓縮函式輸入並向前執行更有效。
這種可逆性很糟糕,因為它允許攻擊者做我們不希望他做的把戲。例如,我們希望原像攻擊(即,給定一個散列值,給我一個散列到該值的消息)大致採取(使用 128 位散列,如 MD5) $ 2^{128} $ 腳步; 也就是說,沒有一種方法比嘗試隨機消息並對它們進行散列處理效率更高,直到你偶然發現一個具有正確散列的消息。但是,如果壓縮函式是可逆的,那麼攻擊者可以這樣做,給定 $ Target $ 雜湊值:
- 產生 $ 2^{64} $ 消息前綴,並生成該點的部分雜湊
- 產生 $ 2^{64} $ 消息後綴。當這些,他會從 $ Target $ 雜湊值,並向後計算雜湊,直到他得到反向部分雜湊(首先應用了 MD5 最終填充)。
- 鑑於這兩個 128 位項目的列表,他然後尋找匹配項(並且,根據生日悖論,很有可能成為匹配項。
並且,如果部分雜湊 $ P_i $ 與的逆部分雜湊相同 $ S_j $ ,然後他知道 $ Hash( P_i || S_j ) = Target $ . 這是因為,當我們評估雜湊時,我們首先對來自的塊執行壓縮函式 $ P_i $ ; 在這個評估結束時,他會得出共同的部分雜湊值。然後,他將對來自的塊執行壓縮函式 $ S_j $ 填充後;他知道,從這個共同的價值開始,這會導致 $ Target $ .
所以,正因為如此,我們希望採取的攻擊 $ 2^{128} $ 步驟可以大致完成 $ 2^{64} $ 腳步。使壓縮函式不可逆(真正的 MD5 確實如此)可以防止這種攻擊。
這個答案不正確,是由於對相關 RFC 的誤解
在相關的 RFC中,作者在“MD4 和 MD5 之間的差異”下聲明
- 現在每一步都添加上一步的結果。這促進了更快的“雪崩效應”。
所以這似乎是他們採取這一步驟的理由。如果是合理的,我真的不能說。
但不管怎樣,如果你想實現 MD5,那麼這個步驟是必要的,否則你的實現將與其他實現不兼容。