创build自己的MD5碰撞

我正在做关于MD5碰撞的演示,我想让人们知道碰撞的可能性有多大。

有两块文本散列到同一个东西,并解释在碰撞之前需要多less个[a-zA-Z]组合。

明显的答案是哈希每个可能的组合,直到命中两个哈希相同。 那么你怎么去编码呢。 作为一个快速的实验,我尝试了哈希[AZ]的5列的每一个组合,将其存储在.net哈希表中,并捕获冲突exception。 有两个问题 – 哈希表最终超时,我很确定我将需要很多字符。

显然这个数据结构太大,无法在内存中处理,所以现在我必须得到一个数据库。 这听起来像是一个很好的项目来testing蔚蓝 – 有点像这些家伙 。

任何人都可以指出我这样做的有效方法吗?

以下两个不同的128字节序列散列为相同:

MD5 Hash :79054025255fb1a26e4bc422aef54eb4

以下区别突出显示(粗体)。 对不起,这是很难看到。

 d131dd02c5e6eec4693d9a0698aff95c 2fcab5 8 712467eab4004583eb8fb7f89 
 55ad340609f4b30283e4888325 7 1415a 085125e8f7cdc99fd91dbd f 280373c5b 
 d8823e3156348f5bae6dacd436c919c6 dd53e2 b 487da03fd02396306d248cda0 
 e99f33420f577ee8ce54b67080 a 80d1e c69821bcb6a8839396f965 2 b6ff72a70

 d131dd02c5e6eec4693d9a0698aff95c 2fcab5 0 712467eab4004583eb8fb7f89 
 55ad340609f4b30283e4888325 f 1415a 085125e8f7cdc99fd91dbd 7 280373c5b 
 d8823e3156348f5bae6dacd436c919c6 dd53e2 3 487da03fd02396306d248cda0 
 e99f33420f577ee8ce54b67080 2 80d1e c69821bcb6a8839396f965 a b6ff72a70

collision / block1的可视化(Source: Links.Org )

替代文字

collision / block2的可视化(Source: Links.Org )

替代文字

如果你正在谈论一个简单的碰撞是多么可能的 – 一个没有刻意的尝试导致一个 – 那么你会感到失望:你需要平均产生2 ^ 64个明文,然后才能期望看到一个碰撞,而这远远超过你在一个合理的(或者甚至是不合理的)时间里所能做到的。

如果你想展示故意制造碰撞的困难,其他答案已经certificate了这一点。 然而,要求string完全是文本的额外约束使得即使这些方法在很大程度上也是不切实际的。

我会看看Hashcash 。 使用有效的散列algorithm,如md5,计算碰撞的时间与位数的指数关系。 Hashcash做的是计算部分冲突。 也就是说,匹配哈希的低16位。 要得到较低的16位匹配,必须平均尝试散列2 ^ 15个不同的组合。 如果知道发生16,24或32位冲突需要多长时间,则可以轻松计算出更多位数的时间。

只用文本文件AFAIK很难做到这一点。 你可以得到一些碰撞,但是从[a-zA-Z]开始也是不容易的。

另一方面,如果你只是想要两个具有相同散列的“有意义”的文件,你可以用PostScript这样的东西来做:有不同的二进制blob导致冲突,并使用条件expression式来显示不同的输出因此。

看到这个问题 (H2部分)和解决scheme 。 例如, 这个PS文件和这个 文件具有相同的MD5sum,但它们都是格式正确的PostScript文件,当你打开它们时,它们的文本完全不同。

这种哈希的重点在于碰撞极不可能。 你不会偶尔产生一个 – 你的机器几乎肯定会在你成功之前死亡。 如果可以合理地产生冲突,使用哈希的整个点将消失!