协议标准:http://www.sca.gov.cn/sca/xxgk/2010-12/17/1002389/files/302a3ada057c4a73830536d03e683110.pdf
算法处理分如下几步:
- 消息填充
消息填充分为两部分:第一部分是附加填充比特,第二部分是附加长度,目的是让整个消息满足指定的结构,从而处理起来可以统一化、格式化。
附加填充比特:指在消息尾部进行填充,使报文长度在对512取模后的余数为448。具体操作是:先被1比特1,然后都被0,直到满足对512取模余448。需要注意的是:即使原始消息长度已经满足对512取模余448,补位也需要进行,这时地填充512比特。所以附加填充时至少补1位,最多补512位。
附加长度:将原始数据的长度信息补到已经进行了填充的消息后面。
- 消息分组
消息分组指将消息填充后的数据按512bit(16*32bit)进行分组,并扩充为132*32bit,扩充算法如下:
当 0 ≤ t ≤ 15 时,W[t] = M[t],M[t]为512bit原始数据中第t个32bit数据。
当 16 ≤ t ≤ 67时,P1(X) = X ⊕ (X <<< 15) ⊕ (X <<< 23)
W[t] = P1(W[t-16] ⊕ W[t-9] ⊕ (W[t-3] <<< 15)) ⊕ (W[t-13] <<< 7) ⊕ W[t-6]
当 68 ≤ t ≤ 131时,W'[i] = W[i] ⊕ W[i+4],其中i=0..63
消息填充和消息分组处理图示如下:
- 迭代运算
SM3算法对输入的消息进行64轮迭代运算,输出256bit的HASH结果。
SM3处理过程中会用到8个哈希初值和2个哈希常量。
SM3的8个哈希初值分别为:
A=0x7380166F,B=0x4914B2B9,C=0x172442D7,D=0xDA8A0600
E=0xA96F30BC,F=0x163138AA,G=0xE38DEE4D,H=0xB0FB0E4E
2个哈希常量:
0≤𝑗≤15: 𝑇𝑗=0𝑥79𝐶𝐶4519
16≤𝑗≤63: 𝑇𝑗=0𝑥7A879D8A
SM3迭代运算的详细流程为:
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++)
{
SS1 = ((A <<< 12) + E + (Tt <<< t)) <<< 7
SS2 = SS1 ⊕ (A <<< 12)
TT1 = FFj(A, B, C) + D + SS2 + W‘[t]
TT2 = GGj(E,F,G) + H + SS1 + W[t]
D = C;
C = B <<< 9;
B = A;
A = TT1;
H = G;
G = F <<< 19;
F = E;
E = TT2 ⊕ (TT2 <<<9) ⊕ (TT2 <<< 17);
}
3. 结果输出
H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G,H7=H7+H