要点
- 任意长度的数据经过加密得到的MD5数据长度都是固定的。
- 对原数据进行微小的改动,的到的MD5数据都有很大的区别。
- 得到原数据和其MD5值,要找出一个具有相同MD5值的数据是非常困难的。
应用
- 一致性验证: 为文件提供“数字指纹”,进行文件校验,如果有人对文件进行了修改,这个“指纹”就会发生变化,确保下载到的文件与站点文件是一致的。
- 安全访问认证: 在需要登录验证的系统中,将用户密码经过MD5加密后存储在数据库中,在用户登录时将输入的密码进行加密后与数据库比对。
- 数字签名: 在双方文件传输时,进行数字签名,防止文件被篡改、交易中抵赖的情况发生。
算法过程
一、填充
对字符串进行MD5加密,需要将字符串的处理人手。MD5是以512位进行分组进行处理的,所以需要将字符串长度需要能够整除512位。所以当无法整除的需要进行填充,假设R是余下的位数,则需要填充的情况总的有以下三种:
- R = 0 : 此时需要填充一个512位分组,因为后面还要加入64位来记录填充前字符串长度。
- R < 448 : 此时只需要填充到余数为448位就好,后面的64位用来记录长度。
- R > 448 : 此时除了将这一组填充到512位后,还需要重新增加一组512位,为64位记录长度开辟空间。
填充步骤如下:
- 在信息后面先填充一个1,其余填充0,知道满足长度除以512余数为448位;
- 在结果后面附加64位长度的二进制,记录填充前信息的长度,如果二进制表示的填充前信息长度超过64位,则取低64位。
经过上面两个步骤之后,信息位长恰好是512位的整数倍,方便后面进行数据处理。
二、链接变量
初始的128位值位初始链接变量,这四个参数使用于第一轮运算,以大端字节序来表示。
1 | A = 0x01234567 |
三、四轮循环运算
每一轮循环都是以512位分组进行的,循环的次数即为分组的个数。第一分组需要将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。从第二分组开始的变量为上一分组的运算结果,即A = a,B = b,C = c,D = d。
四个非线性函数:
&是与,|是或,~是非,^是异或。1
2
3
4F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))设Mj表示消息的第j个子分组(从0到15),<<<s表示循环左移s位,常数ti是4294967296*abs( sin(i) )的整数部分,i 取值从1到64,单位是弧度。(4294967296=232),则四种操作为:
1
2
3
4FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)四轮运算
1 | // 第一轮 |
所有这些完成之后,将a、b、c、d分别在原来基础上再加上A、B、C、D。
即a = a + A,b = b + B,c = c + C,d = d + D
然后用下一分组数据继续运行以上算法。
4.输出
最后的输出是a、b、c、d的级联。