zoukankan      html  css  js  c++  java
  • MD5值算法原理

    MD5原理说明

    一、MD5算法介绍。

    MD5“Message-Digest Algorithm 5信息-摘要算法从名字来看就知道它是从MD3MD4发展而来的一种加密算法其主要通过采集文件的信息摘要以此进行计算并加密。通过MD5算法进行加密,文件就可以获得一个唯一的MD5值,这个值是独一无二的,就像我们的指纹一样,因此我们就可以通过文件的MD5值来确定文件是否正确,密码进行加密后也会生成MD5值,论坛就是通过MD5值来验证用户的密码是否正确的。

     

    二、MD5算法实现。

    MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。

    1、填充编码。

    MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息的位长=N*512+448+64=(N+1*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

                              MD5原理说明

     2、算法实现。

    如右图,一个MD5运算由类似的64次循环构成,分成4组16次。F 一个非线性函数;一个函数运算一次。Mi 表示一个 32-bits 的输入数据,Ki表示一个 32-bits 常数,用来完成每次不同的计算。

    主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对abcd中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向左环移一个不定的数,并加上abcd中之一。最后用该结果取代abcd中之一。

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

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

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

    具体这64次循环(分4轮)过程函数如下:

                                  

     

    第一轮:(MD5一共4轮)

    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

      第四轮

      a,b,c,d,M0,6,0xf4292244

      d,a,b,c,M7,10,0x432aff97

      c,d,a,b,M14,15,0xab9423a7

      b,c,d,a,M5,21,0xfc93a039

      a,b,c,d,M12,6,0x655b59c3

      d,a,b,c,M3,10,0x8f0ccc92

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

      b,c,d,a,M1,21,0x85845dd1

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

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

      c,d,a,b,M6,15,0xa3014314

      b,c,d,a,M13,21,0x4e0811a1

      a,b,c,d,M4,6,0xf7537e82

      d,a,b,c,M11,10,0xbd3af235

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

      b,c,d,a,M9,21,0xeb86d391

     

     

    三、MD5算法的不足。

    现在看来,MD5已经较老,散列长度通常为128位,随着计算机运算能力提高,找到“碰撞”是可能的。因此,在安全要求高的场合不使用MD5。

    2004年,王小云教授证明MD5数字签名算法可以产生碰撞。2007年,Marc Stevens,Arjen K. Lenstra和Benne de Weger进一步指出通过伪造软件签名,可重复性攻击MD5算法。研究者使用前缀碰撞法(chosen-prefix collision),使程序前端包含恶意程序,利用后面的空间添上垃圾代码凑出同样的MD5 Hash值。2007年,荷兰埃因霍芬技术大学科学家成功把2个可执行文件进行了MD5碰撞,使得这两个运行结果不同的程序被计算出同一个MD5。2008年12月科研人员通过MD5碰撞成功生成了伪造的SSL证书,这使得在https协议中服务器可以伪造一些根CA的签名

    MD5被攻破后,在Crypto2008上, Rivest提出了MD6算法,该算法的Block size为512 bytes(MD5的Block Size是512 bits), Chaining value长度为1024 bits, 算法增加了并行 机制,适合于多核CPU。 在安全性上,Rivest宣称该算法能够抵抗截至目前已知的所有的 攻击(包括差分攻击)。

  • 相关阅读:
    1.5.2 在IIS上配置ASP.NET(转)
    数据结构二叉树的基本编码(原创)
    真正的AmChart破解教程和RadarChart使用(转)
    C#遍历文件中的文件或者文件夹(转)
    [Android]在代码中创建布局
    [AS]AIR 中获取本地 IP API
    [Android][转]Android获取网页数据的方法总结
    [AS][iOS]AIR应用在iOS中,home键退出
    [Android]ListView学习(一)
    [Android]TextView 单行文本过长显示的属性
  • 原文地址:https://www.cnblogs.com/ttss/p/4243274.html
Copyright © 2011-2022 走看看