国密算法系列之杂凑算法SM3

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

SM3算法图解

整体流程

SM3算法整体流程如下:
国密算法系列之杂凑算法SM3

可以看到,整个流程包括消息填充、分块、迭代压缩3个步骤。
其中,输入为长度l(l<264)的消息x,输出为256-bit的杂凑值yB0,B1,...Bn1为填充后消息的分块(共n个块),消息块大小为512-bit,CF为压缩函数,V0,V1,...Vn为各消息块迭代压缩结果,大小为256-bit,最终得到的消息杂凑值为y=Vn

压缩函数CF

压缩函数可表示为:
Vi+1=CF(Vi,Bi)i=0,...n1,V0=IV
IV=7380166f4914b2b9172442d7da8a0600a96f30bc163138aae38dee4db0fb0e4e

假设压缩函数处理第Bi个消息块,其流程如下:
国密算法系列之杂凑算法SM3
其中,ABCDEFGH为字寄存器,长度为32-bit,j为迭代轮数,TT1,TT2为中间值字寄存器;
可以看出压缩函数共有64轮迭代,ABCDEFGH寄存器值初始化为前一个消息块Bi1的压缩结果Vi

块消息扩展

块消息扩展是指将Bi扩展为132个字:W0,W1,...W67,W0,W1,...W63,过程如下:

W0,...W15 : 块切分为16个字;
W17,...W67 : WjP1(Wj16Wj16(Wj3<<<15))(Wj13<<<7)Wj13
W0,...W63 : WjWjWj+4

其中,P1(X)=X(X<<<15)(X<<<23), <<<指循环位左移。

计算中间值TT1,TT2

中间计算过程如下图所示:
国密算法系列之杂凑算法SM3

其中,

Tj={79cc4519,0j157a879d8a,16j63

FFj(X,Y,Z)={XYZ,0j15(XY)(XY)(YZ),16j63

GGj(X,Y,Z)={XYZ,0j15(XY)(¬XZ),16j63

X,Y,Z为字,为与运算,为或运算,¬为非运算,为异或运算。
SS1((A<<12)+E+(Tj<<j))7

SS2SS1(A12)

TT1FFj(A,B,C)+D+SS2+Wj

TT2GGj(E,F,G)+H+SS1+Wj

更新ABCDEFGH

在计算的TT1,TT2中间之后,依次更新各个寄存器如下:
国密算法系列之杂凑算法SM3

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