How to Break MD5 and Other Hash Functions

2925 字
15 分钟
How to Break MD5 and Other Hash Functions
阅读说明

个人论文阅读报告留档:总结发表于 EUROCRYPT 2005 的论文 How to Break MD5 and Other Hash Functions,介绍基于模差的 MD5 碰撞攻击、充分条件与信息修改技术,并简述对 MD4 等函数的适用性。

论文信息
  • Title: How to Break MD5 and Other Hash Functions
  • Venue: EUROCRYPT 2005
  • Author(s): Xiaoyun Wang, Hongbo Yu
  • Institution(s): Shandong University
  • Link: Springer PDF

引言#

MD5(Message Digest 5)由 Ron Rivest 于 1992 年提出,是对 MD4 的加强。作为长期广泛使用的密码哈希函数之一,其安全性一直受到关注。此前较著名的结果多为伪碰撞或 semi-free-start collision(将标准初值换成非标准初值)。Wang & Yu1 提出一种真正的两块消息碰撞攻击:以模整数减法(而非异或)度量差分,称为模差(modular differential)。在 IBM P690 上,找第一块消息对大约需 15 分钟到 1 小时;第二块约 15 秒到 5 分钟。同一思路也可用于 MD4、RIPEMD、HAVAL 等。

数字签名、完整性校验、群签名、电子现金等应用都依赖底层哈希的抗碰撞能力。当时国际通用哈希以 MD5 与 SHA-1 为代表。1993 年,Den Boer 与 Bosselaers 给出伪碰撞(相同消息、不同初值),暴露了链接变量最高位的弱雪崩。Eurocrypt’96 Rump Session 上,Dobbertin 给出 semi-free-start collision,所用非标准初值为:

a0=0x12ac2375,b0=0x3b341042,c0=0x5f62b97c,d0=0x4ba763eda_0=\texttt{0x12ac2375},\quad b_0=\texttt{0x3b341042},\quad c_0=\texttt{0x5f62b97c},\quad d_0=\texttt{0x4ba763ed}

虽未得到标准初值下的真碰撞,但说明在一次压缩中构造特殊差分是可能的。受此启发,本文关心:能否找到由两块组成的消息对 (M0,M1)(M_0,M_1)(M0,M1)(M_0',M_1'),使第二块之后发生 MD5 碰撞,即

(a,b,c,d)=MD5(a0,b0,c0,d0,M0),(a,b,c,d)=MD5(a0,b0,c0,d0,M0),MD5(a,b,c,d,M1)=MD5(a,b,c,d,M1),\begin{aligned} (a,b,c,d)&=\mathrm{MD5}(a_0,b_0,c_0,d_0,M_0), \\ (a',b',c',d')&=\mathrm{MD5}(a_0,b_0,c_0,d_0,M_0'), \\ \mathrm{MD5}(a,b,c,d,M_1)&=\mathrm{MD5}(a',b',c',d',M_1'), \end{aligned}

其中 a0,b0,c0,d0a_0,b_0,c_0,d_0 为 MD5 标准初值。相对此前方法,找 (M0,M0)(M_0,M_0') 约需 2292^{29} 次 MD5 运算,找 (M1,M1)(M_1,M_1') 约需 2322^{32} 次(后文在计入信息修改开销时,也将第一块搜索复杂度表述为不超过 2392^{39})。所得碰撞实例(见表 2)曾在 Crypto’04 Rump Session 公布。同届会议上还有 Biham–Chen 对 SHA-0 的近碰撞、Joux 对 SHA-0 的四块完全碰撞等工作。

全文组织如下:MD5 算法简述 → 差分攻击思想 → MD5 上的差分攻击 → 总结,附录为原文表 1–6 截图。

MD5 算法简述#

哈希通常由压缩函数 X=f(Z)X=f(Z) 迭代得到(Merkle–Damgård 结构)。压缩函数把长度为 ll 的消息块映射到长度为 ss 的摘要(l>sl>s)。对 MD5,l=512l=512s=128s=128。填充后长度为 512 比特倍数的消息 M=(M0,,Mt1)M=(M_0,\ldots,M_{t-1}) 满足

