1.简介
SHA-512算法所使用的消息长度为 2 128 2^{128} 2128,生成一个大小为512位的消息摘要。其输出分成多个块,每个块的大小为1024位。SHA-512是严格按照SHA-1模型来的,而SHA-1又是按照MD5来的。
2.工作原理
2.1 填充
与MD5和SHA-1一样,SHA-512的第一步也是在初始消息中增加填充位,目的使初始消息长度等于一个值,即比1024的倍数少128位。注意,与MD5和SHA-1一样,填充总是要进行的,即使消息长度已经是1024的倍数少128位。
2.2 添加长度
计算不包括填充位的消息长度,并把它作为一个128位的块附加到填充位的后面,这样消息的长度正好是128的倍数。
2.3 将输入分成1024位的块
将输入消息分成多个块,每个块长度为512位。这些块就是消息摘要处理逻辑的输入。
2.4初始化链接变量
现在要初始化从A~ H的8个链接变量。在SHA-512中,要生成一个长度为512位的消息摘要,因此需要8个链接变量,每个含有64位。在SHA-512中,这8个链接变量的值如下表所示:
A=6A09E667F3BCC908 | B=BB67AE8584CAA73B |
---|---|
C=3C6FE373FE94F82B | D=A54FF53A5F1D36F1 |
E=510E527FADE682D1 | F=9B05688C2B3E6C1F |
G=1F83D9ABFB41BD6B | H=5BE0CD19137E2179 |
2.5处理块
这里的步骤和MD5和SHA-1的非常类似。
第一步:将链接变量A~ H复制到变量a~ h中,a~ h(称为abcdefgh)看作是单个寄存器,用于存储临时的中间结果和最终结果。
第二步:将当前的1024位块分解成16子块,每个子块64字。
第三步:SHA-512有80轮,每轮以当前的1024位块、寄存器abcdefgh和常量K[t](其中t=0~ 79)作为它的三个输入。然后用SHA-512算法步骤更新寄存器abcdrfgh的内容,每轮的操作如下图所示:
每轮包含以下操作:
Temp1=h+Ch(e,f,g)+Sum(ei for i=1 to 512)+Wt+Kt
Temp2=Sum(ai for i=0 to 512)+Maj(a,b,c)
a=Temp1+Temp2
b=a
c=b
d=c
e=d+Temp1
f=e
g=f
h=g
其中:
t=轮次号
Ch(e,f,g)=(e AND f) XOR (NOT e AND g)
Maj(a,b,c)=(a AND b) XOR (a AND c) XOR (b AND c)
Sum(ai)=ROTR(ai
×
\times
× 28位) XOR ROTR(ai
×
\times
× 34位) XOR ROTR(ai
×
\times
× 39位)
Sum(ei)=ROTR(ei
×
\times
× 14位) XOR ROTR(ei
×
\times
× 18位) XOR ROTR(ei
×
\times
× 41位)
ROTR(x)=循环右移,即,把64位数组移动指定数目的位
Wt=从当前512位输入块得出的64位词
Kt=63位添加常量
+(或AND)=相加结果mod
2
64
2^{64}
264
需要注意Wt的以下几点:
(1)对于前16轮(即0~ 15轮),Wt的值等于消息块的相应词。
(2)对于其余的64轮,Wt的值等于把前4个Wt的值与要进行移位和旋转操作的其中两个XOR操作后循环左移1位的结果。
这样就使得消息摘要更复杂,更难破解。