MD5

百度百科

MD5 信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

MD5算法存在弱点,无法防止碰撞(collision),可以被破解,因此不适用于安全性认证,如 SSL 公开密钥认证或是数字签名等用途。

碰撞:在对两个不同的内容使用 MD5 算法运算的时候,有可能得到一对相同的结果值。

2009年,中国科学院的谢涛和冯登国仅用了 220.96 的碰撞算法复杂度,破解了 MD5 的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。

一、MD5 原理

MD5 码以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。

总体流程如下图所示,每次的运算都由前一轮的128位结果值和当前的512bit值进行运算:

二、算法步骤

2.1 按位补充数据

在 MD5 算法中,首先需要对信息进行填充,这个数据按位(bit)补充,要求最终的位数对 512 求模的结果为 448。也就是说数据补位后,其位数长度只差64位(bit)就是 512 的整数倍。即便是这个数据的位数对 512 求模的结果正好是 448 也必须进行补位。

补位的实现过程:

  1. 在数据后补一个 1 bit;
  2. 在后面补上一堆 0 bit,直到整个数据的位数对 512 求模的结果正好为448

总结:至少补 1 位,而最多可能补 512 位。

2.2 扩展长度

在完成补位工作后,又将一个表示数据原始长度的 64 bit 数(这是对原始数据没有补位前长度的描述,用二进制来表示)补在最后。

当完成补位及补充数据的描述后,得到的结果数据长度正好是 512 的整数倍。也就是说长度正好是 16 个(32bit)字的整数倍。

2.3 初始化MD缓存器

MD5 运算要用到一个 128 位的 MD5 缓存器,用来保存中间变量和最终结果。该缓存器又可看成是 4 个 32 位的寄存器 A、B、C、D,初始化为:

A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210

2.4 处理数据段

首先定义 4 个非线性函数 F、G、H、I,对输入的报文运算以 512 位数据段为单位进行处理。对每个数据段都要进行 4 轮的逻辑处理,在 4 轮中分别使用 4 个不同的函数 F、G、H、I。每一轮以 ABCD 和当前的 512 位的块为输入,处理后送入 ABCD(128 位)。

单次子循环的流程:

单次子循环的流程

图中 A、B、C、D 就是哈希值的四个分组。每一次循环都会让旧的 ABCD 产生新的 ABCD。一共进行多少次循环呢?由处理后的原文长度决定。

假设处理后的原文长度是 M,主循环次数 = M / 512,每个主循环中包含 512/32 * 4 = 64 次子循环。

  1. 绿色 F

    图中的绿色 F,代表非线性函数。官方 MD5 所用到的函数有四种:

    F(X, Y, Z) = (X&Y) | ((~X) & Z)
    G(X, Y, Z) = (X&Z) | (Y & (~Z))
    H(X, Y, Z) = XYZ
    I(X, Y, Z) = YX|(~Z)

    在主循环下面 64 次子循环中,F、G、H、I 交替使用,第一个 16 次使用 F,第二个 16 次使用 G,第三个 16 次使用 H,第四个 16 次使用 I

  2. 红色“田”字

    代表相加的意思。

  3. Mi

    Mi 是第一步处理后的原文。在第一步中,处理后原文的长度是 512 的整数倍。把原文的每 512 位再分成 16 等份,命名为 M0 ~ M15,每一等份长度 32。在 64 次子循环中,每 16 次循环,都会交替用到 M1~M16 之一。

  4. Ki

    一个常量,在 64 次子循环中,每一次用到的常量都是不同的。

  5. 黄色的“<<<S”

    左移 S 位,S 的值也是常量。

“流水线”的最后,让计算的结果和 B 相加,取代原先的 B。新 ABCD 的产生可以归纳为:

  • 新 A = 原 d
  • 新 B = b + ((a+F(b,c,d)+Mj+Ki)<<<s)
  • 新 C = 原 b
  • 新 D = 原 c