Hi+1=f(Hi,Mi),0it1,H_{i+1}=f(H_i,M_i),\qquad 0\leq i\leq t-1,

初值 H0=IV0H_0=IV_0。本文攻击所用消息恰为两块(长度已是 512 的倍数),填充与否不影响结论。

每个 MiM_i 拆成 16 个 32 比特字 Mi=(m0,,m15)M_i=(m_0,\ldots,m_{15})。压缩函数分 4 个阶段(round),每阶段 16 步;连续四步形如

a=b+((a+ϕi(b,c,d)+wi+ti)si),d=a+((d+ϕi+1(a,b,c)+wi+1+ti+1)si+1),c=d+((c+ϕi+2(d,a,b)+wi+2+ti+2)si+2),b=c+((b+ϕi+3(c,d,a)+wi+3+ti+3)si+3),\begin{aligned} a&=b+\bigl((a+\phi_i(b,c,d)+w_i+t_i)\lll s_i\bigr), \\ d&=a+\bigl((d+\phi_{i+1}(a,b,c)+w_{i+1}+t_{i+1})\lll s_{i+1}\bigr), \\ c&=d+\bigl((c+\phi_{i+2}(d,a,b)+w_{i+2}+t_{i+2})\lll s_{i+2}\bigr), \\ b&=c+\bigl((b+\phi_{i+3}(c,d,a)+w_{i+3}+t_{i+3})\lll s_{i+3}\bigr), \end{aligned}

其中 ++ 为模 2322^{32} 加法,ti+jt_{i+j}si+js_{i+j} 为与步数相关的常数,wi+jw_{i+j} 为消息字,\lll 表示循环左移。四阶段非线性函数分别为

ϕi(X,Y,Z)=(XY)(¬XZ),0i15,ϕi(X,Y,Z)=(XZ)(Y¬Z),16i31,ϕi(X,Y,Z)=XYZ,32i47,ϕi(X,Y,Z)=Y(X¬Z),48i63.\begin{aligned} \phi_i(X,Y,Z)&=(X\land Y)\lor(\lnot X\land Z), & 0&\leq i\leq 15, \\ \phi_i(X,Y,Z)&=(X\land Z)\lor(Y\land\lnot Z), & 16&\leq i\leq 31, \\ \phi_i(X,Y,Z)&=X\oplus Y\oplus Z, & 32&\leq i\leq 47, \\ \phi_i(X,Y,Z)&=Y\oplus(X\lor\lnot Z), & 48&\leq i\leq 63. \end{aligned}

链接变量初值为

a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476.a=\texttt{0x67452301},\quad b=\texttt{0xefcdab89},\quad c=\texttt{0x98badcfe},\quad d=\texttt{0x10325476}.

记上一块输出为 Hi1=(aa,bb,cc,dd)H_{i-1}=(aa,bb,cc,dd),经四阶段后再与 Hi1H_{i-1} 逐字相加,得到本块压缩输出 HiH_i

差分攻击思想#

模差与异或差#

差分攻击是分析哈希与分组密码的重要手段;分组密码中常见以异或为差分。Biham 与 Shamir 对 DES 类算法的差分密码分析,考察明文对特定差分如何影响密文对差分。

本文采用基于整数模减法的精确差分,并结合模特征同时描述异或差与模差,以获得比单独使用任一度量更丰富的信息。

例如未知量 XX 满足 XX=26X'-X=2^6 时,异或差可有多种情形:

  • 仅第 7 位不同:异或为 0x00000040\texttt{0x00000040}XX'XX 该位为 1100
  • 第 7 位向第 8 位借位:异或为 0x000000c0\texttt{0x000000c0},两比特模式分别为 10100101
  • 继续向第 9 位借位:异或为 0x000001c0\texttt{0x000001c0},模式为 100100011011
  • 更长连续借位时,XX'XX 分别呈 10001000\ldots01110111\ldots
  • 若模差为负,异或绝对值可相同,但 XX'XX 的比特模式对调。

