个人论文阅读报告留档:总结发表于 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=0x4ba763ed虽未得到标准初值下的真碰撞,但说明在一次压缩中构造特殊差分是可能的。受此启发,本文关心:能否找到由两块组成的消息对 (M0,M1) 与 (M0′,M1′),使第二块之后发生 MD5 碰撞,即
(a,b,c,d)(a′,b′,c′,d′)MD5(a,b,c,d,M1)=MD5(a0,b0,c0,d0,M0),=MD5(a0,b0,c0,d0,M0′),=MD5(a′,b′,c′,d′,M1′),其中 a0,b0,c0,d0 为 MD5 标准初值。相对此前方法,找 (M0,M0′) 约需 229 次 MD5 运算,找 (M1,M1′) 约需 232 次(后文在计入信息修改开销时,也将第一块搜索复杂度表述为不超过 239)。所得碰撞实例(见表 2)曾在 Crypto’04 Rump Session 公布。同届会议上还有 Biham–Chen 对 SHA-0 的近碰撞、Joux 对 SHA-0 的四块完全碰撞等工作。
全文组织如下:MD5 算法简述 → 差分攻击思想 → MD5 上的差分攻击 → 总结,附录为原文表 1–6 截图。
MD5 算法简述#
哈希通常由压缩函数 X=f(Z) 迭代得到(Merkle–Damgård 结构)。压缩函数把长度为 l 的消息块映射到长度为 s 的摘要(l>s)。对 MD5,l=512,s=128。填充后长度为 512 比特倍数的消息 M=(M0,…,Mt−1) 满足
Hi+1=f(Hi,Mi),0≤i≤t−1,初值 H0=IV0。本文攻击所用消息恰为两块(长度已是 512 的倍数),填充与否不影响结论。
每个 Mi 拆成 16 个 32 比特字 Mi=(m0,…,m15)。压缩函数分 4 个阶段(round),每阶段 16 步;连续四步形如
adcb=b+((a+ϕi(b,c,d)+wi+ti)⋘si),=a+((d+ϕi+1(a,b,c)+wi+1+ti+1)⋘si+1),=d+((c+ϕi+2(d,a,b)+wi+2+ti+2)⋘si+2),=c+((b+ϕi+3(c,d,a)+wi+3+ti+3)⋘si+3),其中 + 为模 232 加法,ti+j、si+j 为与步数相关的常数,wi+j 为消息字,⋘ 表示循环左移。四阶段非线性函数分别为
ϕi(X,Y,Z)ϕi(X,Y,Z)ϕi(X,Y,Z)ϕi(X,Y,Z)=(X∧Y)∨(¬X∧Z),=(X∧Z)∨(Y∧¬Z),=X⊕Y⊕Z,=Y⊕(X∨¬Z),0163248≤i≤15,≤i≤31,≤i≤47,≤i≤63.链接变量初值为
a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476.记上一块输出为 Hi−1=(aa,bb,cc,dd),经四阶段后再与 Hi−1 逐字相加,得到本块压缩输出 Hi。
差分攻击思想#
模差与异或差#
差分攻击是分析哈希与分组密码的重要手段;分组密码中常见以异或为差分。Biham 与 Shamir 对 DES 类算法的差分密码分析,考察明文对特定差分如何影响密文对差分。
本文采用基于整数模减法的精确差分,并结合模特征同时描述异或差与模差,以获得比单独使用任一度量更丰富的信息。
例如未知量 X 满足 X′−X=26 时,异或差可有多种情形:
- 仅第 7 位不同:异或为 0x00000040,X′ 与 X 该位为 1 与 0;
- 第 7 位向第 8 位借位:异或为 0x000000c0,两比特模式分别为 10 与 01;
- 继续向第 9 位借位:异或为 0x000001c0,模式为 100 与 011;
- 更长连续借位时,X′ 与 X 分别呈 1000… 与 0111…;
- 若模差为负,异或绝对值可相同,但 X′ 与 X 的比特模式对调。
表示上,常同时给出模 232 的整数差,以及带符号的比特位置序列:某位在 X 上为 0 则无符号,为 1 则标负号。例如模差 −26 可记为 [7,8,…,22,−23],表示从第 7 位借到第 23 位:X 的第 7–22 位为 0、第 23 位为 1,而 X′ 相反。更复杂的例子如 −1−26+223−227 对应一长串带符号位置。最高位(第 32 位)也可参与借位;借位后该位本身不再标负号。
相对此前对 SHA-0、MD4、RIPEMD 等的模差分析,本文攻击有以下特点:
- 消息仅两块(各 512 比特),两次迭代即可碰撞;
- 差分特征更精确,除差分外还约束具体比特取值;
- 给出保证差分成立的充分条件;
- 使用信息修改技术(message modification),显著提高碰撞概率。
哈希上的差分形式#
定义 ΔX=X′−X。对长度同为 512 倍数的 M=(M0,…,Mk−1) 与 M′=(M0′,…,Mk−1′),完全差分写作
ΔH0(M0,M0′)ΔH1(M1,M1′)⋯(Mk−1,Mk−1′)ΔH,其中 ΔH0=0,ΔH 为输出差,ΔHi 既是第 i 次迭代输出差,也是下一次迭代初值差。若 ΔH=0,则发生碰撞,相应差分称为碰撞差分。
MD5 每次迭代含 4 阶段、每阶段 16 步。第 i 次迭代差分可展开为
ΔHiP1ΔRi+1,1P2ΔRi+1,2P3ΔRi+1,3P4ΔRi+1,4=ΔHi+1.各阶段再拆成 16 步差分特征,概率满足
P≥j=1∏4Pj,Pj≥t=1∏16Pjt.更优碰撞差分的选取思路#
借助信息修改,可粗略指导如何寻找更好的(碰撞)差分:
- 对任意块对 (Mi,Mi′) 与第一阶段非零差分 ΔHi→ΔRi+1,1,可修改 Mi 使 P1=1;
- 多重信息修改还能在保持 P1=1 的同时显著提高第二阶段概率。
因此宜选取能使后两阶段仍以较高概率成立的消息差分。
MD5 上的差分攻击#
- M=(m0,…,m15)、M′=(m0′,…,m15′) 为两块 512 比特消息;Δmi=mi′−mi。
- ai,bi,ci,di 分别表示第 4i−3,4i−2,4i−1,4i 步的输出(1≤i≤16);带撇号者为对应 M′ 的量。
- ai,j 等表示字的第 j 位(第 1 位为最低位,第 32 位为最高位)。
- ϕi,j 为第 i 步非线性函数输出的第 j 位。
- xi[j](xi[−j])表示仅将 xi 第 j 位由 0→1(或 1→0)后的取值;x 可为 a,b,c,d,ϕ。
- xi[±j1,…,±jl] 表示若干指定位同时翻转;+ 可省略,表示 0→1,− 表示 1→0。
MD5 的碰撞差分#
在标准初值 IV0 下,寻找两段各 1024 比特的消息对,使
ΔH0(M0,M0′)ΔH1(M1,M1′)ΔH=0,其中
ΔM0ΔM1ΔH1=(0,0,0,0,231,0,0,0,0,0,0,215,0,0,231,0),=(0,0,0,0,231,0,0,0,0,0,0,−215,0,0,231,0),=(231,231+225,231+225,231+225).非零差分落在下标为 4、11、14 的字上(即第 5、12、15 个字,从 0 计数)。ΔH1=(Δa,Δb,Δc,Δd) 为第一块压缩后链接变量之差。ΔM0 需使第 3、4 阶段差分以较高概率成立;ΔM1 还须使输出差被 ΔH1 抵消。
完整差分特征见表 3 与表 5(列含义相同)。表 3 各列依次为:步数;M0 上该步链接变量;该步消息字;循环左移位数;M0 与 M0′ 的消息字 / 链接变量差分;M0′ 的链接变量。空白表示无差分;完全无差分的步省略。
充分条件(以第 8 步为例)#
下面以表 3 中第 8 步为例,说明如何导出保证差分特征成立的充分条件。该步差分形为
(Δc2,Δd2,Δa2,Δb1)⟶Δb2,且
b1′a2′d2′c2′b2′=b1,=a2[7,…,22,−23],=d2[−7,24,32],=c2[7,8,9,10,11,−12,−24,−25,−26,27,28,29,30,31,32,1,2,3,4,5,−6],=b2[1,16,−17,18,19,20,−21,−24].由压缩函数,
b2b2′ϕ7=c2+((b1+F(c2,d2,a2)+m7+t7)⋘22),=c2′+((b1+F(c2′,d2′,a2′)+m7′+t7)⋘22),=F(c2,d2,a2)=(c2∧d2)∨(¬c2∧a2).为区分右端两次出现的 c2,记 c2F 为 F 内的 c2,c2NF 为 F 外的 c2。推导基于:
- Δb1=0 且 Δm7=0 时,Δb2=Δc2NF+(Δϕ7⋘22);
- 固定 F 的一个或两个自变量后,F 可退化为单变量函数。
据此可列出使差分保持的充分条件。对 Δb2 的非零位:
- (a) d2,11=1、b2,1=0 时,可保证 b2 第 1 位翻转。若再有 d2,11=a2,11=1,则 Δϕ7,11=1;左移 22 位后该差落在第 1 位;又 Δc2,1NF=0,故 Δb2,1=1。
- (b) d2,26=a2,26=1、b2,16=0 且 b2,17=1 时,可保证第 16、17 位翻转。
- (c) d2,28=a2,28=0,b2,i=0(i=18,19,20)且 b2,21=1 时,可保证第 18–21 位翻转。
- (d) d2,3=a2,3=0、b2,24=1 时,可保证第 24 位翻转,并有
Δc2NF[−24,−25,−26,27]+(Δϕ7[3]⋘22)=223−224=−223.对 Δb2 的零位:
- (a) c2,17=0 时,可允许 (c2′)NF 第 7、12 位与 a2′ 第 17 位变化而 b2 不变:
Δc2NF[7,…,11,−12]+(Δϕ7[17]⋘22)=−26+26=0.
- (b) d2,i=a2,i(i∈{1,2,4,5,25,27,29,30,31})时,c2F 第 i 位可变而 b2 不变。
- (c) c2,i=1(i∈{13,…,16,18,…,23})时,a2 第 i 位可变而 b2 不变。
- (d) d2,6=a2,6=0 时,c2F 第 6 位可变而 b2 不变。
- (e) a2,32=1 时,c2F 与 d2 第 32 位可变而 b2 不变。
- (f) d2,i=0(i∈{8,9,10})时,a2 与 c2F 第 i 位可变而 b2 不变。
- (g) d2,12=1 时,a2 与 c2F 第 12 位可变而 b2 不变。
- (h) a2,24=0 时,c2F 与 d2 第 24 位可变而 b2 不变。
- (i) c2F、d2、a2 第 7 位同时变化时,b2 仍可不变。
其余步的充分条件可用同样方式推出。
信息修改#
单一信息修改。通过改消息字可提前满足部分充分条件。对 M0(或 M1)及相应中间链接值,可修改消息使表 4、表 6 中第一阶段(前 16 步)条件几乎必然成立。例如为满足表 4 中 c1 的三个条件,可令
c1newm2new←c1old−c1,7old⋅26−c1,12old⋅211−c1,20old⋅219,←((c1new−c1old)⋙17)+m2old.对 M0 各字做完修改后,第一阶段条件成立,第一块差分概率约为 2−43;对 M1 类似修改后,第二块约为 2−37。
多重信息修改。还可满足部分前 32 步条件。例如若 a5,32=1,可改 m1,…,m5 使其变为 0,从而在第 2–6 步形成局部碰撞且不破坏第一阶段条件(见表 1)。之后表 4 第 2–4 阶段约剩 37 个未定条件,表 6 约剩 30 个,故两块差分概率分别约为 2−37 与 2−30。
攻击流程#
目标是实现
ΔH0(M0,M0′),2−37ΔH1(M1,M1′),2−30ΔH=0.
- 重复直至找到 M0:随机取 M0 → 信息修改 → 令 M0′=M0+ΔM0 检验第一块差分(概率约 2−37)→ 用压缩函数核对特征。
- 重复直至碰撞:随机取 M1 → 信息修改 → 用 M1 与 M1+ΔM1 检验第二块差分(概率约 2−30)→ 检查是否碰撞。
实现上,M0′ 只需改 M0 最后两字;前 14 字的单一修改开销可忽略。对每个候选 M0,约需对最后两字各做一次单一修改,并在第二阶段做约 7 次多重修改,总时间不超过约两次 MD5。计入这些后,搜索 (M0,M0′) 的复杂度不超过约 239 次 MD5。
表 2 给出两个碰撞实例:二者第一块完全相同;一旦第一块满足条件,第二块通常很容易找到。
上述模差方法使寻找 MD5 碰撞变得现实可行,并可用于其它哈希。论文给出的粗略复杂度如下(不含 / 含多重信息修改):
- MD4:约 223 / 28 次 MD4;
- HAVAL-128:约 213 / 27 次;
- RIPEMD:约 230 / 218 次;
- SHA-0:约 261 / 245 次。
附录:原文表格截图#
下列截图依次对应正文中的表 1–6(信息修改示例、碰撞实例、差分特征与充分条件等)。
表 1 多重信息修改示例
表 2 MD5 碰撞实例
表 3 第一块消息的差分特征
表 4 第一块相关充分条件
表 5 第二块消息的差分特征
表 6 第二块相关充分条件