MD5:全称Message Digest Algorithm MD5(消息摘要算法5)
每个文件的MD5值都是不同的,而对于同一个文件,只要文件发生变化,MD5值就会发生变化,即输入不同,则MD5值不同。
与base64加密不同,MD5加密的方法是不可逆的,相比之下,也就更加安全。
MD5加密的原理:
1、填充数据:
无论要加密的数据多长,最后输出的MD5值都是128位固定长度的值,为了保证这一特性,先要保证数据的长度,对于不满足要求的数据进行填充:
在要加密的数据后面填充一个1和n个0,直到满足要加密数据的位长对512求余的结果为448。
2、补充位长数据:
填充数据长度后,在这个已经确保位长的结果后附加一个64位的二进制,记录填充前数据的长度(即数据的原始长度),当二进制标识的填充前数据的长度超过64位,取最低64位进行标记。
经过填充和数据长度标识的过程,得到了一个长度刚好为512的整数倍的数据。
3、 加入标准变量和线性函数:
这个变量不是真的变量,而是作为运算数参与到加解密运算中:
标准变量:
A=0x01234567,
B=x89ABCDEF,
C=0xFEDCBA98,
D=0x76543210
线性函数:与或非异或
F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=XYZ
I(X,Y,Z)=Y^(X|(~Z))
4、 循环处理数据:
前面的准备工作做好了,就可以开始加密的运算过程了:
首先,明确一件事情,最开始的时候,我们的填充好的数据长度为N512+448,再在后面补上64位的数据长度信息,到做循环步骤的地方,要处理的数据长度变成了(N+1)512。
我们循环的次数是N+1次,每一次循环都是512字节。
每次循环的512字节,会被分成16*64位的16个小组,做线性函数的运算——四个标准变量因子,其中三个进行线性运算与第四个初始值相加作为第四个变量值,这样子的运算,每个小组在经历与、或、非、异或四个阶段的时候都要循环比较,也就意味着,每一轮16次操作(3+1组合),而每一组要经历4轮(四个线性函数)=64次操作。
循环比较的运算过程结束了,最后得到的结果,就是MD5值了。
简要流程: