Hash 是否存在MD5(x)=x的MD5固定点?

Hash 是否存在MD5(x)=x的MD5固定点?,hash,md5,Hash,Md5,MD5转换中是否存在一个固定点,即是否存在x,使得MD5(x)==x?可能,但发现它需要比我们现有的时间更长的时间,或者需要折衷MD5。由于散列是不可逆的,这将很难理解。解决这个问题的唯一方法是计算散列的每个可能输出的散列,看看是否找到匹配项 更详细地说,MD5散列中有16个字节。这意味着有2^(16*8)=3.4*10^38个组合。如果计算16字节值上的哈希值需要1毫秒,那么计算所有这些哈希值需要10790283070806014188970529154.99年。由于MD5和是128位长的,任

MD5转换中是否存在一个固定点,即是否存在x,使得
MD5(x)==x

可能,但发现它需要比我们现有的时间更长的时间,或者需要折衷MD5。

由于散列是不可逆的,这将很难理解。解决这个问题的唯一方法是计算散列的每个可能输出的散列,看看是否找到匹配项


更详细地说,MD5散列中有16个字节。这意味着有2^(16*8)=3.4*10^38个组合。如果计算16字节值上的哈希值需要1毫秒,那么计算所有这些哈希值需要10790283070806014188970529154.99年。

由于MD5和是128位长的,任何固定点也必须是128位长。假设任何字符串的MD5和均匀分布在所有可能的和上,则任何给定的128位字符串为固定点的概率为1/2128

因此,没有128位字符串是固定点的概率为(1− 1/2128)2128,因此存在不动点的概率为1− (1 − 1/2128)2128

因为n的极限是无穷大的(1)− 1/n)n是1/e,2128肯定是一个非常大的数字,这个概率几乎正好是1− 1/e≈ 63.21%


当然,实际上并不涉及随机性——要么有固定点,要么没有。但是,我们有63.21%的信心认为存在一个固定点。(另外,请注意,这个数字并不取决于键空间的大小——如果MD5和是32位或1024位,那么答案是相同的,只要它大于大约4位或5位)。

严格来说,因为MD5的输入长度为512位,输出长度为128位,从定义上讲,这是不可能的。

有两种解释,如果允许其中一种选择,找到固定点的概率将增加到81.5%

  • 解释1:MD5二进制输出的MD5是否与其输入匹配
  • 解释2:MD5输出的MD5是否与输入匹配

虽然我没有是/否的答案,但我的猜测是“是”,而且可能有2^32个这样的固定点(用于位字符串解释,而不是字符串解释)。我正在积极研究这个问题,因为它看起来像是一个很棒的、简洁的谜题,需要大量的创造力(如果你不满足于暴力搜索的话)


我的方法如下:把它当作一道数学题。我们有128个布尔变量,128个方程描述输入的输出(应该匹配)。通过插入算法中表格中的所有常量和填充位,我希望可以大大简化方程,从而生成一个针对128位输入情况进行优化的算法。然后,这些简化的方程可以用一些漂亮的语言进行编程,以便进行有效的搜索,或者再次进行抽象处理,一次分配一个位,注意矛盾。您只需要看到输出的一些位,就知道它与输入不匹配

我的暴力尝试发现12个前缀和12个后缀匹配

前缀12: 54db1011d76dc70a0a9df3ff3e0b390f->54DB1011D76D13795660312AD86D762

后缀12: df12c1434cec7850a7900ce027af4b78->b2f6053087022898fe920ce027af4b78

博文:

它还没有坏。他们所能做的就是,在合理的时间内生成两个字符串,它们等同于相同的散列。仍然很难生成一个等同于特定哈希的字符串。我不确定找到一个字符串将如何危害md5,就像我告诉你md5(“敏捷的棕色狐狸跳过懒惰的狗”)会危害算法一样=9e107d9d372bb6826bd81d3542a419d6A固定点可能会在数学上产生一些影响,从而导致更全面地违反MD5。我不相信格洛梅克真的能证明“可能”;我会毫不含糊地接受“可能”。你真的能假设任何字符串的MD5和均匀分布在所有可能的和上吗?是的。大数和模形成了一个大致随机的分布。如果他们没有,你会有不断的碰撞。md5的本质迫使其输出随机分布。我使用您的答案作为这个答案的基础:这里,有一个金徽章。除了md5是确定性的,而不是随机的。哪个md5转换?数学的(从任何位字符串到128位)还是从任何bytestring到32个字符的十六进制字符串(实际的)?这两个问题的答案并不明显是相同的……嗯,它们是相同的答案,对吗?我们知道不存在
md5(x)=x的非128位长的x,因为
md5(x)
是128位长的。因此,对于任意大小的输入,md5中有一个固定点,当且仅当md5中128位域上有一个固定点时。我认为它们不是相同的答案,因为对于实际的32个字符的十六进制字符串,无论您是用大写字母[a-F]还是小写字母[a-F]表示十六进制数字,都是任意选择。这两种表示都对应于相同的128位数字,但当作为MD5的输入提供时,它们将产生不同的哈希。因此,在任一表示中存在不动点的概率实际上是
1-(1/e)*(1/e)≈ 86.47%
让我们搜索一下;)-否,存在1字节字符串的MD5。输入可以是任意大小。如果输入小于512字节,则对其进行填充,但小输入仍然可以接受。来自Wikipedia:“MD5将可变长度的消息处理为128位的固定长度输出。输入消息被分成512位的块(16个32位小整数);消息被填充,以便其长度可被512整除。”因此,您假设