N久以前,王小云同学找到了能构造出能导致MD5碰撞的算法,也就是不同的明文,所得的md5值是一样的。貌似很难,原理上是这样的,特别是对我这样没有搞过密码学的同学来说。但是看看这里吧,其实体验一下很容易。
这些同学基于王小云同学的理论,加以改动,有了如下我可以体验的成果。
这里给出了一个快速生成碰撞的程序,叫MD5 Collision Generator。啊,这个生成器根据所谓的构造前缀碰撞法可以生成两个不同的文件,而这两文件的md5 sum却是一样的。
MD5 Collision Generator(win32 .exe)
MD5 Collision Generator(source)
需要boost库,我没有,就没有编译了。直接wine。
$ wine cmd5.exe MD5 collision generator v1.5 by Marc Stevens (http://www.win.tue.nl/hashclash/) Allowed options: -h [ --help ] Show options. -q [ --quiet ] Be less verbose. -i [ --ihv ] arg Use specified initial value. Default is MD5 initial value. -p [ --prefixfile ] arg Calculate initial value using given prefixfile. Also copies data to output files. -o [ --out ] arg Set output filenames. This must be the last option and exactly 2 filenames must be specified. Default: -o msg1.bin msg2.bin $ wine cmd5.exe -p a.txt -o 1.out 2.out MD5 collision generator v1.5 by Marc Stevens (http://www.win.tue.nl/hashclash/) Using output filenames: '1.out' and '2.out' Using prefixfile: 'a.txt' Using initial value: 1ff51986786fcd387467c376774e77b8 Generating first block: ... Generating second block: S00.................... Running time: 4.409 s $ md5sum 1.out 6b6a97ba4b60721f6d3a7cba989bdb3f 1.out $ md5sum 2.out 6b6a97ba4b60721f6d3a7cba989bdb3f 2.out $ diff 2.out diff: 在`2.out'后缺失操作数 diff: 用 `diff --help' 来获得更多的信息 $ diff 1.out 2.out 二进制文件1.out和2.out有差异
唔,看吧。1.out 和 2.out的md5 sum都是6b6a97ba4b60721f6d3a7cba989bdb3f,但是它们是不一样的文件。a.txt是前缀文件,具体是起什么作用的我就不知道咯,但是我知道a.txt里面的内容会被copy到两个输出文件里面去。
这些同学还构造出了两个可执行文件(http://www.win.tue.nl/hashclash/SoftIntCodeSign/),两个文件执行的动作完全不一样,但是通过这个构造前缀碰撞法,就可以通过添加一段附加数据使最后它们的md5校验一样。方法具体是什么嘛…他们给了论文,可以看看(估计看不懂)。
受此影响的同学:
- 使用md5作为文件/通讯安全校验的同学(因为改动可以被伪造了,赶紧换别的算法)
不受此影响的同学:
- 使用md5作为口令加密的同学(因为从数学上证明md5是不可逆的,当然不是我证明的)

