一張神奇的 gif 圖,能夠顯示本身的 MD5 值

這是一張神奇的 gif 圖片,它能夠顯示本身的 MD5 值。html

md5.gif

這張圖片的 MD5 值是:前端

f5ca4f935d44b85c431a8bf788c0eaca

原始圖片地址:https://shells.aachen.ccc.de/...java

相關連接:

文中討論區也大體解釋了圖片的生成原理。git

1979 年 Ralph Merkle 博士發表了關於單向函數構造抗碰撞的信息摘要論文 R.C. Merkle. Secrecy, authentication, and public key systems. (PS:後來博士轉而去研究奈米科技以及人體冷凍技術)算法

Merkle-Damgård construction

(圖片來源維基百科:Merkle-Damgård construction)shell

Merkle 就是 MDx 中的 M,另外一 D 是丹麥人 Ivan Damgård。(伊萬???)微信

在 13 年後的 1992 年,Ronald Rivest 發表了 MD5 算法,用於改進以前的 MD、M一、...、M4 算法。svg

經過再仔細觀察上面的圖就很容易發現,MDx 族算法是一種基於塊的流式算法。函數


咱們回到這張神奇的 gif 圖上,本質是一種碰撞攻擊 Herding Hash Functions and the Nostradamus Attackspa

王小云的差分攻擊算法雖然能夠找到 MD5 的消息碰撞對,可是她找到的碰撞消息對是一組隨機比特字符,碰撞消息對沒有語義。而前綴構造碰撞算法能夠構造出只有尾部不一樣的兩個文件。

前綴構造碰撞算法

(圖片來源見水印)

若是咱們找到一個碰撞,能夠用兩個不一樣的值而後給他們分別附加數據後能夠計算出相同的值:

在原始的 MD5 碰撞基礎上,計算兩個消息 M1 和 M2,有 H(M1) = H(M2),其中函數 H(x) 是計算哈希值函數。Stevens 擴展了該研究,而且找到了一種方法,使兩個已知值 P1 和 P2 經過附加字節產生碰撞。

使用前綴 P1 和 P2,他可以證實如何找到 S1 和 S2,使得 H(P1 | S) = H(P2 | S2)。

而這張圖使用了相似的方式,在評論中有人提到:

  1. Generate a gif for each possible digit in the first column
  2. Append collision blocks to each gif to make a 16 way collision
  3. Repeat for each digit
  4. Hash the final product
  5. Replace each digit with the correct digit

若是想本身構造要給碰撞程序,能夠參考這個連接:Create your own MD5 collisions


歡迎關注個人公衆號,關注前端文章:

justjavac微信公衆號

相關文章
相關標籤/搜索