总结一下主循环中的 64 次子循环,可以归纳为下面的四部分:

第一轮:

a=FF(a,b,c,d,M0,7,0xd76aa478)    s[0]=7,   K[0] = 0xd76aa478
b=FF(a,b,c,d,M1,12,0xe8c7b756)   s[1]=12,  K[1] = 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,0xd62f105d)
b=GG(d,a,b,c,M10,9,0x02441453)
c=GG(c,d,a,b,M15,14,0xd8a1e681)
d=GG(b,c,d,a,M4,20,0xe7d3fbc8)
a=GG(a,b,c,d,M9,5,0x21e1cde6)
b=GG(d,a,b,c,M14,9,0xc33707d6)
c=GG(c,d,a,b,M3,14,0xf4d50d87)
d=GG(b,c,d,a,M8,20,0x455a14ed)
a=GG(a,b,c,d,M13,5,0xa9e3e905)
b=GG(d,a,b,c,M2,9,0xfcefa3f8)
c=GG(c,d,a,b,M7,14,0x676f02d9)
d=GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三轮:

a=HH(a,b,c,d,M5,4,0xfffa3942)
b=HH(d,a,b,c,M8,11,0x8771f681)
c=HH(c,d,a,b,M11,16,0x6d9d6122)
d=HH(b,c,d,a,M14,23,0xfde5380c)
a=HH(a,b,c,d,M1,4,0xa4beea44)
b=HH(d,a,b,c,M4,11,0x4bdecfa9)
c=HH(c,d,a,b,M7,16,0xf6bb4b60)
d=HH(b,c,d,a,M10,23,0xbebfbc70)
a=HH(a,b,c,d,M13,4,0x289b7ec6)
b=HH(d,a,b,c,M0,11,0xeaa127fa)
c=HH(c,d,a,b,M3,16,0xd4ef3085)
d=HH(b,c,d,a,M6,23,0x04881d05)
a=HH(a,b,c,d,M9,4,0xd9d4d039)
b=HH(d,a,b,c,M12,11,0xe6db99e5)
c=HH(c,d,a,b,M15,16,0x1fa27cf8)
d=HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮:

a=II(a,b,c,d,M0,6,0xf4292244)
b=II(d,a,b,c,M7,10,0x432aff97)
c=II(c,d,a,b,M14,15,0xab9423a7)
d=II(b,c,d,a,M5,21,0xfc93a039)
a=II(a,b,c,d,M12,6,0x655b59c3)
b=II(d,a,b,c,M3,10,0x8f0ccc92)
c=II(c,d,a,b,M10,15,0xffeff47d)
d=II(b,c,d,a,M1,21,0x85845dd1)
a=II(a,b,c,d,M8,6,0x6fa87e4f)
b=II(d,a,b,c,M15,10,0xfe2ce6e0)
c=II(c,d,a,b,M6,15,0xa3014314)
d=II(b,c,d,a,M13,21,0x4e0811a1)
a=II(a,b,c,d,M4,6,0xf7537e82)
b=II(d,a,b,c,M11,10,0xbd3af235)
c=II(c,d,a,b,M2,15,0x2ad7d2bb)
d=II(b,c,d,a,M9,21,0xeb86d391)

2.5 输出

信息摘要最终处理成以 A, B, C, D 的形式输出。也就是开始于 A的低位在前的顺序字节,结束于 D 的高位在前的顺序字节。

三、应用

  1. 用于密码管理
  2. 电子签名
  3. 垃圾邮件筛选

四、破解 MD5 算法

所谓的破解,并不是把 hash 值还原成原文。

  1. 暴力枚举法
  2. 字典法
  3. 彩虹表法

五、内容来源

tomorrow.wiki - 【转载】漫画趣解MD5算法
tomorrow.wiki - 【转载】漫画戏说:如何破解MD5加密算法
感召的鳞 - MD5的实现原理

posted @ 2020-03-22 12:26  和风细羽  阅读(708)  评论(0编辑  收藏  举报