这是一张神奇的 gif 图片,它能够显示本身的 MD5 值。html
这张图片的 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)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 Attack。spa
王小云的差分攻击算法虽然能够找到 MD5 的消息碰撞对,可是她找到的碰撞消息对是一组随机比特字符,碰撞消息对没有语义。而前缀构造碰撞算法能够构造出只有尾部不一样的两个文件。
(图片来源见水印)
若是咱们找到一个碰撞,能够用两个不一样的值而后给他们分别附加数据后能够计算出相同的值:
在原始的 MD5 碰撞基础上,计算两个消息 M1 和 M2,有 H(M1) = H(M2),其中函数 H(x) 是计算哈希值函数。Stevens 扩展了该研究,而且找到了一种方法,使两个已知值 P1 和 P2 经过附加字节产生碰撞。
使用前缀 P1 和 P2,他可以证实如何找到 S1 和 S2,使得 H(P1 | S) = H(P2 | S2)。
而这张图使用了相似的方式,在评论中有人提到:
- Generate a gif for each possible digit in the first column
- Append collision blocks to each gif to make a 16 way collision
- Repeat for each digit
- Hash the final product
- Replace each digit with the correct digit
若是想本身构造要给碰撞程序,能够参考这个连接:Create your own MD5 collisions。
欢迎关注个人公众号,关注前端文章: