SHA1
SHA1
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)
里面定义的数字签名算法(Digital Signature Algorithm DSA)。
该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
算法:
1.数据末尾填充0x80
39 31 31 4d 61 6f 48 61 69 “911MaoHai”
39 31 31 4d 61 6f 48 61 69 80
9 * 8 = 72 2.计算原始数据的长度
72 = 0x00 00 00 00 00000048
39 31 31 4d 61 6f 48 61 69 80 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 48 大端序的数据长度
3.用零填充直到数据的字节数是64的倍数为止
4.把数据进行分组一组为64(512位)个字节 进行计算最终获得一个20个字节的SHA1码
5.初始化五个值 小端序
A = 0x67452301;
B = 0xEFCDAB89;
C = 0x98BADCFE;
D = 0x10325476;
E = 0xC3D2E1F0;
6.将我们分好的64个字节扩充为320个字节 4个字节为一组循环80次
7.进行组一数据的计算
定义临时变量并赋值
a = A; b = B; c = C; d = D; e = E
8.计算e的值
e = (a << 5)+ f + e + k + w[i];
9.计算b的值
b = b<<30
10.交换数据
b = a
c = b
d = c
e = d
a = e
循环8.9.10三个步骤80次
11.计算
A = A + a;B = B + b;C = C + c;D = D + d;E = E + e
10.跟新7.中a,b,c,d,e计算组二数据
当完成最后一组数据的计算获得 A;B;C;D;E以da端序组合获得最终20个字节(160Bits)就是SHA1码
如:A1A2A3A4 B1B2B3B4 C1C2C3C4 D1D2D3D4 E1E2E3E4
A1A2A3A4B1B2B3B4C1C2C3C4D1D2D3D4E1E2E3E4
数据扩充到320个字节
将源数据的64个字节直接赋值到新的空间中
取出当前位置的前面第三个4字节 ^ 取出当前位置的前面第八个4字节 ^ 取出当前位置的前面第十四个4字节 ^ 取出当前位置的前面第十六个4字节
循环左移一位 结果大端序存储
共循环64次
39 31 31 4d 61 6f 48 61 69 80 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 48
75 5A DF A0 —-后面的256个字节需要填充
00 00 00 00 ^ 00 00 00 00 ^ 00 00 00 00 ^ 61 69 80 00 << 1 = 75 5A DF A0
共循环80次
f、k的计算
0-19
f = d^(b&(c^d))
k = 0x5A827999
20-39
f = b^c^d
k = 0x6ED9EBA1
40-59
f = (b&c)|(b&d)|(c&d)
k = 0x8F1BBCDC
60-79
f = b^c^d
k = 0xCA62C1D6
共循环80次
w[i]的计算
数据扩充后的第i个4个字节整型 大端序取出
第一次
39 31 31 4d
第二次
4d 61 6f 48
1 | Note: All variables are unsigned 32 bits and wrap modulo 232 when calculating |