杂凑算法,也称哈希算法,在信息安全领域中用于计算消息的摘要,校验消息的完整性。
国际标准的常用哈希算法有消息摘要算法MD5, 安全哈希算法SHA系列等。
本文介绍国家密码管理局发布的杂凑算法标准SM3,详见国家密码管理局官方网站.
SM3算法图解
整体流程
SM3算法整体流程如下:

可以看到,整个流程包括消息填充、分块、迭代压缩3个步骤。
其中,输入为长度l(l<264)的消息x,输出为256-bit的杂凑值y,B0,B1,...Bn−1为填充后消息的分块(共n个块),消息块大小为512-bit,CF为压缩函数,V0,V1,...Vn为各消息块迭代压缩结果,大小为256-bit,最终得到的消息杂凑值为y=Vn。
压缩函数CF
压缩函数可表示为:
Vi+1=CF(Vi,Bi),i=0,...n−1,V0=IV
IV=7380166f4914b2b9172442d7da8a0600a96f30bc163138aae38dee4db0fb0e4e
假设压缩函数处理第Bi个消息块,其流程如下:

其中,ABCDEFGH为字寄存器,长度为32-bit,j为迭代轮数,TT1,TT2为中间值字寄存器;
可以看出压缩函数共有64轮迭代,ABCDEFGH寄存器值初始化为前一个消息块Bi−1的压缩结果Vi。
块消息扩展
块消息扩展是指将Bi扩展为132个字:W0,W1,...W67,W′0,W′1,...W′63,过程如下:
W0,...W15 : 块切分为16个字;
W17,...W67 : Wj←P1(Wj−16⊕Wj−16⊕(Wj−3<<<15))⊕(Wj−13<<<7)⊕Wj−13;
W′0,...W′63 : W′j←Wj⊕Wj+4
其中,P1(X)=X⊕(X<<<15)⊕(X<<<23), <<<指循环位左移。
计算中间值TT1,TT2
中间计算过程如下图所示:

其中,
Tj={79cc4519,7a879d8a,0≤j≤1516≤j≤63
FFj(X,Y,Z)={X⊕Y⊕Z,(X∧Y)∨(X∧Y)∨(Y∧Z),0≤j≤1516≤j≤63
GGj(X,Y,Z)={X⊕Y⊕Z,(X∧Y)∨(¬X∧Z),0≤j≤1516≤j≤63
X,Y,Z为字,
∧为与运算,
∨为或运算,
¬为非运算,
⊕为异或运算。
SS1←((A<<12)+E+(Tj<<j))≪7
SS2←SS1⊕(A≪12)
TT1←FFj(A,B,C)+D+SS2+W'j
TT2←GGj(E,F,G)+H+SS1+Wj
更新ABCDEFGH
在计算的TT1,TT2中间之后,依次更新各个寄存器如下:

其中,P0(X)=X⊕(X<<<9)⊕(X<<<17)。