MD5原理说明

一、MD5算法介绍。

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

二、MD5算法实现。

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

1、填充编码。

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

2、算法实现。

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

主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行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))

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

具体这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宣称该算法能够抵抗截至目前已知的所有的 攻击(包括差分攻击)。

MD5值算法原理的更多相关文章

  1. MD5值转换(Hex 32位 <-> base64 24位)

    关于MD5值的原理本文不在介绍,本文主要介绍MD5值的两种编码的相互转换(32位和BASE64编码的24位),实际应用过程中经常会涉及到两种编码的相互转换.快熟使用工具tomeko.net. C#示例 ...

  2. kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)

    kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点. 算法原理: (1) 随机选取k个中心点: (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为 ...

  3. MD5算法【计算文件和字符串的MD5值】

    1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...

  4. 集成学习值Adaboost算法原理和代码小结(转载)

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...

  5. md5是哈希算法的改进加强,因为不同原始值可能hash结果一样,但md5则改善了用于验证消息完整性,不同md5值原始值也必将不一样

    md5是哈希算法的改进加强,因为不同原始值可能hash结果一样,但md5则改善了用于验证消息完整性,不同md5值原始值也必将不一样

  6. 【密码学】MD5算法原理

    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输 ...

  7. 【编程开发】MD5算法原理

    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用.     MD5功能: ...

  8. 分布式缓存技术memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...

  9. SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二)

    SSH原理与运用(一)和(二):远程登录  RSA算法原理(一)和(二) http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html ht ...

随机推荐

  1. Oracle 中 根据值 查询 所在 表和字段

    -------------------- -- 这里是查询 数字型字段值 /*declare CURSOR cur_query IS select table_name, column_name, d ...

  2. DropDownList的用法

    DropDownList是一个下拉列表菜单,平时我们也会经常用到,下面就来看看如何绑定值 1>     静态添加,就是说在值都很明确的情况下 ListItem list1 = new ListI ...

  3. poj1942 Paths on a Grid

    处理阶乘有三种办法:(1)传统意义上的直接递归,n的规模最多到20+,太小了,在本题不适用,而且非常慢(2)稍快一点的算法,就是利用log()化乘为加,n的规模虽然扩展到1000+,但是由于要用三重循 ...

  4. Android的Intent作用

    Android应用程序中有三个核心组件Activity.Services.Broadcast Receiver. Intent 提供应用程序之间的的交互机制,负责对一次操作的动作,动作涉及的数据,附加 ...

  5. javascript之delete操作符

    理解delete 理论 代码段的类型 执行上下文 活动对象 / 变量对象 属性的特性 内置属性与 DontDelete 未声明的赋值 Firebug的困惑 在eval中删除变量 浏览器兼容性 Geck ...

  6. .NET中 使用数组的注意事项

    1.初始值问题 对于int.double.float等一些值类型数组,没有赋值的情况下, 默认值是0: 而对于String 等引用类型,初始值为null. 2.IndexOutOfRangeExcep ...

  7. u-boot board_uart_init流程

    /** ****************************************************************************** * @author    Maox ...

  8. Creating a Unique File Name

    If you are working with files or file attachments in PeopleCode, you will typically want to create a ...

  9. js-布尔值

    1.任何JavaScript的值都可以转换为布尔值 下面这些将会转换为false(假值): undefined null 0 -0 NaN "" //空字符串 所有其他值,包括所有 ...

  10. mysql 修改字段长度

    mysql 修改字段长度 alter table news  modify column title varchar(130); alter table 表名 modify column 字段名 类型 ...