杂凑函数之SHA-1学习笔记
算法简介
SHA1(Secure Hash Algorithm 1,安全散列算法1)是一种密码散列函数,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布为联邦信息处理标准(FIPS)的出版物之一。SHA1算法能够产生一个160位(20字节)的散列值,通常表示为40个十六进制字符。
算法详解
输入:0<L<264
输出:160bit的消息摘要
SHA-1算法的主要流程如下图所示:

一. 预处理
1.消息填充
填充消息也就是进行补位操作,第一位补1,其余位补足够的0,直到满足L mod 512=448。
这里有一个问题,那就是为什么要补这个数量的0呢?答案就是剩余的512−448=64位,要存储消息的长度。
一个消息填充的示例如下图:

2.填充消息解析
将填充后的消息分成 N 个512-bit的信息块,可以表示为M(1),M(2),...,M(N)。因为512bits的信息块可以表示为16个32-bitz字,所以第i个信息块可以表示为M0(i),M1(i),...,M15(i)。
3.设置初始哈希值
初始哈希值H(0)由以下五个32-bit字组成。
H0(0)=67452301
H1(0)=efcdab89
H2(0)=98badcfe
H3(0)=10325476
H4(0)=c3d2e1f0
二.计算
预处理完成后,每个消息块M(1),M(2),...,M(N)按照以下顺序进行处理。
1.准备消息表
准备消息表Wt
Wt={Mt(i),ROTL1(Wt−3⊕Wt−8⊕Wt−14⊕Wt−16),0≤t≤1516≤t≤79
其中ROTL为左移位运算。
2.初始化工作变量
初始化a,b,c,d,e五个工作变量
a=H0(i−1)
b=H1(i−1)
c=H2(i−1)
d=H3(i−1)
e=H4(i−1)
3.执行80轮运算
由准备消息表中可知,t的数值范围为0到79,则根据t的数值,进行80轮运算,每轮运算执行以下计算:
T=ROTL5(a)+ft(b,c,d)+e+Kt+Wt
e=d
d=c
c=ROTL30(b)
b=a
a=T
其中涉及的有关运算如下:
Kt=⎩⎨⎧5a8279996ed9eba18f1bbcdcca62c1d60≤t≤1920≤t≤3940≤t≤5960≤t≤79
ft(x,y,z)=⎩⎨⎧Ch(x,y,z)=(x∧y)⊕(∼x∧z)Parity(x,y,z)=x⊕y⊕zMaj(x,y,z)=(x∧y)⊕(x∧z)⊕(y∧z)Parity(x,y,z)=x⊕y⊕z0≤t≤1920≤t≤3940≤t≤5920≤t≤39
4.计算中间哈希值
计算中间哈希值H(i)
H0(i)=a+H0(i−1)
H1(i)=b+H1(i−1)
H2(i)=c+H2(i−1)
H3(i)=d+H3(i−1)
H4(i)=e+H4(i−1)
三.最终结果
在重复进行上述计算过程N次后,消息M的160-bit消息摘要为
H0(N)∥H1(N)∥H2(N)∥H3(N)∥H4(N)
参考资料
参考文档:Secure Hash Standard