type
status
date
slug
summary
tags
category
icon
password
一、简介
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。 1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
二、MD5 哈希算法流程
1、按位补充数据
在MD5算法中,首先需要对信息进行填充,这个数据按位(bit)补充,要求最终的位数对512求模的结果为448。补位至 N *512+448。即 N *64+56个字节(Bytes),N为一个正整数
言而总之,至少补1位,而最多可能补512位 。
2、扩展长度
用一个64位的数字表示数据的原始长度b,把b用两个32位数表示。那么只取b的低64位。
当遇到b大于2^64这种极少遇到的情况时,数据就被填补成长度为512位的倍数。也就是说,
此时的数据长度是16个字(32位)的整数倍数。现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。
3、初始化MD缓存器
MD5运算要用到一个128位的MD5缓存器,用来保存中间变量和最终结果。该缓存器又可看成是4个32位的寄存器A、B、C、D。初始化为:
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
4、处理数据段
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。
F(X,Y,Z) =(X&Y) | ((~X)&Z)
G(X,Y,Z) =(X&Z) | (Y&(~Z))
H(X,Y,Z) =X ^ Y^ Z
I(X,Y,Z)=Y^(X | (~Z))
(&是与,|是或,~是非,^是异或)
5、四轮运算
首先,应当将初始输入ABCD存起来:
第一轮:
F(X,Y,Z) =(X&Y)|((~X)&Z)
第二轮:
G(X,Y,Z) =(X&Z)|(Y&(~Z))
第三轮:
H(X,Y,Z) =X ^ Y ^ Z
第四轮:I(X,Y,Z)=Y^(X|(~Z))
四轮运算完成后,将此时的ABCD与原始输入分别相加。
至此,一次循环就完成了,最后的输出ABCD可以作为下一次的初始输入或最终输出。
三、测试
1、test1
输入为test1,输出为:5a105e8b9d40e1329780d62ea2265d8a
2、test2
再来看看2个分组的,输入为:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
输出为:8c0b45ac70826fd5e9e128bb53ccee
四、结论
MD5作为一种检验手段被广泛应用,特别在用户密码保存方面,因其不可逆和低碰撞的特性更是大受欢迎。安卓逆向中很多时候都会用到MD5,所以了解MD5对于逆向工程师来说是非常有必要的。
- 作者:404False
- 链接:https://blog.404nofoundx.top//article/47418f7b-906c-4adc-b2c4-9f0ed9e2f253
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。