表示上,常同时给出模 2322^{32} 的整数差,以及带符号的比特位置序列:某位在 XX 上为 00 则无符号,为 11 则标负号。例如模差 26-2^6 可记为 [7,8,,22,23][7,8,\ldots,22,-23],表示从第 7 位借到第 23 位:XX 的第 7–22 位为 00、第 23 位为 11,而 XX' 相反。更复杂的例子如 126+223227-1-2^6+2^{23}-2^{27} 对应一长串带符号位置。最高位(第 32 位)也可参与借位;借位后该位本身不再标负号。

相对此前对 SHA-0、MD4、RIPEMD 等的模差分析,本文攻击有以下特点:

  • 消息仅两块(各 512 比特),两次迭代即可碰撞;
  • 差分特征更精确,除差分外还约束具体比特取值;
  • 给出保证差分成立的充分条件;
  • 使用信息修改技术(message modification),显著提高碰撞概率。

哈希上的差分形式#

定义 ΔX=XX\Delta X=X'-X。对长度同为 512 倍数的 M=(M0,,Mk1)M=(M_0,\ldots,M_{k-1})M=(M0,,Mk1)M'=(M_0',\ldots,M_{k-1}'),完全差分写作

ΔH0(M0,M0)ΔH1(M1,M1)(Mk1,Mk1)ΔH,\Delta H_0 \xrightarrow{(M_0,M_0')} \Delta H_1 \xrightarrow{(M_1,M_1')} \cdots \xrightarrow{(M_{k-1},M_{k-1}')} \Delta H,

其中 ΔH0=0\Delta H_0=0ΔH\Delta H 为输出差,ΔHi\Delta H_i 既是第 ii 次迭代输出差,也是下一次迭代初值差。若 ΔH=0\Delta H=0,则发生碰撞,相应差分称为碰撞差分

MD5 每次迭代含 4 阶段、每阶段 16 步。第 ii 次迭代差分可展开为

ΔHiP1ΔRi+1,1P2ΔRi+1,2P3ΔRi+1,3P4ΔRi+1,4=ΔHi+1.\Delta H_i \xrightarrow{P_1} \Delta R_{i+1,1} \xrightarrow{P_2} \Delta R_{i+1,2} \xrightarrow{P_3} \Delta R_{i+1,3} \xrightarrow{P_4} \Delta R_{i+1,4}=\Delta H_{i+1}.

各阶段再拆成 16 步差分特征,概率满足

Pj=14Pj,Pjt=116Pjt.P\geq\prod_{j=1}^{4}P_j,\qquad P_j\geq\prod_{t=1}^{16}P_{jt}.

更优碰撞差分的选取思路#

借助信息修改,可粗略指导如何寻找更好的(碰撞)差分:

  • 对任意块对 (Mi,Mi)(M_i,M_i') 与第一阶段非零差分 ΔHiΔRi+1,1\Delta H_i\to\Delta R_{i+1,1},可修改 MiM_i 使 P1=1P_1=1
  • 多重信息修改还能在保持 P1=1P_1=1 的同时显著提高第二阶段概率。

因此宜选取能使后两阶段仍以较高概率成立的消息差分。

MD5 上的差分攻击#

记号#

  • M=(m0,,m15)M=(m_0,\ldots,m_{15})M=(m0,,m15)M'=(m_0',\ldots,m_{15}') 为两块 512 比特消息;Δmi=mimi\Delta m_i=m_i'-m_i
  • ai,bi,ci,dia_i,b_i,c_i,d_i 分别表示第 4i3,4i2,4i1,4i4i-3,4i-2,4i-1,4i 步的输出(1i161\leq i\leq 16);带撇号者为对应 MM' 的量。
  • ai,ja_{i,j} 等表示字的第 jj 位(第 1 位为最低位,第 32 位为最高位)。
  • ϕi,j\phi_{i,j} 为第 ii 步非线性函数输出的第 jj 位。
  • xi[j]x_i[j]xi[j]x_i[-j])表示仅将 xix_ijj 位由 010\to 1(或 101\to 0)后的取值;xx 可为 a,b,c,d,ϕa,b,c,d,\phi
  • xi[±j1,,±jl]x_i[\pm j_1,\ldots,\pm j_l] 表示若干指定位同时翻转;++ 可省略,表示 010\to 1- 表示 101\to 0

MD5 的碰撞差分#

在标准初值 IV0IV_0 下,寻找两段各 1024 比特的消息对,使

ΔH0(M0,M0)ΔH1(M1,M1)ΔH=0,\Delta H_0 \xrightarrow{(M_0,M_0')} \Delta H_1 \xrightarrow{(M_1,M_1')} \Delta H=0,

其中

ΔM0=(0,0,0,0,231,0,0,0,0,0,0,215,0,0,231,0),ΔM1=(0,0,0,0,231,0,0,0,0,0,0,215,0,0,231,0),ΔH1=(231,231+225,231+225,231+225).\begin{aligned} \Delta M_0&=(0,0,0,0,2^{31},0,0,0,0,0,0,2^{15},0,0,2^{31},0), \\ \Delta M_1&=(0,0,0,0,2^{31},0,0,0,0,0,0,-2^{15},0,0,2^{31},0), \\ \Delta H_1&=(2^{31},\,2^{31}+2^{25},\,2^{31}+2^{25},\,2^{31}+2^{25}). \end{aligned}

非零差分落在下标为 4411111414 的字上(即第 5、12、15 个字,从 0 计数)。ΔH1=(Δa,Δb,Δc,Δd)\Delta H_1=(\Delta a,\Delta b,\Delta c,\Delta d) 为第一块压缩后链接变量之差。ΔM0\Delta M_0 需使第 3、4 阶段差分以较高概率成立;ΔM1\Delta M_1 还须使输出差被 ΔH1\Delta H_1 抵消。

完整差分特征见表 3 与表 5(列含义相同)。表 3 各列依次为:步数;M0M_0 上该步链接变量;该步消息字;循环左移位数;M0M_0M0M_0' 的消息字 / 链接变量差分;M0M_0' 的链接变量。空白表示无差分;完全无差分的步省略。

充分条件(以第 8 步为例)#

下面以表 3 中第 8 步为例,说明如何导出保证差分特征成立的充分条件。该步差分形为

(Δc2,Δd2,Δa2,Δb1)Δb2,(\Delta c_2,\Delta d_2,\Delta a_2,\Delta b_1)\longrightarrow\Delta b_2,

b1=b1,a2=a2[7,,22,23],d2=d2[7,24,32],c2=c2[7,8,9,10,11,12,24,25,26,27,28,29,30,31,32,1,2,3,4,5,6],b2=b2[1,16,17,18,19,20,21,24].\begin{aligned} b_1'&=b_1, \\ a_2'&=a_2[7,\ldots,22,-23], \\ d_2'&=d_2[-7,24,32], \\ c_2'&=c_2[7,8,9,10,11,-12,-24,-25,-26,27,28,29,30,31,32,1,2,3,4,5,-6], \\ b_2'&=b_2[1,16,-17,18,19,20,-21,-24]. \end{aligned}

由压缩函数,

b2=c2+((b1+F(c2,d2,a2)+m7+t7)22),b2=c2+((b1+F(c2,d2,a2)+m7+t7)22),ϕ7=F(c2,d2,a2)=(c2d2)(¬c2a2).\begin{aligned} b_2&=c_2+\bigl((b_1+F(c_2,d_2,a_2)+m_7+t_7)\lll 22\bigr), \\ b_2'&=c_2'+\bigl((b_1+F(c_2',d_2',a_2')+m_7'+t_7)\lll 22\bigr), \\ \phi_7&=F(c_2,d_2,a_2)=(c_2\land d_2)\lor(\lnot c_2\land a_2). \end{aligned}

为区分右端两次出现的 c2c_2,记 c2Fc_2^FFF 内的 c2c_2c2NFc_2^{NF}FF 外的 c2c_2。推导基于:

  • Δb1=0\Delta b_1=0Δm7=0\Delta m_7=0 时,Δb2=Δc2NF+(Δϕ722)\Delta b_2=\Delta c_2^{NF}+(\Delta\phi_7\lll 22)
  • 固定 FF 的一个或两个自变量后,FF 可退化为单变量函数。

据此可列出使差分保持的充分条件。对 Δb2\Delta b_2 的非零位:

  • (a) d2,11=1d_{2,11}=1b2,1=0b_{2,1}=0 时,可保证 b2b_2 第 1 位翻转。若再有 d2,11=a2,11=1d_{2,11}=\overline{a_{2,11}}=1,则 Δϕ7,11=1\Delta\phi_{7,11}=1;左移 22 位后该差落在第 1 位;又 Δc2,1NF=0\Delta c_{2,1}^{NF}=0,故 Δb2,1=1\Delta b_{2,1}=1
  • (b) d2,26=a2,26=1d_{2,26}=\overline{a_{2,26}}=1b2,16=0b_{2,16}=0b2,17=1b_{2,17}=1 时,可保证第 16、17 位翻转。
  • (c) d2,28=a2,28=0d_{2,28}=\overline{a_{2,28}}=0b2,i=0b_{2,i}=0i=18,19,20i=18,19,20)且 b2,21=1b_{2,21}=1 时,可保证第 18–21 位翻转。
  • (d) d2,3=a2,3=0d_{2,3}=\overline{a_{2,3}}=0b2,24=1b_{2,24}=1 时,可保证第 24 位翻转,并有
Δc2NF[24,25,26,27]+(Δϕ7[3]22)=223224=223.\Delta c_2^{NF}[-24,-25,-26,27]+(\Delta\phi_7[3]\lll 22)=2^{23}-2^{24}=-2^{23}.

Δb2\Delta b_2 的零位:

  • (a) c2,17=0c_{2,17}=0 时,可允许 (c2)NF(c_2')^{NF} 第 7、12 位与 a2a_2' 第 17 位变化而 b2b_2 不变:
Δc2NF[7,,11,12]+(Δϕ7[17]22)=26+26=0.\Delta c_2^{NF}[7,\ldots,11,-12]+(\Delta\phi_7[17]\lll 22)=-2^6+2^6=0.
  • (b) d2,i=a2,id_{2,i}=a_{2,i}i{1,2,4,5,25,27,29,30,31}i\in\{1,2,4,5,25,27,29,30,31\})时,c2Fc_2^Fii 位可变而 b2b_2 不变。
  • (c) c2,i=1c_{2,i}=1i{13,,16,18,,23}i\in\{13,\ldots,16,18,\ldots,23\})时,a2a_2ii 位可变而 b2b_2 不变。
  • (d) d2,6=a2,6=0d_{2,6}=\overline{a_{2,6}}=0 时,c2Fc_2^F 第 6 位可变而 b2b_2 不变。
  • (e) a2,32=1a_{2,32}=1 时,c2Fc_2^Fd2d_2 第 32 位可变而 b2b_2 不变。
  • (f) d2,i=0d_{2,i}=0i{8,9,10}i\in\{8,9,10\})时,a2a_2c2Fc_2^Fii 位可变而 b2b_2 不变。
  • (g) d2,12=1d_{2,12}=1 时,a2a_2c2Fc_2^F 第 12 位可变而 b2b_2 不变。
  • (h) a2,24=0a_{2,24}=0 时,c2Fc_2^Fd2d_2 第 24 位可变而 b2b_2 不变。
  • (i) c2Fc_2^Fd2d_2a2a_2 第 7 位同时变化时,b2b_2 仍可不变。

