目录
1.MD5算法
1.1.1、位填充
1.1.1.1MD5每个分组是512,因此必须进行位填充
1.2.长度填充
1.3.初始化缓冲区
1.4.以512位分组为单位处理消息
1. 4.1、MD5的压缩函数Hmd5 (CVi-1,Yi-1)
1.4.2MD5的压缩函数基本描述
1.4.3MD5的压缩函数每一步工作原理
1.4.3.1MD5的每一步
编辑
eg 第一轮第一步
1.5.输出128位
MD5安全性
2.SHA-1算法
2.1位填充
2.2、长度填充
2.3、初始化缓冲区
2.4、以512位分组为单位处理消息
2.5、输出
2.6、算法示意图
2.6.1、四个逻辑函数
2.7SHA-1的后续修改
NIST于1981年提出了3个Hash算法
3,MD5&SHA-1
编辑
1.MD5算法
MD:消息摘要算法
输入为任意长,输出为128位
1.1.1、位填充
1.1.1.1MD5每个分组是512,因此必须进行位填充
- 填充消息使其长度n = 448 mod 512
- 即使消息长度本身满足条件,也必须填充(例如消息长度位448,也必须填充512)
- 填充由一个1和其余的0组成
- 位填充最小为1,最大为512
1.2.长度填充
- 用64位表示消息位填充前的长度
- 将该长度附加在位填充的消息后面——最低有效位在前
- 如果消息长度大于2的64次方,则只使用其低位64位(即消息长度对2的64次方取模)
1.3.初始化缓冲区
- MD5的中间结果CV保存在4个32位的寄存器(A,B,C,D)中
- A,B,C,D的初始值如下(最低有效位存放在低地址字节位置)
——A = 0x01 23 45 67
——B = 0x89 ab cd ef
——C = 0xfe dc ba 98
——D = 0x76 54 32 10
它们称为链接变量
1.4.以512位分组为单位处理消息
1. 4.1、MD5的压缩函数Hmd5 (CVi-1,Yi-1)
1.4.1.1定义四个辅助逻辑函数
——F(X,Y,Z) = XY v not(X) Z
——G(X,Y,Z) = XZ v not(Z)
——H(X,Y,Z) = X xor Y xor Z
——I(X,Y,Z) = Y xor (X v not(Z))
1.4.1.2每个逻辑函数输入是3个32位的字(x ,y , z ),输出是1个32位的字
MD5逻辑函数定义
循环次数 | 对应的逻辑函数 | C语言描述(&是与,|是或,!~是非,^是异或) |
1 | F(X,Y,Z) | (X & Y) | (~X & Z) |
2 | G(X,Y,Z) | X & Z | Y&(~Z) |
3 | H(X,Y,Z) | X^Y^Z |
4 | I(X,Y,Z) | Y^(X | ~Z) |
1.4.1.3常数表T
- MD5利用一个常数表T来对压缩过程的每一步增加不同的限制,并且用于消除输入中可能存在的规律。
- 常数表T有64个32位常数构成
- 每个常数利用正弦函数来构成
1.4.2MD5的压缩函数基本描述
——压缩函数用4轮来处理一个512分组
——在每1轮中512分组被进一步分为16个32位的小段:
- X[k], k = 0, 1, 2, ........,15
- X[k]在每1轮中恰好被使用一次:
- X[0]、X[2]、……,X[15]
- X[p2(i)],p2(i) = (1+5i) mod 16
- X[p3(i)],p3(i) = (5+3i) mod 16
- X[p4(i)],p4(i) = 7i mod 16
——每1轮利用1个逻辑函数对4个寄存器(A , B, C, D)进行16步操作
——每轮操作的结果均存放在A , B, C, D四个寄存器中
——第四轮的输出和第一轮的输入相加(模2的32次方)得到下一轮的输入
1.4.3MD5的压缩函数每一步工作原理
- 每1轮利用1个逻辑函数对4个寄存器(A ,B ,C ,D )进行16步操作
- 每步操作对A、B、C 和 D 四个存储器中的一个进行一次非线性函数运算,然后将所得结果加上第四个存储器的值、一个数据分块和一个常数值,在将所得结果循环左移一个不定的数。
- 每步操作的通用形式是(记做[abcd f k s i])
1. a = b + ((a + f(b,c,d) + X[k] + T[i]) <<< s)
——a , b , c , d 是A , B ,C ,D中的一个
——f是逻辑函数F、G 、H和I中的一个
2. b = a, c = b ,d = c,a = d(循环右移赋值)
- 每步操作的结果均存放在A, B ,C ,D四个寄存器中
MD5的四轮迭代
1.4.3.1MD5的每一步
eg 第一轮第一步
[ABCD F 0 7 1]
A = D
B = B + ((A + F(B,C,D) + X[0] + T[1]) <<< 7)
C = D
D = C
F(B , C , D) = (B & C) | (~B & D)
CLS7 : 循环左移7位
+ : 模2的32次方加运算
一步运算的实质:将(a , b , c , d )中的字右移一位
1.5.输出128位
——输出位A、B、C、D的值:低字节位A,最高字节位D
MD5安全性
——找到具有Hash值相同的两条消息的代价为: 2的64次方
——找到具有给定摘要的消息的代价为:2的128次方
2.SHA-1算法
2.1位填充
- 填充消息使得长度n = 448 mod 512
- 即使消息长度本身满足条件,也必须填充
- 填充由一个1和其余的0组成
- 位填充最小为1,最大为512
2.2、长度填充
- 用64位表示消息位填充前的长度
- 将该长度附加在位填充的消息后面(最高有效位在前)
- 如果消息大于2的64次方,则只使用其低64位(即消息长度对2的64次方取模)
2.3、初始化缓冲区
- SHA-1的中间结果CV保存在5个32位的寄存器(A,B,C,D,E)中
- A, B, C, D, E的初始值为
- A = 67 45 23 01
- B = ef cd ab 89
- C = 98 ba dc fe
- D = 10 32 54 76
- E = c3 d2 e1 f0
2.4、以512位分组为单位处理消息
2.5、输出
- 输出位A、B、C、D、E的值
- 结果160位
2.6、算法示意图
加法常量K的计算表
2.6.1、四个逻辑函数
步骤 | Kt的十六进制 | 取整数部分 |
0<= t <=19 | f1 = f(t,B,C,D) | (B&C)|((~B)&D) |
20<= t <=39 | f2 = f(t,B,C,D) | BCD |
40<=t<=59 | f3 = f(t,B,C,D) | (B&C)|(B&D)|(C&D) |
60<=t<=79 | f4 = f(t,B,C,D) | BCD |
SHA-1的压缩函数
- 压缩函数用4轮来处理一个512分组
- 每1轮利用1个逻辑函数对5个寄存器(A,B,C,D,E) 进行20步操作
- 每轮操作的结果均存放在A,B,C,D,E五个寄存器中
- 第四轮的输出和第一轮的输入相加(模2的32次方) 得到下一轮的输入
·SHA-1的压缩函数
- 每1轮利用1个逻辑函数对5个寄存器(A,B,C,D,E)进行206操作
-每步操作的通用形式是(记做[abcdfksi):
·ABCDE=(E+f(tBCD)+CLS(A)+W+K),ACLS(B)CD
-A,B,C,D,E是缓冲区的五个字-t:步数
-f(t,B,C,D):第t步用的逻辑函数-CLS(.):循环左移s位
-W:从当前512位导出的32位字- K:第t步的加法常量
一+:模232加法
-每步操作的结果均存放在A,B,C,D,E五个个寄存器中。文章来源:https://www.toymoban.com/news/detail-490349.html
文章来源地址https://www.toymoban.com/news/detail-490349.html
2.7SHA-1的后续修改
-
NIST于1981年提出了3个Hash算法
3,MD5&SHA-1
到了这里,关于哈希函数-md5实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!