Hash

這能保證唯一的 32 位雜湊嗎?

  • October 9, 2014

我遇到了一些鬆散地執行以下操作以實現 32 位雜湊的原始碼。

輸入字元串通過 MD5 得到 16 字節的 Hash(和往常一樣)。然後這 16 個字節被分成 4 個字節的字。這些詞中的每一個都是 $ \oplus $ 為了得到最終的 4 字節字,這被認為是 32 位散列。

該應用程序並不真正關心圖像前阻力等方面的安全性,但它所需要的只是防碰撞性。

那麼,以上是否保證沒有碰撞(比生日綁定更好)?當然,這取決於輸入字元串的熵等,但鑑於我們事先不知道哪些可能的字元串可以作為輸入傳遞:我們如何分析這種衝突方案?

據我了解,方案是:

$$ MD5(x) = a_1||a_2||a_3||a_4 , , \Longrightarrow , , H(x) = a_1 \oplus a_2 \oplus a_3 \oplus a_4, $$ 和 $ a_i $ 4 字節/32 位字。

顯然,由於 pidgeonhole 原理,您不能保證來自無界域的唯一 32 位散列。你也不能讓尋找碰撞變得不可行,因為 $ 2^{16} $ 如果那樣,MD5 呼叫需要幾秒鐘。

如果 MD5 是一個理想的 128 位散列,那麼是否取前 4 個字節、對 32 位字進行異或運算或其他任何內容都沒有關係。所有這些都是理想的 32 位散列。但是,事實並非如此,您可以在大約 $ 2^{33} $ 操作。這不會直接導致對此的攻擊,因為它比蠻力慢,但它有可能被擴展。XOR 有可能使這種攻擊比截斷更難或更容易,但是對於 32 位散列來說,這並不重要,因為蠻力就足夠了。

假設您不讓攻擊者控制輸入(因為那會完全被破壞),問題不在於抗碰撞性,而在於 MD5 的偽隨機性。MD5 仍然被認為表現得像 PRF,如果輸入字元串是“隨機”選擇的,那麼輸出也是一致隨機的。(這就是HMAC-MD5 安全的原因。)XOR 不會影響這一點,因此您應該讓 32 位散列的行為也像 PRF 一樣。

因此,對於不受攻擊者控制的輸入,您應該會在生日界限看到碰撞。除了您期望 32 位散列的差異之外,遲早都是如此。但是,XOR 並沒有真正的好處,因此您不妨只使用第一個 4 字節字。

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