MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。上述说明来自知乎。
是否破解:王小云院士已经破解了并获得国际认可
运用场景
1.密码保护比如登录时候选择的 “记住密码”
2.文件完整性校验
3.数字签名
4.云盘秒传
MD5算法和SHA-1算法基本一致(感兴趣的小伙伴也可以看我关于SHA-1的笔记),其主要差异在于以下两点:
填充数据:SHA-1使用大端序,MD5使用小端序
什么是大端序和小端序?
举例:假设给我一组数据 8 9 10 11
大端序排列:8 9 10 11
小端序排列:11 10 9 8
摘要长度:SHA-1输出40个十六进制数(160位),MD5输出32个十六进制数(128位)
是否扩展:SHA-1需要扩展进行80轮取值,MD5通过对16进行取模反复利用原本的一组64位数据(16个四字节)
加密流程如下(512位(64字节)数据补位不再讲述):
每组根据不同情况选择合适的F函数、M[g]、K[i]、S[i]作为输入来执行:
a=((a+F+K[i]+M[g])<<S[i])+b
四个初始参数(固定的)
- A=0x01234567
- B=0x89ABCDEF
- C=0xFEDCBA98
- D=0x76543210
非线性函数F的取值和M[g]的取值
- 当0<i<=15时:F=(b & c) | ((~b) & d)
- M[g]为小端序取出输入的第 i 个四字节数据
- 当16<i<=31时:F=(d & b) | (d & (~c))
- M[g]为小端序取出输入的第 (5*i+1)%16 个四字节数据
- 当32i<=47时:F=b ^ c ^ d
- M[g]为小端序取出输入的第(3*i+1)%16 个四字节数据
- 当48<i<=63时:F=c ^ (b | (~d))
- M[g]为小端序取出输入的第(7*i+1)%16 个四字节数据
其中:& 代表与操作, | 代表或操作, ~ 代表非操作, ^ 代表异或操作
常量K[i]
位移值S[i]
作图不易,转载请标注,学海无涯,若有错误,请大家不吝赐教。