MD5
加密
MD5是一种哈希算法,任意长度的输入经过处理后输出为128位的信息,且尽量使结果不冲突和信息不可逆。MD5以512位为一个分组处理输入,每个分组分成16个32位的子分组,经过处理后,输出四个32位分组,这四个32位分组级联后生成一个128位的MD5值
MD5的特点
单向散列算法:将一种任意长度的消息数据压缩到某一固定长度,该过程是不可逆的。
MD5 Message Digest Algorithm 是对任意长度的消息进行运算,产生一个128位的消息摘要。
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
在内存中是小端序存储
将原始数据每512bits为一个分组 (这就是前面要求填充到512整数倍的原因),对每组分别进行处理
操作过程
数据末尾填充0x80
计算原始数据的长度
用零填充直到数据的字节数是64的倍数为止
把数据进行分组一组为64(512位)个字节 进行计算最终获得一个16个字节的MD5码
计算过程
1.进行组一数据的计算
定义临时变量并赋值
a = A; b = B; c = C; d = D // 1 2 3 4
2.计算a的值 //4 10 2 3
a = (a + F + K[i] + M[g]) << s[i]) + b;
3.交换数据
b = a
c = b
d = c
a = d
循环2.3两个步骤64次
4.计算
A = A + a;B = B + b;C = C + c;D = D + d;
5.跟新1.中a,b,c,d计算组二数据
当完成最后一组数据的计算获得 A;B;C;D以小端序组合获得最终16个字节就是MD5
如:A1A2A3A4 B1B2B3B4 C1C2C3C4 D1D2D3D4
A4A3A2A1B4B3B2B1C4C3C2C1D4D3D2D1
共循环64次
F的计算
0-15
F = (b&c)|((b)&d)d)&c)
16-31
F = (d&b)|((
32-47
F = b^c^d
48-63
F = c^(b|(~d))
K[i]的计算
这是一个64个常量组成的数组在循环过程中依次获取
S[i]的计算
这是一个64(每组都乘4)个常量组成的数组在循环过程中依次获取
M[g]的计算
0-15
从原始数据的第i个4个字节(小端序)
39 31 31 4d 61 6f 48 61 69 80
第一次使用
4d 31 31 39
第二次使用
61 48 6f 41
16-31
从原始数据的第(5i+1)%16个4个字节(小端序)
32-47
从原始数据的第(3i+5)%16个4个字节(小端序)
48-63
从原始数据的第(7*i)%16个4个字节(小端序)