SHA1算法详解
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准里面定义的数字签名算法。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。算法无法从结果还原出原始信息,相对于MD5更加安全,速度要慢一些,操作要简单点。
一.术语解释
SHA1算法要用到一系列的位运算。
XOR(异或)、OR(或)、AND(与)、NOT(非)、<<(左移)、>>(右移)。右移示例:A>>n(n是常数,左移一样)。
另外还有一种比较复杂的位运算(循环左移):Sn(A) = (A<<n)OR(A>>32-n);数据左移一位,然后左边移出去的那一位填补到右边。
二.数据的前期一些处理
1.补位:我们先以字符为单位将其转换为十六进制Ascii码的排列。再将其转换为二进制排列,得到一个二进制数据。然后我们在数据后加上一个1,计算长度L对512的取余运算即:X=L%512,如果X不等于448,就在数据末尾加上一个0,一直循环到X=448为止。此时数据的长度应为512的n倍加上448,即L'=512*n+448。补位结束。
2.补长度与分块:我们得到一个长度L为512*n+448位的二进制字符串,我们在这个二进制字符串的末尾添加上一个长度为64位的二进制字符串,用来表示原消息数据的长度。我们最终得到一个长度L''=512*n(即长度为512的倍数)的二进制字符串。最后,我们判断这个二进制字符串的长度是否大于512位(即n是否为1)。若大于512位,我们则需要将其分割为长度为512位的多个字符串,这里用M[i](M[0],M[1]……)表示。若不大于,则直接用M0保存。补长度与分块结束。
三.常量值与函数表达式
常量:Kt = 0x5A827999 (0 <= t <= 19);Kt = 0x6ED9EBA1 (20 <= t <= 39); Kt = 0x8F1BBCDC (40 <= t <= 59); Kt = 0xCA62C1D6 (60 <= t <= 79)
表达式: ft(B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19); ft(B,C,D) = B XOR C XOR D (20 <= t <= 39); ft(B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59); ft(B,C,D) = B XOR C XOR D (60 <= t <= 79)。
四.算法
1.缓冲区:
处理上述的二进制字符串需要一些缓冲区,下面为各缓冲区的规格:
a.32位的缓冲区5个:A,B,C,D,E
b.32位的缓冲区80个:W[0]~W[79]
c.32位的缓冲区5个:H[0]~H[4]
d.32位的缓冲区1个:TEMP
首先我们将缓冲区H[]进行初始化赋值:
H[0]=0x67452301
H[1]=0xEFCDAB89
H[2]=0x98BADCFE
H[3]=0x10325476
H[4]=0xC3D2E1F0
2.针对每个M[i]进行循环:
a.将M[i]从左到右分割为16个32位的字符串,转换为uint型的数值分别存储在缓冲区W[0]~W[15]中。
b.对于W[16]~W[79],我们进行如下循环:
W[i] = S1(W[i-3] XOR W[i-8] XOR W[i- 14] XOR W[i-16])。 W[]缓冲区到此全部赋值完毕。
c.对缓冲区A,B,C,D,E分别进行赋值:
A=H[0]
B=H[1]
C=H[2]
D=H[3]
E=H[4]
d.对于W[0]~W[79],我们再进行如下循环:
TEMP = S5(A) + ft(B,C,D) + E + W[i] + K[i]
E=D
D=C
C=S30(B)
B=A
A=TEMP
e.我们再对缓冲区H[]进行操作:
H[0]=H[0]+A
H[1]=H[1]+B
H[2]=H[2]+C
H[3]=H[3]+D
H[4]=H[4]+E
3.完成每一个M[i]的循环后,最终得到的消息摘要为:
H[0] H[1] H[2] H[3] H[4]
此处缓冲区H[]中的数值全部转换为16进制数用字符串形式表示,上述格式排列即为最终计算出的消息摘要。