目录
一、介绍
二、特点
1、不可逆
2、抗碰撞
三、性质
四、用途
1、防止被篡改
2、防止直接看到明文
3、防止抵赖(数字签名)
五、算法原理
1、数据填充
2、添加消息长度
3、数据处理
(1)4个链接变量
(2)4个非线性函数
(3)4种操作(轮函数)
4、MD5运算
六、破解
七、MD5较MD4所做的改进
属于Hash算法。MD5对输入任意长度的消息产生一个128位(16个字节)的消息摘要。
相同数据的md5值肯定一样,不同数据的md5值不一样。即,不可能从结果逆向推导初始值。不可逆是因为有很多不可逆的算法,会丢失很多原文信息,比如移位。
根据一个输入,找到一个输入得到相同的输出,不可行。抗碰撞并不是无碰撞,因为散列算法会有碰撞。
1、压缩性:任意长度的数据,算出的md5值长度都是固定的(超损压缩)
2、容易修改:从原数据计算出md5值很容易
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的md5值都有很大区别
4、弱抗碰撞:已知原数据和其md5值,想找到一个具有相同的md5值的数据是非常困难的
5、强抗碰撞:想找到两个不同的数据,使他们具有相同的md5值,是非常困难的
(1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。
(2)比如文件下载,为了防止不法分子在安装程序中添加木马,就可以在网站上公布由安装文件得到的MD5输出结果。
(3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5。
现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。
对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。
填充方法:在消息后面以位为单位进行填充,填充第一位为1,其余为0。第一个填充的是0x00(1000 0000),然后就填0x0。(此时消息长度为N*512+448)
在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对 264取模)。在此步骤进行完毕后,最终消息长度就是512的整数倍。(此时消息长度为(N+1)*512 )
首先是四个常数:
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
如果在小端模式中,应该是:
A=0x67452301
B=0xEFCDAB89
C=0x98BADCFE
D=0x10325476
它们被称为链接变量(chaining variable)
F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Y)|(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
&是与,|是或,~是非,^是异或
FF(a,b,c,d,Mi,s,tj)->a=b+((a+F(b,c,d)+Mi+tj)<<
GG(a,b,c,d,Mi,s,tj)->a=b+((a+G(b,c,d)+Mi+tj)<<
HH(a,b,c,d,Mi,s,tj)->a=b+((a+H(b,c,d)+Mi+tj)<<
II(a,b,c,d,Mi,s,tj)->a=b+((a+I(b,c,d)+Mi+tj)<<
●Mi表示消息的第i个子分组(从0到15,共16个)
●<<
●tj是常数。在第j步中,tj是4294967296*(abs(sin(j)))的整数部分,i的单位是弧度(4294967296是2的32次方),也可以用0x100000000UL*abs(sin((double)j))计算。tj是伪随机数,有规律。
●x循环左移s位:(s<
轮函数先取链接变量中的BCD做一次非线性函数运算。再将所得结果依次加上A、消息子分组Mi和一个伪随机常数Ti,再将所得结果循环后移指定位数,然后加上B,最后将新值赋给A。
由类似的64次循环构成,分成4轮,每轮16次。每轮使用FF,GG,HH,II,中的一种操作,一轮中,a,b,c,d的使用顺序轮转,即先执行16次FF,再执行16次GG,再执行16次HH,之后执行16次II。
消息以512位为一分组进行处理,每一个分组进行上述4轮共64次计算后,将A,B,C,D分别加上计算得到的a,b,c,d当作新的A,B,C,D,并将这4个变量赋值给a,b,c,d再进行下一分组的运算。由于填充后的信息长度为(N+1)*512,则共需计算N+1个分组。计算所有的数据分组后,这4个变量为最后的md5值。
王小云的破解是,给定消息M1,能够找到不同的消息M2产生相同的散列值,即产生Hash碰撞。
但是只要密码够复杂,加盐且迭代次数足够多,在存储方面md5依然是较安全的算法。
1、MD4只有3轮,MD5增加到了4轮。
2、MD5比MD4增加了一种逻辑运算。
3、每一轮都使用了一个不同的加法常数Ti。
4、轮函数做了改进,以加快“雪崩效应”。
5、改变了第2轮和第三轮中访问消息子分组的顺序,减小了形式的相似速度,加大了不相似程度。
6、近似优化了每轮的循环左移位移量,以实现更快的“雪崩效应”。