在遇到MD5哈希冲突之前,我必须计数多高?

在遇到MD5哈希冲突之前,我必须计数多高?,md5,Md5,不管我为什么这么做,这主要是理论上的 如果我是整数的MD5散列字符串表示,那么在两个散列发生冲突之前,我必须计数多高?显然,一个可以(或者类似的问题,无论如何)。我还没有读过,但史蒂文斯论文中的某些内容可能会对你有所帮助(它显然是从维基百科的文章链接而来的)。在一个完美的世界里,到1+2^128。但我怀疑md5是否完美,我不能给你一个数字,但保证是这个问题(在一般情况下)被称为 一般情况下的碰撞概率可以很容易地计算出来。然而,在您的特定情况下,您必须实际计算(并存储!)每个MD5 编辑@Scot

不管我为什么这么做,这主要是理论上的


如果我是整数的MD5散列字符串表示,那么在两个散列发生冲突之前,我必须计数多高?

显然,一个可以(或者类似的问题,无论如何)。我还没有读过,但史蒂文斯论文中的某些内容可能会对你有所帮助(它显然是从维基百科的文章链接而来的)。

在一个完美的世界里,到
1+2^128
。但我怀疑md5是否完美,我不能给你一个数字,但保证是
这个问题(在一般情况下)被称为

一般情况下的碰撞概率可以很容易地计算出来。然而,在您的特定情况下,您必须实际计算(并存储!)每个MD5

编辑@Scott:不太可能。鸽子洞原理(只是生日问题的一个特例)会说,如果有2^128个可能的MD5值,那么在1+2^128次尝试之后,我们肯定会发生冲突。生日悖论说,碰撞概率将大于0.5,约为2^70 MD5值


有了这些存储需求评估,您就可以决定这个问题是否值得。对我来说,它不是。

这里有一个科学的方法来估算你必须数到多高

制作MD5散列,将其缩减为4位。计算(确保你计算到100次碰撞,这样你就得到了一个好的平均值)

然后在8位进行相同的操作(同样,等待多次碰撞,以便计算平均值)

一次又一次地这样做,直到你得到4,8,12,16位的平均值,然后看看你是否能找到一个趋势。按照这一趋势,最高可达128位


您可能希望对所有128位进行异或运算,以生成较短的版本。选择第一部分或最后一部分可能不是最好的测试。

如果从0到1+2^128计算,肯定会发生冲突。我想我真正想问的是,是否有人真的尝试过计算并存储“0”、“1”、“2”等散列,直到发生冲突,或者放弃了某个已知的(高)散列没有冲突后的数字。我相信人们这样做是为了好玩。问题是存储所有结果所需的数据来测试它是不可行的,需要5000000000000000000000000千兆字节(因此从我的链接中删除astrix,只需复制并粘贴它。*+2^128+in+Gigabytes)@Scott:只有在开始比较之前生成并存储所有MD5哈希值。如果从第一个散列开始扫描冲突,然后是第二个散列,那么您的约束就变成了处理器时间。或者,可以更有效地将源数据存储在二叉树中,该二叉树表示结果哈希中的位。@Brianary:这一点很好,但它仍然需要大量的空间。假设您在第一个.1%的键空间中找到了冲突,并假设二叉树需要原始大小的.1%来存储,即大约507060240000000000000000 GBtest@Scott:同意。您必须一次只关注树的一小部分,在生成树时丢弃其余部分。但这没关系,因为您可能希望为多台机器划分任务。不,不是这样。这是一个例子