美文网首页
MD5 算法简介

MD5 算法简介

作者: 开着保时捷堵你家门口 | 来源:发表于2018-11-08 08:29 被阅读18次

    MD5 的全称是 Message-Digest Algorithm 5,在 90 年代初由 MIT 的计算机科学实验室和 RSA Data Security Inc 发明,经 MD2、MD3 和 MD4 发展而来。

    MD5 将任意长度的“字节串”变换成一个 128bit 的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个 MD5 的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

    MD5 的典型应用是对一段 Message(字节串) 产生 fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt 文件中,并对这个 readme.txt 产生一个 MD5 的值并记录在案,然后你传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算 MD5 时就会发现。如果再有一个第三方的认证机构,用 MD5 还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

    MD5 还广泛用于加密和解密技术上。在很多操作系统中,用户的密码是以 MD5 值(或类似的其它算法)的方式保存的, 用户登录的时候,系统是把用户输入的密码计算成 MD5 值,然后再去和系统中保存的 MD5 值进行比较,而系统并不“知道”用户真正的的密码明文是什么。

    一、MD5 算法

    在一些初始化处理后,MD5 以 512 位分组来处理输入文本,每一分组又划分为 16 个 32 位子分组。算法的输出由四个 32 位分组组成,将它们级联形成一个 128 位散列值。

    首先填充消息使其长度恰好为一个比 512 位的倍数仅小 64 位的数。填充方法是附一个 1 在消息后面,后接所要求的多个 0,然后在其后附上 64 位的消息长度(填充前)。这两步的作用是使消息长度恰好是 512 位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。

    四个32位变量初始化为:

        A=0x01234567

        B=0x89abcdef

        C=0xfedcba98

        D=0x76543210

    它们称为链接变量(chaining variable)

    接着进行算法的主循环,循环的次数是消息中 512 位消息分组的数目。主循环有四轮(MD4 只有三轮),每轮很相拟。将上面四个变量复制到别外的变量中:A 到 a,B 到 b,C 到 c,D 到 d。

    第一轮进行 16 次操作。每次操作对 a,b,c 和 d 中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上 a,b,c 或 d 中之一。最后用该结果取代 a,b,c 或 d 中之一。

    以下是每次操作中用到的四个非线性函数(每轮一个)。

        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))

        (& 是与,| 是或,~ 是非,^是异或)

    这些函数是这样设计的:如果 X、Y 和 Z 的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

    函数 F 是按逐位方式操作:如果 X,那么 Y,否则 Z。

    函数 H 是逐位奇偶操作符。

    设 Mj 表示消息的第 j 个子分组(从 0 到 15),<<< s 表示循环左移 s 位,则四种操作为:

        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)

    这四轮(64 步)是:

    第一轮

        FF(a,b,c,d,M0,7,0xd76aa478)

        FF(d,a,b,c,M1,12,0xe8c7b756)

        FF(c,d,a,b,M2,17,0x242070db)

        FF(b,c,d,a,M3,22,0xc1bdceee)

        FF(a,b,c,d,M4,7,0xf57c0faf)

        FF(d,a,b,c,M5,12,0x4787c62a)

        FF(c,d,a,b,M6,17,0xa8304613)

        FF(b,c,d,a,M7,22,0xfd469501)

        FF(a,b,c,d,M8,7,0x698098d8)

        FF(d,a,b,c,M9,12,0x8b44f7af)

        FF(c,d,a,b,M10,17,0xffff5bb1)

        FF(b,c,d,a,M11,22,0x895cd7be)

        FF(a,b,c,d,M12,7,0x6b901122)

        FF(d,a,b,c,M13,12,0xfd987193)

        FF(c,d,a,b,M14,17,0xa679438e)

        FF(b,c,d,a,M15,22,0x49b40821)

    第二轮

        GG(a,b,c,d,M1,5,0xf61e2562)

        GG(d,a,b,c,M6,9,0xc040b340)

        GG(c,d,a,b,M11,14,0x265e5a51)

        GG(b,c,d,a,M0,20,0xe9b6c7aa)

        GG(a,b,c,d,M5,5,0xd62f105d)

        GG(d,a,b,c,M10,9,0x02441453)

        GG(c,d,a,b,M15,14,0xd8a1e681)

        GG(b,c,d,a,M4,20,0xe7d3fbc8)

        GG(a,b,c,d,M9,5,0x21e1cde6)

        GG(d,a,b,c,M14,9,0xc33707d6)

        GG(c,d,a,b,M3,14,0xf4d50d87)

        GG(b,c,d,a,M8,20,0x455a14ed)

        GG(a,b,c,d,M13,5,0xa9e3e905)

        GG(d,a,b,c,M2,9,0xfcefa3f8)

        GG(c,d,a,b,M7,14,0x676f02d9)

        GG(b,c,d,a,M12,20,0x8d2a4c8a)

    第三轮

        HH(a,b,c,d,M5,4,0xfffa3942)

        HH(d,a,b,c,M8,11,0x8771f681)

        HH(c,d,a,b,M11,16,0x6d9d6122)

        HH(b,c,d,a,M14,23,0xfde5380c)

        HH(a,b,c,d,M1,4,0xa4beea44)

        HH(d,a,b,c,M4,11,0x4bdecfa9)

        HH(c,d,a,b,M7,16,0xf6bb4b60)

        HH(b,c,d,a,M10,23,0xbebfbc70)

        HH(a,b,c,d,M13,4,0x289b7ec6)

        HH(d,a,b,c,M0,11,0xeaa127fa)

        HH(c,d,a,b,M3,16,0xd4ef3085)

        HH(b,c,d,a,M6,23,0x04881d05)

        HH(a,b,c,d,M9,4,0xd9d4d039)

        HH(d,a,b,c,M12,11,0xe6db99e5)

        HH(c,d,a,b,M15,16,0x1fa27cf8)

        HH(b,c,d,a,M2,23,0xc4ac5665)

    第四轮

        II(a,b,c,d,M0,6,0xf4292244)

        II(d,a,b,c,M7,10,0x432aff97)

        II(c,d,a,b,M14,15,0xab9423a7)

        II(b,c,d,a,M5,21,0xfc93a039)

        II(a,b,c,d,M12,6,0x655b59c3)

        II(d,a,b,c,M3,10,0x8f0ccc92)

        II(c,d,a,b,M10,15,0xffeff47d)

        II(b,c,d,a,M1,21,0x85845dd1)

        II(a,b,c,d,M8,6,0x6fa87e4f)

        II(d,a,b,c,M15,10,0xfe2ce6e0)

        II(c,d,a,b,M6,15,0xa3014314)

        II(b,c,d,a,M13,21,0x4e0811a1)

        II(a,b,c,d,M4,6,0xf7537e82)

        II(d,a,b,c,M11,10,0xbd3af235)

        II(c,d,a,b,M2,15,0x2ad7d2bb)

        II(b,c,d,a,M9,21,0xeb86d391)

    常数 ti 可以如下选择:

        在第 I 步中,ti 是 4294967296*abs(sin(i)) 的整数部分,I 的单位是弧度。(2的32次方)

    所有这些完成之后,将 A,B,C,D 分别加上 a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是 A,B,C 和 D 的级联。

    二、MD5 的安全性

    MD5 相对 MD4 所作的改进:

    增加了第四轮

    每一步均有唯一的加法常数

    为减弱第二轮中函数 G 的对称性,从 (X&Y)|(X&Z)|(Y&Z) 变为 (X&Z)|(Y&(~Z))

    第一步加上了上一步的结果,这将引起更快的雪崩效应

    改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似

    近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应,各轮的位移量互不相同

    2004 年 8 月,在国际密码大会上,中国的王小云教授首次宣布了她及她的研究小组的研究成果:对 MD5、HAVAL-128、MD4 和 RIPEMD 等四个著名密码算法的破译结果。宣告了固若金汤的世界通行密码标准 MD5 大厦轰然倒塌,引发了密码学界的轩然大波。事实上,在 MD5 被王小云为代表的中国专家破译之后,世界密码学界仍然认为 SHA-1 是安全的。而仅仅在一周之后,王小云就宣布了破译 SHA-1 的消息。因为 SHA-1 在美国等国家有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。

    国际密码学家 Lenstra 利用王小云提供的 MD5 碰撞,伪造了符合 X.509标准 的数字证书,这就说明了 MD5 的破译已经不仅仅是理论破译结果,而是可以导致实际的攻击,MD5 的撤出已迫在眉睫。

    相关文章

      网友评论

          本文标题:MD5 算法简介

          本文链接:https://www.haomeiwen.com/subject/mtawzftx.html