md5的一个碰撞例子

md5作为计算机安全领域广泛使用的一种散列函数,被用于检测信息是否完整一致。

然而在2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议(Crypto’2004)上来自山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。她公布了MD系列算法的破解结果。

各位好奇的可以在网上搜索王小云老师的那篇论文,反正我是看不懂的。不过倒是找到了一个md5碰撞的例子,于是就拿来分享一下。

比如有两个文件test1、test2,文件的十六进制内容分别如下:

% xxd test1            
0000000: 0e30 6561 559a a787 d00b c6f7 0bbd fe34  .0eaU..........4
0000010: 04cf 0365 9e70 4f85 34c0 0ffb 659c 4c87  ...e.pO.4...e.L.
0000020: 40cc 942f eb2d a115 a3f4 155c bb86 0749  @../.-.....\...I
0000030: 7386 656d 7d1f 34a4 2059 d78f 5a8d d1ef  s.em}.4. Y..Z...

% xxd test2
0000000: 0e30 6561 559a a787 d00b c6f7 0bbd fe34  .0eaU..........4
0000010: 04cf 0365 9e74 4f85 34c0 0ffb 659c 4c87  ...e.tO.4...e.L.
0000020: 40cc 942f eb2d a115 a3f4 15dc bb86 0749  @../.-.........I
0000030: 7386 656d 7d1f 34a4 2059 d78f 5a8d d1ef  s.em}.4. Y..Z...

如果想得到文件的原始内容,可以把上面的输出信息保存为一个文本文件(如test.txt),然后再执行命令 xxd -r test1.txt > test 即可。
从上面可以看到这两个文件的内容明显是不一样的,那么现在就来计算一下这两个文件的md5值吧。

% md5sum test1
cee9a457e790cf20d4bdaa6d69f01e41  test1
% md5sum test2
cee9a457e790cf20d4bdaa6d69f01e41  test2

从计算结果可以看到,虽然这两个文件内容不同,但是它们的md5值却是相同的。这个就是所谓的碰撞。