算法处理分如下几步:
- 消息填充
消息填充分为两部分:第一部分是附加填充比特,第二部分是附加长度,目的是让整个消息满足指定的结构,从而处理起来可以统一化、格式化。
附加填充比特:指在消息尾部进行填充,使报文长度在对512取模后的余数为448。具体操作是:先被1比特1,然后都被0,直到满足对512取模余448。需要注意的是:即使原始消息长度已经满足对512取模余448,补位也需要进行,这时地填充512比特。所以附加填充时至少补1位,最多补512位。
附加长度:将原始数据的长度信息补到已经进行了填充的消息后面。
- 消息分组
消息分组指将消息填充后的数据按512bit(16*32bit)进行分组,并扩充为64*32bit,扩充算法如下:
当 0 ≤ t ≤ 15 时,W[t] = M[t],M[t]为512bit原始数据中第t个32bit数据。
当 16 ≤ t ≤ 63时,W[t] = W[t-7] + (W[t-2] >>> 17) ⊕ (W[t-2] >>> 19) ⊕ (W[t-2] >> 10) + \
W[t-16] + (W[t-15] >>> 7) ⊕ (W[t-15] >>> 18) ⊕ (W[t-15] >> 3)
消息填充和消息分组处理图示如下:
- 迭代运算
SHA-224/SHA-256算法对输入的消息进行64轮迭代运算,分别输出224bit和256bit的HASH结果。
SHA-224/SHA-256处理过程中会用到8个哈希初值和64个哈希常量。
SHA-224/SHA-256的8个哈希初值分别为:
SHA-224:
A=0xC1059ED8,B=0x367CD507,C=0x3070DD17,D=0xF70E5939
E=0xFFC00B31,F=0x68581511,G=0x64F98FA7,H=0xBEFA4FA4
SHA-256:
A=0x6A09E667,B=0xBB67AE85,C=0x3C6EF372,D=0xA54FF53A
E=0x510E527F,F=0x9B05688C,G=0x1F83D9AB,H=0x5BE0CD19
64个哈希常量:
0x428A2F98 | 0x71374491 | 0xB5C0FBCF | 0xE9B5DBA5 | 0x3956C25B | 0x59F111F1 | 0x923F82A4 | 0xAB1C5ED5 |
0xD807AA98 | 0x12835B01 | 0x243185BE | 0x550C7DC3 | 0x72BE5D74 | 0x80DEB1FE | 0x9BDC06A7 | 0xC19BF174 |
0xE49B69C1 | 0xEFBE4786 | 0x0FC19DC6 | 0x240CA1CC | 0x2DE92C6F | 0x4A7484AA | 0x5CB0A9DC | 0x76F988DA |
0x983E5152 | 0xA831C66D | 0xB00327C8 | 0xBF597FC7 | 0xC6E00BF3 | 0xD5A79147 | 0x06CA6351 | 0x14292967 |
0x27B70A85 | 0x2E1B2138 | 0x4D2C6DFC | 0x53380D13 | 0x650A7354 | 0x766A0ABB | 0x81C2C92E | 0x92722C85 |
0xA2BFE8A1 | 0xA81A664B | 0xC24B8B70 | 0xC76C51A3 | 0xD192E819 | 0xD6990624 | 0xF40E3585 | 0x106AA070 |
0x19A4C116 | 0x1E376C08 | 0x2748774C | 0x34B0BCB5 | 0x391C0CB3 | 0x4ED8AA4A | 0x5B9CCA4F | 0x682E6FF3 |
0x748F82EE | 0x78A5636F | 0x84C87814 | 0x8CC70208 | 0x90BEFFFA | 0xA4506CEB | 0xBEF9A3F7 | 0xC67178F2 |
SHA-224/256迭代运算的详细流程为:
1. 哈希初值赋值:
H0=A,H1=B,H2=C,H3=D,H4=E,H5=F,H6=G,H7=H
2. 64轮迭代运算
for (t=0; t≤63; t++)
{
T1 = H + (E >>> 6) ⊕ (E >>> 11) ⊕ (E >>>25) + (E & F) ⊕ (~E & G) + K[t] + W[t]
T2 = (A >>> 2) ⊕ (A >>> 13) ⊕ (A >>>22) + (A & B) ⊕ (A & C) ⊕ (B & C)
H = G;
G = F;
F = E;
E = D + T1;
D = C;
C = B;
B = A;
A = T1 + T2;
}
3. 结果输出
SHA-224输出224bit:
H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G
SHA-256输出256bit:
H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G,H7=H7+H