目录
一、什么是MD5
MD5信息简要是一种散列算法,可以对任意长度的输入,产生128位的输出,是一种被广泛应用的密码杂凑算法。
二、MD5的功能
输入任意长度的信息,输出128位的散列值(数字密码)
唯一性:不同的输入产生不同的输出
三、抗膨胀性
理论上MD5是不具备抗碰撞性的,因为输入是任意的 , 是无限的 , 但是输出是128位 , 也就是2^128,是有限的。以有限映射无限,必然出现碰撞。但是在实际应用中,我们的输入也是有限的,所以出现碰撞的几率是非常小的。
四、可逆性
MD5是散列哈希,是一种有损强压缩算法,在压缩过程中是会丢失信息,所以是不可逆的。
五、MD5是 加密算法吗?
一部分人认为MD5,是不可逆的,只有加密过程,没有解密过程,不能通过密文还原明文,不属于加密算法。
而另一部分人认为原明文信息经过MD5后生成了密文,已经进行了加密,MD5应该是归于加密算法。
个人观点:MD5用作生成数字码,和BASE64一样,属于是编码算法范畴。
六、MD5用途
1、防止被篡改
比如发送一个电子邮件,我们先生成MD5密文 a , 等对方收到邮件后,根据邮件内容生成密文b , 如果a=b ,则邮件未被篡改。
比如网站提供下载功能,可以预先生成MD5散列,并公布在网站上,客户下载后可以通过验证MD5散列,查看下载的数据是否被更改过。
2、防止明文读取。
比如我们系统里关于用户密码的问题 , 一般是不允许被明文入库的,这样会有丢失风险。常规的做法是MD5(password + salt) 生成密文后入库存档,这样即使数据被泄露 , 也无法通过密文反推用户密码。
3、防止抵赖
比如我做出了某项承诺:“过年给大家发3个月的年终奖” ,并预先生成MD5数字指纹 , 到了年底上,我不能私自将3个月改称1个月,因为MD5输入的微小变化,将引起MD5数字指纹的巨大变化。
七、MD5算法过程
我们可以把MD5算法简要的概述如下:将输入信息分组 , 每组512位 ,而每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
主要过程描述
第一步:填充
如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);
第二步:记录信息长度
用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N512+448+64=(N+1)512位。
第三步:装入标准的幻数(四个整数)
标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是: (A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。
第四步:四轮循环运算
循环的次数是分组的个数(N+1)
1)将每一512字节细分成16个小组,每个小组64位(8个字节)
2)先认识四个线性函数(&是与,|是或,~是非,^是异或)
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))
3)设Mj表示消息的第j个子分组(从0到15),<<
FF(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)
4)四轮运算
第一轮
a=FF(a,b,c,d,M0,7,0xd76aa478)
b=FF(d,a,b,c,M1,12,0xe8c7b756)
c=FF(c,d,a,b,M2,17,0x242070db)
d=FF(b,c,d,a,M3,22,0xc1bdceee)
a=FF(a,b,c,d,M4,7,0xf57c0faf)
b=FF(d,a,b,c,M5,12,0x4787c62a)
c=FF(c,d,a,b,M6,17,0xa8304613)
d=FF(b,c,d,a,M7,22,0xfd469501)
a=FF(a,b,c,d,M8,7,0x698098d8)
b=FF(d,a,b,c,M9,12,0x8b44f7af)
c=FF(c,d,a,b,M10,17,0xffff5bb1)
d=FF(b,c,d,a,M11,22,0x895cd7be)
a=FF(a,b,c,d,M12,7,0x6b901122)
b=FF(d,a,b,c,M13,12,0xfd987193)
c=FF(c,d,a,b,M14,17,0xa679438e)
d=FF(b,c,d,a,M15,22,0x49b40821)
第二轮
a=GG(a,b,c,d,M1,5,0xf61e2562)
b=GG(d,a,b,c,M6,9,0xc040b340)
c=GG(c,d,a,b,M11,14,0x265e5a51)
d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
a=GG(a,b,c,d,M5,5,0x

最低0.47元/天 解锁文章
1290

被折叠的 条评论
为什么被折叠?



