1.简介
美国国家标准与技术学会和NSA开发了安全散列算法(Secure Hash Algorithm,SHA)。SHA可以处理长度在
2
64
2^{64}
264以内的任何输入消息。SHA的输出是消息摘要,长度为160位(比MD5的消息摘要多32位)。SHA中的安全利用了两个特性,在计算上保证下列情况的不可行:
(1)根据消息摘要取得初始消息;
(2)寻找两个消息,产生相同消息摘要。
2.SHA工作原理
2.1 填充
和MD5一样,SHA的第一步是在初始消息末尾进行填充,使消息长度为512的倍数少64位。和MD5一样,填充总是增加,即使消息长度已经是比512的倍数少64。
2.2 添加长度
计算不包括填充的消息长度,用64位块加到填充后面。
2.3 将输入分为512位块
将输入分为512位块,这些块称为消息摘要处理逻辑的输入。
2.4 初始化链接变量
初始化5个链接变量A~ E,记住,MD5中为4个32位的链接变量,总长度为128位,中间结果和最终结果存放在这些链接变量构成的组合寄存器abcd中。SHA要产生的消息摘要为160位,因此要有5个链接变量,总长度为160位。SHA中变量A到D的值与MD5中相同,E初始化的C3 D2 E1 F0(十六进制)。
2.5 处理块
第一步:将链接变量A~ E复制到变量a~ e中,a~ e组合成寄存器abcde,存储中间结果和最终结果。
第二步:将当前512位块分解为16个子块,每个子块为32位。
第三步:SHA共4轮,每一轮20步。每一轮的3个输入为当前512位块、寄存器abcde和常量K[],其中t为0~ 79。然后用SHA算法步骤更新寄存器abcde内容。另外,MD5中的t定义64个常量,而这里的K[]之定义4个常量,每一轮用一个。K[]的值如下表所示:
轮次 | t值范围 | K[t]的十六进制值 | K[t]的十进制值(只显示整数部分) |
---|---|---|---|
1 | 1~19 | 5A 92 79 99 | 2 30 × 2 2^{30}\times \sqrt2 230×2 |
2 | 20~39 | 6E D9 EB A1 | 2 30 × 3 2^{30}\times \sqrt3 230×3 |
3 | 40~59 | 9F 1B BC DC | 2 30 × 5 2^{30}\times \sqrt5 230×5 |
4 | 60~79 | CA 62 C1 D6 | 2 30 × 10 2^{30}\times \sqrt{10} 230×10 |
第四步:SHA共4轮,每轮20次迭代,共80次。一次SHA迭代的逻辑操作如下图所示:
一次SHA迭代的数学表示如下:
a
b
c
d
e
=
(
e
+
P
r
o
c
e
s
s
P
+
S
5
(
a
)
+
W
[
]
+
k
[
]
)
,
a
,
S
30
(
b
)
,
c
,
d
abcde=(e+Process P +S^5(a)+W[]+k[]),a,S^{30}(b),c,d
abcde=(e+ProcessP+S5(a)+W[]+k[]),a,S30(b),c,d
其中abcde位5个变量a、b、c、d、e构成的寄存器;Process P(处理P)位逻辑操作;
S
t
S^{t}
St
将32位子块循环左移t位;W[]从当前32位子块求出的32位值;k[]为5个常量之一。
注意,它与MD5相似,只是有小改动,使SHA比MD5更复杂。下面介绍处理P和W[]的含义,下表显示了每一轮的SHA-1中的处理P:
轮次 | 处理P |
---|---|
1 | (b AND c) OR ((NOT b) AND (d)) |
2 | b XOR c XOR d |
3 | (b AND c) OR (b AND d) OR (c AND d)) |
4 | b XOR c XOR d |
W[t]的值计算如下:
对W的前16个字(t=0~15),输入消息子块M[t]的内容变成W[t]内容,即把输入消息M的前16块复制到W。W的其余值用下列方程求出:
W
[
t
]
=
S
1
(
W
[
t
−
16
]
X
O
R
W
[
t
−
14
]
X
O
R
W
[
t
−
8
]
X
O
R
T
[
t
−
3
]
)
W[t]=S^1(W[t-16]\quad XOR\quad W[t-14] \quad XOR\quad W[t-8] \quad XOR\quad T[t-3])
W[t]=S1(W[t−16]XORW[t−14]XORW[t−8]XORT[t−3])
3.比较MD5与SHA-1
MD5与SHA-1都基于MD4算法,因此可以进行比较,两者的差别如下表所示:
特性 | MD5 | SHA-1 |
---|---|---|
消息摘要长度(位) | 128 | 160 |
根据消息摘要寻找初始消息所需的操作 | 2 128 2^{128} 2128次 | 2 160 2^{160} 2160次 |
寻找产生相同消息摘要的两个消息所需的操作 | 2 64 2^{64} 264次 | 2 80 2^{80} 280次 |
目前攻击情况 | 一定程度没有 | 还没有 |
速度 | 块 | 慢 |
软件实现 | 简单,不需要大程序和复杂表格 | 简单,不需要大程序和复杂表格 |
4.SHA-1的安全性
NIST寻找了更安全的SHA版本,出现了如下版本:2002年,NIST在标准文档FIPS 1802中提供了另一个新的SHA版本,称为SHA-256、SHA-384和SHA-512,其后面的数字表示为消息摘要的长度(以位为单位),下表归纳了不同的SHA版本:
参数 | SHA-1 | SHA-256 | SHA-384 | SHA-512 |
---|---|---|---|---|
消息摘要长度 | 160 | 256 | 384 | 512 |
消息长度 | < 2 64 <2^{64} <264 | < 2 64 <2^{64} <264 | < 2 128 <2^{128} <2128 | < 2 128 <2^{128} <2128 |
块大小 | 512 | 512 | 1024 | 1024 |
词大小 | 32 | 32 | 64 | 64 |
算法所需步骤 | 80 | 64 | 80 | 80 |