在MD5转换中是否存在一个固定点,即是否存在x使得md5(x) == x
?
由于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位)。
我的暴力尝试找到了12个前缀和12个后缀匹配。
前缀12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762
后缀12: df12c1434cec7850a7900ce027af4b78 -> b2f6053087022898fe920ce027af4b78
博客文章: https://plus.google.com/103541237243849171137/posts/SRxXrTMdrFN
md5sum
Linux 命令,但得到了不同的结果。 - ThunderPhoenix由于哈希是不可逆的,要破解它将会非常困难。唯一的方法是计算哈希函数在每一个可能的输出值上的结果,并查看是否与给定的哈希值匹配。
具体来说,MD5哈希值由16个字节组成,这意味着有2^(16*8) = 3.4 * 10 ^ 38 种组合方式。如果在16字节值上计算哈希值需要1毫秒,那么需要10790283070806014188970529154.99年才能计算出所有这些哈希值。
虽然我没有一个肯定的答案,但我的猜测是“是”,而且可能有2^32个这样的固定点(对于位串解释,而不是字符串解释)。我正在积极地研究这个问题,因为它似乎是一个很棒、简洁的难题,需要很多创造力(如果你不想马上采用暴力搜索的话)。
我的方法是:把它当作一个数学问题。我们有128个布尔变量和128个方程式,描述输出与输入(应该匹配)之间的关系。通过插入算法和填充位表中的所有常量,我的希望是这些方程可以被大大简化,从而得到一个针对128位输入情况优化的算法。这些简化后的方程可以在一些好的语言中编程以进行高效的搜索,或者再次抽象处理,逐位分配,注意矛盾。你只需要看到几位输出就知道它不匹配输入了!
可能是可以找到的,但需要的时间比我们现在有的时间长,或者需要妥协MD5。
有两种解释方式,如果可以选择其中任意一种,则找到固定点的概率增加至81.5%。
md5(x) == x
,因为md5(x)
本身就是128位长。因此,如果在128位域上的md5算法中存在一个固定点,那么无论输入大小如何,都会在md5中存在一个固定点。 - the paul1-(1/e)*(1/e) ≈ 86.47%
。 - Dušan