其余步的充分条件可用同样方式推出。

信息修改#

单一信息修改。通过改消息字可提前满足部分充分条件。对 M0M_0(或 M1M_1)及相应中间链接值,可修改消息使表 4、表 6 中第一阶段(前 16 步)条件几乎必然成立。例如为满足表 4 中 c1c_1 的三个条件,可令

c1newc1oldc1,7old26c1,12old211c1,20old219,m2new((c1newc1old)17)+m2old.\begin{aligned} c_1^{\mathrm{new}}&\leftarrow c_1^{\mathrm{old}}-c_{1,7}^{\mathrm{old}}\cdot 2^6-c_{1,12}^{\mathrm{old}}\cdot 2^{11}-c_{1,20}^{\mathrm{old}}\cdot 2^{19}, \\ m_2^{\mathrm{new}}&\leftarrow\bigl((c_1^{\mathrm{new}}-c_1^{\mathrm{old}})\ggg 17\bigr)+m_2^{\mathrm{old}}. \end{aligned}

M0M_0 各字做完修改后,第一阶段条件成立,第一块差分概率约为 2432^{-43};对 M1M_1 类似修改后,第二块约为 2372^{-37}

多重信息修改。还可满足部分前 32 步条件。例如若 a5,32=1a_{5,32}=1,可改 m1,,m5m_1,\ldots,m_5 使其变为 00,从而在第 2–6 步形成局部碰撞且不破坏第一阶段条件(见表 1)。之后表 4 第 2–4 阶段约剩 37 个未定条件,表 6 约剩 30 个,故两块差分概率分别约为 2372^{-37}2302^{-30}

