MD5转换中是否存在固定点,即是否存在x使得md5(x) == x
?
答案 0 :(得分:132)
由于MD5和为128位长,因此任何固定点也必须为128位长。假设任何字符串的MD5总和均匀分布在所有可能的总和上,那么任何给定的128位字符串是固定点的概率是 1 / 2 128 子>
因此,没有128位字符串是固定点的概率是(1 - 1 / 2 128 < / sub>) 2 128 ,因此存在固定点的概率为1 - (1 - 1 / <子> 2 128 子>) 2 128
由于n的极限变为无穷大(1 - 1 / n ) n 是< sup> 1 / e ,2 128 肯定是一个非常大的数字,这个概率几乎正好为1 - 1 / e ≈63.21%。
当然,实际上没有任何随机性 - 要么有固定点要么没有固定点。但是,我们可以63.21%确信存在固定点。 (另请注意,此数字不取决于键空间的大小 - 如果MD5总和为32位或1024位,则答案将相同,只要它大于约4或5位)。
答案 1 :(得分:12)
我的暴力尝试找到了12个前缀和12个后缀匹配。
前缀12: 54db1011d76dc70a0a9df3ff3e0b390f - &gt; 54db1011d76d137956603122ad86d762
后缀12: df12c1434cec7850a7900ce027af4b78 - &gt; b2f6053087022898fe920ce027af4b78
博文: https://plus.google.com/103541237243849171137/posts/SRxXrTMdrFN
答案 2 :(得分:11)
由于散列是不可逆转的,因此很难弄明白。解决这个问题的唯一方法是计算散列的每个可能输出的散列,看看你是否想出了匹配。
详细说明,MD5哈希中有16个字节。这意味着有2 ^(16 * 8)= 3.4 * 10 ^ 38种组合。如果计算16字节值的散列需要1毫秒,那么计算所有这些散列需要10790283070806014188970529154.99年。
答案 3 :(得分:0)
虽然我没有是/否答案,但我的猜测是“是”,而且可能有2 ^ 32个这样的固定点(对于位串解释,而不是字符串解释)。我正在积极研究这个问题,因为它看起来像一个令人敬畏,简洁的谜题,需要很多创造力(如果你不立即接受蛮力搜索)。
我的方法如下:将其视为数学问题。我们有128个布尔变量,128个方程用输入来描述输出(应该匹配)。通过插入算法中的表中的所有常量和填充位,我希望可以大大简化方程式,以产生针对128位输入情况优化的算法。然后可以用一些好的语言对这些简化的方程进行编程,以便进行有效的搜索,或者再次抽象地处理,一次分配单个位,注意对比。您只需要看到输出的几位就知道它与输入不匹配!
答案 4 :(得分:-1)
可能,但发现它需要的时间比我们要长或者会影响MD5。
答案 5 :(得分:-9)
有两种解释,如果允许一种解释,找到一个固定点的概率增加到81.5%。
答案 6 :(得分:-22)
严格来说,由于MD5的输入长度为512位,输出为128位,我认为根据定义,这是不可能的。