Algorithm 创建自己的MD5冲突

Algorithm 创建自己的MD5冲突,algorithm,language-agnostic,hash,Algorithm,Language Agnostic,Hash,我正在做一个关于MD5碰撞的演示,我想让大家知道碰撞的可能性有多大 最好有两个散列到同一事物的文本块,并解释在碰撞之前需要多少个[a-zA-Z]组合 显而易见的答案是对所有可能的组合进行散列,直到找到两个相同的散列。那么,您将如何对其进行编码呢。作为一个快速的实验,我尝试对[a-Z]的5列的每一个组合进行散列,将其存储在.net哈希表中并捕获冲突异常。这有两个问题-哈希表最终会超时,我很确定我需要更多的字符 很明显,这个数据结构太大,无法在内存中处理,所以现在我必须使用一个数据库。听起来也是一个

我正在做一个关于MD5碰撞的演示,我想让大家知道碰撞的可能性有多大

最好有两个散列到同一事物的文本块,并解释在碰撞之前需要多少个[a-zA-Z]组合

显而易见的答案是对所有可能的组合进行散列,直到找到两个相同的散列。那么,您将如何对其进行编码呢。作为一个快速的实验,我尝试对[a-Z]的5列的每一个组合进行散列,将其存储在.net哈希表中并捕获冲突异常。这有两个问题-哈希表最终会超时,我很确定我需要更多的字符

很明显,这个数据结构太大,无法在内存中处理,所以现在我必须使用一个数据库。听起来也是一个测试azure的好项目——有点像


有人能告诉我一个有效的方法吗?

以下两个不同的128字节序列散列到同一个:

MD5哈希值:790540225255FB1A26E4BC422AEF54EB4

以下差异突出显示(粗体)。对不起,有点难看

d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70 d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b D8823E31563448F5BAE6DACD436C919C6 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70 及

d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b D8823E31563448F5BAE6DACD436C919C6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70 碰撞/块1的可视化(来源:)

碰撞/块2的可视化(来源:)


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

如果您谈论的是直接碰撞的可能性有多大-没有故意尝试造成碰撞-那么您会感到失望:您需要平均生成2^64个明文,然后才能预期看到碰撞,这远远超过了你在合理的时间内(或者实际上,甚至是不合理的时间内)所能做到的


如果你想证明故意制造碰撞的难度,其他答案已经证明了这一点。要求字符串完全是文本的额外限制使得这些方法在很大程度上也不切实际。

这种散列的全部要点是冲突极不可能发生。你不会偶然产生一个——在你成功之前,你的机器几乎肯定会因年老而死亡。如果您能够合理地生成冲突,那么使用哈希的全部意义就会消失

仅用文本文件是很难做到的。你可以得到一些碰撞,但让它们也来自[a-zA-Z]并不容易(目前)

另一方面,如果您只需要两个具有相同哈希的“有意义”的文件,可以使用PostScript之类的方法来实现:使用不同的二进制blob导致冲突,并使用条件表达式相应地显示不同的输出


参见例如(H2部分)和。例如,和具有相同的MD5sum,但它们都是格式良好的PostScript文件,在打开它们时具有完全不同的文本。

由于生日悖论,这是不正确的:。特别是,请看否-这就是为什么我说2^64,而不是2^128。生日“悖论”预测了2^(numbits/2)后的碰撞(平均)。MD5碰撞:,请注意,我说的是偶然。足够公平了——当你说“偶然”时,你指的是“暴力”?所以我的问题其实是要求更有效的东西,而不是野蛮的强迫它。或者在azure这样的服务器场上运行蛮力组合。他想给人们一个印象,让人们知道他们的可能性有多大——因此,如果你想称之为偶然,或者蛮力,这是正确的衡量标准。测试这个的实际代码(在,)。在JavaScript中测试这个的实际代码:有一个更好的示例!它有两个完全不同的图像,基本上是一个冲突:@Iceland\u jack Python链接无法访问!查看有关哈希函数隧道的信息。请参阅此处:它有指向某些程序的链接,例如:请将其中一个响应标记为您问题的答案?:)你是说哈什冲突吗? d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70