攻击流程#

目标是实现

ΔH0(M0,M0),237ΔH1(M1,M1),230ΔH=0.\Delta H_0 \xrightarrow{(M_0,M_0'),\,2^{-37}} \Delta H_1 \xrightarrow{(M_1,M_1'),\,2^{-30}} \Delta H=0.
  • 重复直至找到 M0M_0:随机取 M0M_0 → 信息修改 → 令 M0=M0+ΔM0M_0'=M_0+\Delta M_0 检验第一块差分(概率约 2372^{-37})→ 用压缩函数核对特征。
  • 重复直至碰撞:随机取 M1M_1 → 信息修改 → 用 M1M_1M1+ΔM1M_1+\Delta M_1 检验第二块差分(概率约 2302^{-30})→ 检查是否碰撞。

实现上,M0M_0' 只需改 M0M_0 最后两字;前 14 字的单一修改开销可忽略。对每个候选 M0M_0,约需对最后两字各做一次单一修改,并在第二阶段做约 7 次多重修改,总时间不超过约两次 MD5。计入这些后,搜索 (M0,M0)(M_0,M_0') 的复杂度不超过约 2392^{39} 次 MD5。

表 2 给出两个碰撞实例:二者第一块完全相同;一旦第一块满足条件,第二块通常很容易找到。

