一、基本介绍
MD5加密算法,其全称是Message-Digest Algorithm 5,通常被称为信息摘要算法,所谓的信息摘要就是把明文内容按一定规则生成一段哈希(hash)值,即得到这段明文内容的信息摘要。利用MD5可以基于任意长度的明文字符串生成128位的哈希值,结果唯一且不可逆,因此MD5经常被用于防止信息被篡改、数字签名、以及对明文进行加密等场景。
二、加密原理
MD5算法加密的过程分为三步:处理原文,设置初始值,加密运算。
2.1、处理原文
由于MD5是将信息以512位为一组分组来进行处理,所以首先要计算原文长度(bit)对512的求余结果,如果不等于448,就需要对原文进行填充,使其求余结果等于448。
具体填充方法是第一位为1,余下统一填充为0,填充完后,信息的长度就为N512+448(bit)。之后用剩余的64位(512-448=64位)存储填充前信息的长度,这样处理后的信息长度就是N512+448+64,即512*(N+1)。
其实从这一步来看,好像大部分加密算法都涉及到对转为二进制后的信息的按位填充,以使其满足后续分组处理信息加密的需求。
2.2、设置初始值
MD5的哈希结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。官方定义的A、B、C、D的标准初始值如下(16进制):
A: 01234567
B: 89abcdef
C: fedcba98
D: 76543210
2.3、加密运算
在具体加密过程中,会进行N次循环,N就是在第一步处理原文后的分组个数,假设处理后原文长度为1024,那N就是2,即总共循环两次。
在每次循环内,会将每组的512位信息细分成16个小组,每组长度为32位。进行四轮总计64次运算,每一轮即每十六次运算都会用同一个函数进行处理。运算过程中会用到一组非线性函数如下,&是与运算,|是或运算,~是非运算,^是异或运算:
F(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))
在每次子循环中F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。
设Mj表示消息的第j个子分组(j的范围:0~15,也就是前面分的16组信息),这里的s,t都是常量,<<<s代表左移s位
FF(a,b,c,d,Mj,s,Ki),表示a=b+((a+F(b,c,d)+Mj+Ki)<<<s)
GG(a,b,c,d,Mj,s,Ki),表示a=b+((a+G(b,c,d)+Mj+Ki)<<<s)
HH(a,b,c,d,Mj,s,Ki),表示a=b+((a+H(b,c,d)+Mj+Ki)<<<s)
II(a,b,c,d,Mj,s,Ki),表示a=b+((a+I(b,c,d)+Mj+Ki)<<<s)
s在四轮循环中的值如下:
s[ 0..15] := {
7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22 }
s[16..31] := {
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20 }
s[32..47] := {
4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4