SHA1算法介绍
- 背景知识
-
- 基本设定
- 填充规则
- 初始化寄存器
- 扩展规则的新闻块
- 压缩规则
背景知识
SHA(Secure Hash Algorithm)是由美国NIST1993年作为联邦信息处理标准发布的设计。 SHA-0是SHA早期版,SHA-0被公布后,NIST修改后的版本很快就发现了它的缺陷SHA-1,简称SHA。 目前NIST最新的官方版本是FIPS PUB 180-4(2015年8月)。
基本设定
输入信息的长度限制:小于264。 新闻分组长度:512比特。 输出摘要长度:160比特。 SHA算法的结构包括信息填充、信息块扩展和信息压缩 三部分。下面依次介绍。 为便于描述,用M表示待压缩消息。
填充规则
首先,对于待压缩的消息M,填充一个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 |
参考文献:
- https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
- 现代密码学。杨波。