总结#

上述模差方法使寻找 MD5 碰撞变得现实可行,并可用于其它哈希。论文给出的粗略复杂度如下(不含 / 含多重信息修改):

  • MD4:约 2232^{23} / 282^{8} 次 MD4;
  • HAVAL-128:约 2132^{13} / 272^{7} 次;
  • RIPEMD:约 2302^{30} / 2182^{18} 次;
  • SHA-0:约 2612^{61} / 2452^{45} 次。

附录:原文表格截图#

图表说明

下列截图依次对应正文中的表 1–6(信息修改示例、碰撞实例、差分特征与充分条件等)。

表 1 多重信息修改示例
表 1 多重信息修改示例

表 2 MD5 碰撞实例
表 2 MD5 碰撞实例

表 3 第一块消息的差分特征
表 3 第一块消息的差分特征

表 4 第一块相关充分条件
表 4 第一块相关充分条件

表 5 第二块消息的差分特征
表 5 第二块消息的差分特征

表 6 第二块相关充分条件
表 6 第二块相关充分条件

参考文献#

Footnotes#

  1. Xiaoyun Wang, Hongbo Yu. How to Break MD5 and Other Hash Functions. EUROCRYPT 2005.

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

How to Break MD5 and Other Hash Functions
https://blog.scxs-studio.com/posts/break-md5/
作者
R. Z.
发布于
2021-12-04
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
R. Z.
Suffering from acute coke overdose
分类
标签
站点统计
文章
7
分类
4
标签
16
总字数
57,527
运行时长
0
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.15.3
文章许可
CC BY-NC-SA 4.0