MD5碰撞原理简单介绍及其实现
MD5是什么
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16[字节]的散列值(hash value)),用于确保信息传输完整一致。MD5由美国密码学家[罗纳德·李维斯特](Ronald Linn Rivest)设计,于1992年公开,用以取代[MD4]算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如[SHA-2]。2004年,证实MD5算法无法防止碰撞,因此不适用于安全性认证,如[SSL]公开密钥认证或是[数字签名]等用途。
MD5的原理
直接看百度上的图就一目了然了
MD5的“破解”
2004年,我国中科院院士王小云证实md5算法无法防止碰撞,因此,不适用于安全性认证。在2005年,王小云院士提出了md5哈希碰撞,公式如下
f(f(s, M), M') = f(f(s, N), N')
所谓的“破解”其实用“碰撞”一词语更为妥当,因为她的研究成果表明了给定消息 M1
,能够计算获取 M2
,使得 M2
产生的散列值与 M1
产生的散列值相同,即:
MD5(M1)=MD5(M2)
于是乎MD5不满足抗碰撞性,于是不再是安全的散列算法
但是
直到现在,给出一个MD5散列值,然后通过计算还原出原文来是不可能的的。也就是说通过一个MD5后的密文,回推明文目前还是没有方法的。
这里给出相关论文:http://www.paper.edu.cn/scholar/paper/wangxiaoyun-2
碰撞实现
这里介绍一个MD5碰撞的工具:fastcoll,fastcoll 可以用来对给定的前缀快速生成md5碰撞 (也就是说,生成两个不同的文件,每个文件都是在给定的内容后面附加一段东西生成的)
给出其主页:https://www.win.tue.nl/hash*/
相关文章:https://homepages.cwi.nl/~stevens/papers/eprint-2006-104-S.pdf
下面给出示例,我们创建一个文本文档在里面写入123456789
将其拖入fastcoll后得到两个文件
经过检验可以发现,第一个文档和第二个文档字符串不同,但最终MD5值相同
其他
之前打比赛的时候学习过一点技巧,可以通过python来爆破md5中的几位,下面给出一份示例python代码
1. import hashlib
2. for i in range(0,9999999999999999):
3. md5=hashlib.md5(str(i).encode("utf-8")).hexdigest()
4. if md5[0:5]=="66666": #md5后前五位是66666
5. print(i)
6. print("no result")
该脚本实现了纯数字通过MD5加密后相应位数是特定字符的功能
最后
thanks for reading