首页
社区
课程
招聘
[分享]MD5算法
2021-9-11 17:44 22051

[分享]MD5算法

2021-9-11 17:44
22051

目录

简介

密码类型:hash(单向加密)
明文:任意长度
密文:128bits

MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。严格意义上,MD5并不是加密方式。

 

图片描述

 

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法

加密流程

加密流程如下图:
图片描述

初始化变量

用4个变量(A、B、C、D)来计算消息摘要。

1
2
3
4
A=0×01234567
B=0×89abcdef
C=0xfedcba98
D=0×76543210

数据填充

数据填充主要分为两部分:
1.填充消息使长度模512等于448
图片描述
填充方法:先附上位1在消息后面,然后用0进行填充,至少填充1位,至多填充512位。(原消息长度记为msg_len,须填充长度byte_len,单位字节)
2.再填充64位(字符串长度)
图片描述
接着在后面附上64位的原消息长度msg_len(注意是直接将64数进行位复制)。如果填充前消息的长度大于2^64,则只使用其低64位,这时填充完后消息长度刚好是512的整数倍。(填充后长度app_len = msg_len + byte_len + 64/8 )

数据处理

首先定义4个辅助函数,每个都是以DWORD作为输入,输出一个32位双字。

1
2
3
4
5
6
7
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))

四轮变换
将A、B、C、D的副本a、b、c、d中的3个经F、G、H、I运算后的结果与第4个相加,加上32位字和一个32位字的加法常数,并将所得之值循环左移若干位,最后所得结果加上a、b、c、d之一并返回给A、B、C、D
具体的数学表达式为:

