我正在做关于MD5碰撞的演讲,我想让人们知道碰撞的可能性。
最好有两个文本块对同一个东西进行哈希处理,并解释在碰撞之前需要多少[a-zA-Z]组合。
显而易见的答案是散列每个可能的组合,直到击中两个哈希相同。那么你将如何编写这个呢?作为一个快速实验,我尝试散列5列[A-Z]的每个组合,将其存储在.net哈希表中并捕获碰撞异常。这有两个问题 - 哈希表最终超时,我很确定我需要更多的字符。
显然这个数据结构太大而无法在内存中处理,所以现在我必须要涉及一个数据库。同样听起来像是一个测试天蓝色的好项目 - 有点像these guys。
有人能指出我采用高效方式的方向吗?
答案 0 :(得分:49)
以下两个不同的128字节序列散列为相同:
MD5哈希:79054025255fb1a26e4bc422aef54eb4
以下差异突出显示(粗体)。对不起,有点难看。
d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70
和
d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70
碰撞/块1的可视化(来源:Links.Org)
碰撞/块2的可视化(来源:Links.Org)
答案 1 :(得分:3)
如果你在谈论直接碰撞的可能性 - 一个没有刻意尝试造成碰撞 - 那么你会感到失望:你需要平均生成2 ^ 64个明文可以期待看到一次碰撞,这远远超过你能够在一个合理的(或者真的,甚至是不合理的)时间里做的事情。
如果你想展示故意制造碰撞的困难,其他答案已经证明了这一点。然而,要求字符串完全是文本的额外约束使得这些方法在很大程度上是不切实际的。
答案 2 :(得分:3)
仅使用文本文件AFAIK很难做到这一点。你可以得到一些碰撞,但让它们也来自[a-zA-Z]并不容易(还)。
另一方面,如果你只想要两个具有相同散列的“有意义”的文件,你可以使用像PostScript那样的东西:有不同的二进制blob导致碰撞,并使用条件表达式来相应地显示不同的输出。
参见例如this problem(H2部分)和solution。例如,this PS file和this one具有相同的MD5sum,但它们都是格式正确的PostScript文件,当您打开它们时,它们中的文本完全不同。
答案 3 :(得分:2)
我会看看Hashcash。使用有效的散列算法,如md5,计算碰撞的时间与位数呈指数关系。 Hashcash所做的是计算部分碰撞。也就是说,比较哈希的低16位。为了使低16位匹配,人们必须平均尝试散列2 ^ 15种不同的组合。如果您知道引发16,24或32位冲突需要多长时间,那么您可以轻松计算出更多位数的时间。
答案 4 :(得分:-2)
这种哈希的全部意义在于碰撞极不可能。你不会偶然产生一个 - 你的机器几乎肯定会在你成功之前死于老年。如果你可以合理地产生碰撞,那么使用哈希的全部意义就会消失!