Hash长度扩展攻击--MD5
来源:互联网 发布:热门小说大全软件 编辑:程序博客网 时间:2024/06/05 06:57
MD5算法
MD5的算法比较简单,大概加密过程来看就是类似下图!
首先是数据填充:首先要知道的是,md5后面运算过程都是需要512比特为一组来进行运算,先说一下简单的数据比较少 不存在分组的时候的填充,首先512比特的末尾64比特是存放原明文消息的长度,512比特开始是明文数据紧接着明文后填一位1(2进制),其余全是0,假设我明文就一个字符串‘test’那么填充就是0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000
最后四字节也就是2000000000000000代表前面’test’的长度
下面说一下具体的一些计算:在MD5中有四个32位的被称作链接变量的整数参数,是如下设置(这个ABCD是初始的固定的值):
A=0x67452301,
B=0xefcdab89,
C=0x98badcfe,
D=0x10325476。
之后有四个非线性函数,将字符串和那四个链接变量经过一系列的复杂运算,算出一组新的A,B,C,D的值,如果消息小于512,也就是只需要计算一次,这时候将新的ABCD的值按ABCD的顺序级联,然后输出,就是MD5的值,如果消息大于512的话,就用第一次算的MD5的值进行后半部分的运算,以此类推。
举个例子
比如计算字符串“test”
十六进制0x74657374
二进制0b1110100011001010111001101110100
这里与448模512不同余,补位后的数据如下
十六进制
0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000
二进制
0b1110100011001010111001101110100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000
将补位后的数据进行一次复杂的运算,计算出
A=0xcd6b8f09
B=0x73d32146
C=0x834edeca
D=0xf6b42726
数据小于512位,所以将ABCD通过小端规则转换就是MD5值:098f6bcd4621d373cade4e832627b4f6
如果我输入的数据不是test而是一串很长的字符,换算出来大于512小于1024,就需要计算两次,第一次先计算前512位的ABCD的值,算出来后再用这个ABCD去计算后面512位的的ABCD的值,最后算出来的ABCD经过拼接就是这串字符的MD5了
问题来了
如果这么一个情况,由两个字符串组成一个字符串(
首先正向计算一遍
假如第一个字符串$a=“test”,为了方便转为十六进制0x74657374
我构造第二个字符串首先手动将$str补成一个标准的可以直接计算的512位
$str=0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000
这样子,这时候再在后面追加一个0x746573748
$str=0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000746573748
这时候再将$str大于512位,程序会先将这串数据补为1024位,补充完如下
$str=0x7465737480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000074657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000
这时将$str分为两部分
74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000
和
74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000
这时候程序计算前一部分的ABCD的值,由于和之前算的test的数值是相同的所以
A=0xcd6b8f09
B=0x73d32146
C=0x834edeca
D=0xf6b42726
到了第二部分,第二部分的计算是用的第一部分的ABCD去计算,计算新的ABCD如下
A=0x226359e5
b=0x99df12eb
C=0x6853f59e
D=0xf5406385
最后算出来的MD5是e5596322eb12df999ef55368856340f5
这时候我们按照给定条件来计算一遍
我们知道的条件
1.$a的MD5(098f6bcd4621d373cade4e832627b4f6)
2.$a的长度=4
3.$b我们可以任意控制
由1我们可以逆推算出其ABCD的值
A=0xcd6b8f09
B=0x73d32146
C=0x834edeca
D=0xf6b42726
我们构造$b=’\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00’+’test’
此时
$str=’aaaa’+’\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00’+’test’
好了我们脑补一下程序计算str的过程
1.由于大于512位,先补全为1024位,
2.将其分为两部分
3.计算第一部分的ABCD的值
4.再用第一部分算出来的ABCD拿来算第二部分的值。
这里由于第一部分的ABCD我们可以逆推出来,我们可以直接跳过前三部分直接进行第四部分的计算,只需要将标准的MD5的源码里面的初始的ABCD的值改为逆推出来的那个值
我们用假的初始的ABCD计算一下
0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000
的MD5,发现是e5596322eb12df999ef55368856340f5,和上面正向计算出来的一样!
- Hash长度扩展攻击--MD5
- 用MD5实现hash长度扩展攻击 By Assassin
- 长度扩展攻击
- MD4长度扩展攻击
- 长度扩展攻击详解
- hash哈希长度扩展攻击解析(记录一下,保证不忘)
- 哈希长度扩展攻击解析
- 哈希长度扩展攻击以及HashPump
- Hashpump实现哈希长度扩展攻击
- #hash#:md5
- phpwind 利用哈希长度扩展攻击进行getshell
- [CTF]No.0003 哈希长度扩展攻击以及HashPump
- HASH注入式攻击
- HASH传递攻击
- hash ddos攻击
- 关于HASH和MD5
- HASH和MD5(转)
- MD5 Hash NSURL
- hiho 1643最少换乘 O(n)复杂度
- HDOJ 2136 Largest prime factor
- android 运用tensorflow以及遇到的问题
- KaFka单机安装
- Eureka、Ribbon和Feign
- Hash长度扩展攻击--MD5
- BDTC 2017丨大数据在金融、交通、医疗、工业领域落地实践与应用
- javascript中的原型与继承1--原型链Prototype Chaining
- form表单中input readonly 和 disable的区别
- HTTP协议之multipart/form-data请求分析
- JVM堆内存划分及简单调整
- leetcode_11. Container With Most Water ? 待解决
- 在python代码中输出一个字符的unicode编码
- python3和python2的区别