1
2
3
4
FF(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (F(b, c, d) + Mj + ti) << s
  GG(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (G(b, c, d) + Mj + ti) << s
  HH(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (H(b, c, d) + Mj + ti) << s
  II(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (I(b, c, d) + Mj + ti) << s

上文提到的加法常数由表T[i]来定义(i为1至64中的值)。T[i]=42944967296*abs(sin(i)) (i用弧度来表示)
这四轮变换是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//一轮:
    FF(a, b, c, d, M0, 7, 0xd76aa478)
    FF(d, a, b, c, M1, 12, 0xe8c7b756)
    FF(c, d, a, b, M2, 17, 0x242070db)
    FF(b, c, d, a, M3, 22, 0xc1bdceee)
    FF(a, b, c, d, M4, 7, 0xf57c0faf)
    FF(d, a, b, c, M5, 12, 0x4787c62a)
    FF(c, d, a, b, M6, 17, 0xa8304613)
    FF(b, c, d, a, M7, 22, 0xfd469501)
    FF(a, b, c, d, M8, 7, 0x698098d8)
    FF(d, a, b, c, M9, 12, 0x8b44f7af)
    FF(c, d, a, b, M10, 17, 0xffff5bb1)
    FF(b, c, d, a, M11, 22, 0x895cd7be)
    FF(a, b, c, d, M12, 7, 0x6b901122)
    FF(d, a, b, c, M13, 12, 0xfd987193)
    FF(c, d, a, b, M14, 17, 0xa679438e)
    FF(b, c, d, a, M15, 22, 0x49b40821)
 
// 第二轮
   GG(a, b, c, d, M1, 5, 0xf61e2562)
   GG(d, a, b, c, M6, 9, 0xc040b340)
   GG(c, d, a, b, M11, 14, 0x265e5a51)
   GG(b, c, d, a, M0, 20, 0xe9b6c7aa)
   GG(a, b, c, d, M5, 5, 0xd62f105d)
   GG(d, a, b, c, M10, 9, 0x02441453)
   GG(c, d, a, b, M15, 14, 0xd8a1e681)
   GG(b, c, d, a, M4, 20, 0xe7d3fbc8)
   GG(a, b, c, d, M9, 5, 0x21e1cde6)
   GG(d, a, b, c, M14, 9, 0xc33707d6)
   GG(c, d, a, b, M3, 14, 0xf4d50d87)
   GG(b, c, d, a, M8, 20, 0x455a14ed)
   GG(a, b, c, d, M13, 5, 0xa9e3e905)
   GG(d, a, b, c, M2, 9, 0xfcefa3f8)
   GG(c, d, a, b, M7, 14, 0x676f02d9)
   GG(b, c, d, a, M12, 20, 0x8d2a4c8a)
 
//第三轮
   HH(a, b, c, d, M5, 4, 0xfffa3942)
   HH(d, a, b, c, M8, 11, 0x8771f681)
   HH(c, d, a, b, M11, 16, 0x6d9d6122)
   HH(b, c, d, a, M14, 23, 0xfde5380c)
   HH(a, b, c, d, M1, 4, 0xa4beea44)
   HH(d, a, b, c, M4, 11, 0x4bdecfa9)
   HH(c, d, a, b, M7, 16, 0xf6bb4b60)
   HH(b, c, d, a, M10, 23, 0xbebfbc70)
   HH(a, b, c, d, M13, 4, 0x289b7ec6)
   HH(d, a, b, c, M0, 11, 0xeaa127fa)
   HH(c, d, a, b, M3, 16, 0xd4ef3085)
   HH(b, c, d, a, M6, 23, 0x04881d05)
   HH(a, b, c, d, M9, 4, 0xd9d4d039)
   HH(d, a, b, c, M12, 11, 0xe6db99e5)
   HH(c, d, a, b, M15, 16, 0x1fa27cf8)
   HH(b, c, d, a, M2, 23, 0xc4ac5665)
 
//第四轮
   II(a, b, c, d, M0, 6, 0xf4292244)
   II(d, a, b, c, M7, 10, 0x432aff97)
   II(c, d, a, b, M14, 15, 0xab9423a7)
   II(b, c, d, a, M5, 21, 0xfc93a039)
   II(a, b, c, d, M12, 6, 0x655b59c3)
   II(d, a, b, c, M3, 10, 0x8f0ccc92)
   II(c, d, a, b, M10, 15, 0xffeff47d)
   II(b, c, d, a, M1, 21, 0x85845dd1)
   II(a, b, c, d, M8, 6, 0x6fa87e4f)
   II(d, a, b, c, M15, 10, 0xfe2ce6e0)
   II(c, d, a, b, M6, 15, 0xa3014314)
   II(b, c, d, a, M13, 21, 0x4e0811a1)
   II(a, b, c, d, M4, 6, 0xf7537e82)
   II(d, a, b, c, M11, 10, 0xbd3af235)
   II(c, d, a, b, M2, 15, 0x2ad7d2bb)
   II(b, c, d, a, M9, 21, 0xeb86d391)

输出

当512位分组都运算完毕,A、B、C、D的级联将被输出为MD5加密的结果

利用python进行md5加密

1
2
3
4
5
6
7
8
9
import hashlib
 
def computeMD5(message):
    m = hashlib.md5()
    m.update(message.encode(encoding='utf-8'))
    return m.hexdigest()
 
str = 'this is a md5 Test.'
print(computeMD5(str))

逆向特征

1.初始化数据
图片描述
2.轮操作
图片描述

SHA家族

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的几率很高。
下面是各个SHA的对比:
图片描述
除此之外,初始化的数据各有不同,下面是sha的初始化的数据:
图片描述
图片描述
图片描述

参考

SHA家族
《加密与解密》


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2021-9-11 19:19 被Max_hhg编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (4)
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2021-9-25 13:09
2
0
谢谢分享,我正好开始学习算法,这里有点不懂,如果消息长度小于512,补齐后加密刚好只用了一套四次轮换,用完这16个32位的数据,按照算法应该是可逆向出原始数据的,对不对
雪    币: 4181
活跃值: (5747)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Max_hhg 2021-9-29 19:24
3
0
wusha 谢谢分享,我正好开始学习算法,这里有点不懂,如果消息长度小于512,补齐后加密刚好只用了一套四次轮换,用完这16个32位的数据,按照算法应该是可逆向出原始数据的,对不对
应该是逆向不出来 
1.有个左移操作就会有数据损失 
2.4个辅助函数具有一定的混淆作用
雪    币: 5529
活跃值: (16450)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
wusha 2021-9-30 07:00
4
0

谢谢指点,我查了下,左移是循环左移,上次我说错了,通过最后的md5结果可以得到A,b,c,d,然后根据最后一轮的最后一次变换,如下
  II(a, b, c, d, Mj, s, ti)表示 A= b + ((a + (I(b, c, d) + Mj + ti) << s
里面有a和Mj两个未知,所以无法求解,但是如果原始信息长度已知,那意味着最后的Mj是知道的,那是不是就可以反推出a,再一路反推出所有Mj

最后于 2021-9-30 07:02 被wusha编辑 ,原因:
雪    币: 4181
活跃值: (5747)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Max_hhg 2021-9-30 07:53
5
0
wusha 谢谢指点,我查了下,左移是循环左移,上次我说错了,通过最后的md5结果可以得到A,b,c,d,然后根据最后一轮的最后一次变换,如下 &nbsp;II(a,&nbsp;b,&nb ...
你说得对 是循环左移
这个已经触及我的知识盲区  按照你的想法来说 确实有可能破解
我也只是个小白 谢谢你的指点 
游客
登录 | 注册 方可回帖
返回