本文目的在我的上一篇文章《MD5算法,看这篇就够了》中,我描述了md5算法的基本步骤,今天跟大家分享一下破解md5的原理 。参考文献在文末,有兴趣的读者可以读读 。
符号文本中出现诸如M0,M1,以粗体字母+非粗体数字组合的符号等同于公式中该字母和以该数字作为下标的符号 。
MD5算法回顾首先我们来大概回顾一下MD5算法 。
- 填充 。将消息E的长度进行填充,使其满足对512取余为448 。
- 补充数据长度 。将原消息以64位表示,并添加到填充的数据之后,我们得到M 。
- 初始化缓存器 。A:01 23 45 67;B:89 ab dc ed;C:fe dc ba 98;D:76 54 32 10 。A,B,C,D都是32位的缓存器,在下一步运算中使用 。
- 进行迭代处理 。M的长度是512的整数倍(448+64),我们将数据M以512长度为单位进行划分,此时M=(M0,M1,M2....M(N-1)),在运算中我们将这512位用16个32位的数来表示 。接下来,我们对M进行遍历,对其中的每一项进行四轮运算,每一轮都要进行16则计算,计算的结果缓存到A,B,C,D缓存器中,并对下一次迭代产生影响 。
- 输出 。我们从A的低位字节开会,到D的高位字节结束,每一个都是32位,最终拼接的结果就是4*32 = 128位,这就是MD5计算的结果 。
文章插图
公式中的Mi表示为M中下标为i的元素,H0是缓存器中的初始值(A,B,C,D),Hi表示第i-1轮中缓存器中的结果,四轮运算我们抽象成函数f 。
差分攻击简介哈希函数最重要的分析方法是差分攻击,同时也是分析分组密码最重要的方法之一 。差分攻击大部分是使用异或运算的异或差分攻击,由Eli Biham和Adi Shamir在分析类似DES加密体系的安全性中提出的,他们描述差分密码分析是一种分析纯文本对(原文)中的特殊差异对产生的密码文本对的差异的影响的方法 。
在本文中,我们使用整数模减((A-B) mod C)来进行差分分析 。
差分攻击原理两个数之间的差我们表示为:
文章插图
对于M=(M0,M1,M2,....,M(N-1))和M'=(M0',M1',M2',....,M(N-1)') 。哈希函数的整个过程的差我们可以表示为:
文章插图
在上式中,△H0表示初始值(A,B,C,D)之间的差,显然是0 。△H表示最终两个消息之间的差,△Hi表示在第i次迭代之后结果的差,当然也是下次迭代的初始差值 。我们的目标很简单,假如我们使得最终的结果△H=0的话,也就是M和M'的哈希结果是一样的,M和M'就产生了碰撞 。
差分优化要想使得碰撞发生,即△H为0,需要满足的充分条件多达290多条(N=2),分布在每一轮运算的计算上,附录中给出了表格 。要想满足这些条件,提高碰撞的可能性,我们使用消息修改技术 。有两种修改方式 。
1、对于任意的消息块(Mi,Mi')第一轮运算的非0“差” 。
文章插图
其中△R,第二个下标表示轮数 。我们通过修改Mi的值,保证在第一轮运算中满足差分的条件 。
2、使用多消息修改机制,我们不仅能保证第一轮运算满足充分条件,同时也能都大幅提高第二轮运算条件满足的几率 。
MD5差分攻击对于MD5的差分攻击,同其他哈希函数大同小异 。这里我们攻击的目标是1024位M=(M0,M1)的消息体 。我们的目的就是根据差分值计算M'=(M0',M1'),使得MD5(M)=MD5(M') 。
步骤描述如下:
- 随机产生M0
- 使用消息修改算法修改M0,使之尽量满足充分条件;
- 如果所有的充分条件都满足,则计算MD5的输出并将其作为后半部分的链接变量,如果不满足,则回到第2步,重新随机选择;
- 随机产生M1
- 使用和前半部分相同的方法计算后半部分的输出 。需要注意的是,后半部分计算使用的链接变量初始值为前半部分的输出
参考文献
- Xiaoyun Wang,Hongbo Yu,How to Break MD5 and Other Hash Functions
- E. Biham, A. Shamir. Differential Cryptanalysis of the Data Encryption Standard
- The MD5 Message-Digest Algorithm
推荐阅读
- 拉绳开关原理及安装方法
- 美国公司找到芯片提速新方法!破解2D微缩关键瓶颈
- 【延时开关】延时开关的原理及特点
- 并使用java实现 一文看懂Base64原理
- Google 按图搜索的原理
- Python破解各路反爬措施,强势采集拉勾网数据
- 门磁开关的原理及常见故障
- 蚊香液是什么原理 蚊香液什么样是开的状态
- 如何喝红茶减肥红茶减肥原理
- 详细电磁炉原理讲解 电磁炉电路原理