md5算法是信息摘要算法,而不是无损压缩算法,因此不可能从密文推测出原文。
但由于生成的128 位(16 字节)的散列值是有数量范围,而原文是无限的,因此必然会产生碰撞,也就是俗称的破解:
即两个不同的原文生成了同一个md值。
常用破解法:
-
穷举法,耗时较长
-
字典法,将原文和md5值存储到哈希表中,查询快但占用空间大
-
彩虹链表法
时间和空间的均衡,将原文经k次H(x)和R(x)连续运算,得到包含原文在内的2K+1个节点的链表,
取此链表的头尾节点(即原文和最后一次的R(x)运算结果)存储到哈希表,
在进行碰撞时,将密文进行一次R(x)运算,然后从哈希表中查找此结果,如果有则代表原文可能在对应的那个链表中;
如果每次则再进行一次H(x)和R(x)运算,继续查找,直到不超过K次能够找到。哈希链表法的R(x)同样会产生碰撞,因此优化为彩虹链表法,采用多个不同R(x)函数,如R1(x) R2(x)…
这样只会同级的R(x)产生碰撞,降低了整体全部链表的碰撞几率。