转自 http://blog.csdn.net/lkiller_hust/article/details/51344828
SM3杂凑算法是中国国家密码局公布的hash算法商用标准,能应用于数字签名与验证、消息认证码的生成以及伪随机数的生成。
1. 常数与函数
1.1 初始值
IV = 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
1.2 常量
Tj={ 79cc4519 0≤j≤15;7a879d8a 16≤j≤63}
1.3 布尔函数
FFj(X,Y,Z)={X^Y^Z 0≤j≤15;(X & Y)|(X&Z)|(Y&Z) 16≤j≤63}
GGj(X,Y,Z)={X^Y^Z 0≤j≤15;(X & Y)|(~X&Z)16≤j≤63}
X,Y,Z为字(32bit)
1.4 置换函数
P0(X)= X^(X<<<9)^(X<<<17)
P1(X)= X^(X<<<15)^(X<<<23)
X 为字
2. 算法简介
SM3算法能够对长度为l(l<2^64)bit的消息m,进行填充和迭代压缩,生成杂凑值,最终的杂凑值为256bit。
2.1 填充过程
设消息m的长度为l bit,首先将bit"1"添加到消息末尾,再加k个“0”,k是满足l+1+k =448 mod 512的最小非负整数。然后再添加一个64bit串,该串是l的二进制表示,填充后的消息m'长度为512的整数倍。
2.2 迭代压缩
迭代过程:
m'按照512bit进行分组:m'=B(0)B(1)...B(n-1)
n=(l+k+65)/512.
迭代过程如下:
FOR i=0 to n-1
V(i+1) = CF(V(i),B(i)
ENDFOR
CF为压缩函数,V(0)为初始值IV,迭代压缩的结果为V(n)
消息扩展:
消息分组B(i)扩展生成132个字W0,W1,...W67,W0',W1'...W63'。
a)消息分组B(i)划分为16个字W0,W1,...W15.
b)FOR j=16 to 67
Wj=P1(Wj-16 ^ Wj-9 ^ (Wj-3 <<<15)^(Wj-13<<<7)^Wj-6
ENDFOR
c)FOR j=0 to 63
Wj'=Wj^Wj+4
ENDFOR
压缩函数:
A/B/C/D/E/F/G/H为字寄存器,SS1/SS2/TT1/TT2为中间变量,压缩函数V(i+1) = CF(V(i),B(i))计算过程如下:
ABCDEFGH = V(i)
FOR j=0 to 63
SS1 = ((A<<<12)+E+(Tj<<<j))<<<7
SS2 = SS1^(A<<<12)
TT1 = FFj(A,B,C)+D+SS2+Wj'
TT2 = GGj(E,F,G)+H+SS1+Wj
D = C
C = B<<<9
B = A
A = TT1
H = G
G = F<<<19
F = E
E = P0(TT2)
ENDFOR
V(i+1) = ABCDEFGH^V(i)
运算过程中,字按照大端格式存储。
2.3 杂凑结果
杂凑结果为256bit值y=ABCDEFGH=V(n)