一、摘要算法大致都要经过以下步骤
1. 明文数据预处理
1.1 填充比特
MD5、SHA1、SHA256 的分组长度都是512bit 需要填充比特使其位长对512求余的结果等于448
SHA512 的分组长度是 1024bit 需要填充比特使其对1024求余的结果等于896
相同:
填充内容都是:先填充一个1,后面跟对应个数的0
刚好512求余的结果等于448时也要附加一个分组
以MD5例:
61 62 63 64 31 32 33 34 >>> 61 62 63 64 31 32 33 34 80 00 00 ... 00 00
1.2 附加消息长度
不同:
MD5 附加消息长度(64bit表示) 转小端字节序
SHA1、SHA256 附加消息长度(64bit表示) 无需转小端字节序
SHA512 附加消息长度(128bit表示) 无需转小端字节序
相同:
如果内容过长,64/128bit个比特放不下。就取低64/128bi
以MD5例:
00 00 00 00 00 00 00 40 转小端字节序 40 00 00 00 00 00 00 00
61 62 63 64 31 32 33 34 80 00 00 ... 00 00 附加消息长度
61 62 63 64 31 32 33 34 80 00 00 ... 00 00 40 00 00 00 00 00 00 00
2. 摘要计算
2.1 常量初始化
MD5 4个64bit初始化常量 64个K
SHA1 5个64bit初始化常量 4个K
SHA256 8个64bit初始化常量 80个K
SHA512 8个128bit初始化常量 80个K
2.2 分组及分组拓展和分组分段
MD5、SHA1、SHA256 的分组长度都是512bit SHA512的分组长度是 1024bit
MD5 512bit分为16段每段32bit 无需拓展 改成小端字节序
SHA1 512bit分为16段每段32bit 加上了扩展出来的64段,共80段 不用改
SHA256 512bit分为16段每段32bit 加上了扩展出来的64段,共80段 不用改
SHA512 1024bit分为16段每段64bit 加上了扩展出来的64段,共80段 不用改
SHA1 分组拓展
SHA1与SHA0的区别就是在扩展这64段的时候,增加了CLS1(循环左移1位)
SHA256 和 512 分组拓展
σ0(x)=R1(x)⊕R8(x)⊕S7(x)
σ1(x)=R19(x)⊕R61(x)⊕S6(x)
Rn(x)对变量x循环右移nbit
Sn(x)对变量x左移nbit,右边填充0
2.3 轮函数(每段一轮,此外MD5还会重复4轮)
红色田字方块或+号代表 mod 2^32^ 相加,即将两个数字加在一起,如果结果大于$ 2^32^ , 需除以 2^32^ 并找到余数
MD5
F 函数有四个
循环轮数 对应的逻辑函数 (&是与,|是或,!~是非,^是异或)
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)
SHA1
SHA256
∑0(x)=S2(x)⊕S13(x)⊕S22(x)
∑1(x)=S6(x)⊕S11(x)⊕S25(x)
Rn(x)对变量x循环右移nbit
Sn(x)对变量x左移nbit,右边填充0
SHA512
∑0(x)=R28(x)⊕R34(x)⊕R39(x)
∑1(x)=R14(x)⊕R18(x)⊕R41(x)
2.4分组摘要结果
最后一轮的输出和第一轮的输入即初始化常量相加(模2的32次方)
以SHA512为例
2.5 组间数值传递
取决于分组加密模式 ECB CBC OFB CFB
分组加密模式 ECB CBC OFB CFB_qq_36488756的博客-CSDN博客
2.6 输出摘要
MD5 转为大端字节序然后拼接得到128bit输出
SHA1 拼接得到128bit输出
SHA256 拼接得到258bit输出
SHA512 拼接得到512bit输出
二、MAC算法
MAC算法其实就是两次加盐,两次hash的一种hash算法
以HmacMD5为例
m 明文
K’ 扩展后的密钥
ipad 0x36
opad 0x5c
|| 级联
H hash函数
1.密钥K拓展为K'
1) 假设密钥"a12345678"转Hex编码
61 31 32 33 34 35 36 37
2) 然后填充0,让密钥长度到达算法的分组长度,MD5的话就是512bit
61 31 32 33 34 35 36 37 38 00 00 ... 00 00
3) 如果密钥太长,就先进行MD5,再填充0
16字节 + 一堆00
2.扩展后的密钥与0x36异或
61 31 32 33 34 35 36 37 38 00 00 ... 00 00
36 36 36 36 36 36 36 36 36 36 36 ... 36 36
⬇
K' 57 07 04 05 02 03 00 01 0e 36 36 ... 36 36
3.与明文级联
假设明文"a1234567"转Hex编码
61 31 32 33 34 35 36
⬇
57 07 04 05 02 03 00 01 0e 36 36 ... 36 36 61 31 32 33 34 35 36
4.进行Hash算法
h1 = Hash(57 07 04 05 02 03 00 01 0e 36 36 ... 36 36 61 31 32 33 34 35 36)
5.扩展后的密钥K'与0x5c异或
6.异或的结果与h1级联
7.再次进行Hash算法 de'dao'zu