背景知识
SHA(Secure Hash Algorithm)是由美国NIST设计,1993年作为联邦信息处理标准发布的。
SHA-0是SHA的早期版本,SHA-0被公布后,NIST很快发现了它的缺陷,修改后的版本为SHA-1,简称SHA。
目前NIST官方最新的版本为FIPS PUB 180-4(2015年8月)。
基本设定
输入消息的长度限制:小于264。
每次压缩的消息分组长度:512比特。
输出摘要长度:160比特。
SHA算法的结构包括消息填充,消息块扩展和消息压缩
三部分。下面依次介绍。
为了方便描述,将待压缩的消息用M表示。
填充规则
首先,对于待压缩的消息M,填充1个“1”和若干个“0”,使填充后的总比特长度模512等于448。
然后,留出的64比特用来记录填充前消息M的长度。注意,长度要用大端模式进行填充。
此时,填充后的消息M’长度为512的整数倍。
寄存器初始化
SHA算法的状态更新通过寄存器实现。由于算法输出长度为160比特,因此设置5个32比特的寄存器A、B、C、D、E。它们的初值为常数:
寄存器 | 初始值 |
---|---|
A | 0x67452301 |
B | 0xEFCDAB89 |
C | 0x98BADCFE |
D | 0x10325476 |
E | 0xC3D2E1F0 |
消息块扩展规则
对于每一个512比特的消息分块
M
i
M_i
Mi,需要将其扩展为80个字
W
t
W_t
Wt,供压缩阶段使用,其中
0
≤
t
≤
79
0\le t\le 79
0≤t≤79 。扩展规则为:
W
t
=
C
L
S
1
(
W
t
−
16
⊕
W
t
−
14
⊕
W
t
−
8
⊕
W
t
−
3
)
W_t=CLS_1(W_{t-16}\oplus W_{t-14}\oplus W_{t-8}\oplus W_{t-3})
Wt=CLS1(Wt−16⊕Wt−14⊕Wt−8⊕Wt−3)
其中前16个字
W
0
∼
W
15
W_0\sim W_{15}
W0∼W15为
M
i
M_i
Mi的16个32比特字。
C
L
S
s
CLS_s
CLSs表示对32比特长的数据循环左移s位。
压缩规则
压缩过程即更新寄存器的过程,共需迭代计算80次。更新规则为:
(
A
,
B
,
C
,
D
,
E
)
←
(
E
+
f
t
(
B
,
C
,
D
)
+
C
L
S
5
(
A
)
+
W
t
+
K
t
,
A
,
C
L
S
30
(
B
)
,
C
,
D
)
(A,B,C,D,E)\larr (E+f_t(B,C,D)+CLS_5(A)+W_t+K_t,A,CLS_{30}(B),C,D)
(A,B,C,D,E)←(E+ft(B,C,D)+CLS5(A)+Wt+Kt,A,CLS30(B),C,D)
其中 f t f_t ft函数中的运算是逐比特逻辑运算,即:
迭代次数 | 函数名 | 定义 |
---|---|---|
0 ≤ t ≤ 19 0\le t\le 19 0≤t≤19 | f 1 = f t ( B , C , D ) f_1=f_t(B,C,D) f1=ft(B,C,D) | ( B ∧ C ) ∨ ( B ‾ ∧ D ) (B\wedge C)\vee(\overline B\wedge D) (B∧C)∨(B∧D) |
20 ≤ t ≤ 39 20\le t\le 39 20≤t≤39 | f 2 = f t ( B , C , D ) f_2=f_t(B,C,D) f2=ft(B,C,D) | B ⊕ C ⊕ D B\oplus C\oplus D B⊕C⊕D |
40 ≤ t ≤ 59 40\le t\le 59 40≤t≤59 | f 3 = f t ( B , C , D ) f_3=f_t(B,C,D) f3=ft(B,C,D) | ( B ∧ C ) ∨ ( B ∧ D ) ∨ ( C ∧ D ) (B\wedge C)\vee(B\wedge D)\vee(C\wedge D) (B∧C)∨(B∧D)∨(C∧D) |
60 ≤ t ≤ 79 60\le t\le 79 60≤t≤79 | f 4 = f t ( B , C , D ) f_4=f_t(B,C,D) f4=ft(B,C,D) | B ⊕ C ⊕ D B\oplus C\oplus D B⊕C⊕D |
对应的真值表为:
B C D | f 1 f_1 f1 f 2 f_2 f2 f 3 f_3 f3 f 4 f_4 f4 |
---|---|
0 0 0 | 0 0 0 0 |
0 0 1 | 1 1 0 1 |
0 1 0 | 0 1 0 1 |
0 1 1 | 1 0 1 0 |
1 0 0 | 0 1 0 1 |
1 0 1 | 0 0 1 0 |
1 1 0 | 1 0 1 0 |
1 1 1 | 1 1 1 1 |
K t K_t Kt为4个常数:
迭代次数 | 函数名 |
---|---|
0 ≤ t ≤ 19 0\le t\le 19 0≤t≤19 | 0x5A827999 |
20 ≤ t ≤ 39 20\le t\le 39 20≤t≤39 | 0x6ED9EBA1 |
40 ≤ t ≤ 59 40\le t\le 59 40≤t≤59 | 0x8F1BBCDC |
60 ≤ t ≤ 79 60\le t\le 79 60≤t≤79 | 0xCA62C1D6 |
参考文献: