白乐天

道阻且长,行则将至。

详解SM3

SM3介绍

SM3 是中国国家密码管理局发布的密码杂凑算法(Hash Algorithm),SM3 是一种密码学安全哈希函数,用于生成固定长度的消息摘要(通常为 256 比特),广泛应用于数字签名、消息认证码、数据完整性校验等领域。

初始向量

8个32位寄存器IV

1
2
3
4
5
6
7
8
H0=A=0x7380166F,
H1=B=0x4914B2B9,
H2=C=0x172442D7,
H3=D=0xDA8A0600,
H4=E=0xA96F30BC,
H5=F=0x163138AA,
H6=G=0xE38DEE4D,
H7=H=0xB0FB0E4E

消息预处理

消息填充

把输入数据填充到64字节(512位)的倍数(最少填充9个字节,最多填充64+8个字节)。

填充方式:

  • 在原始数据的后面填充0x80
  • 填充N个0
  • 使用大端序在最后8个字节填充输入数据的bit长度

分组处理

将填充后的消息划分为 512 比特的分组Bi,每个分组划分为16个32比特字W0,W1,W2,W3 … … W15(大端序)

消息扩展

把16个32比特字扩展为132个32比特字(前68个字,后64个字)

前68个字

初始16个字来自分组

1
Wj=Wj(i)0≤j≤15

后续的52个字

1
Wj=P1(W(j−16)⊕W(j−9)⊕(W(j−3)<<<15))⊕(W(j−13)<<<7)⊕W(j−6),16≤j≤67

置换函数P1(X)

1
P1(X)=X⊕(X<<<15)⊕(X<<<23)

通过循环移位和异或操作,破坏输入数据的线性结构,增强扩散性。

后64个字

直接由前68个字生成

1
Wj′=Wj⊕W(j+4),0≤j≤63

这样就得到了132个32比热的字

迭代压缩

将消息扩展后的132个字(Wj Wj′)与初始向量(IV)结合,通过多轮非线性操作生成最终的256位哈希值。

加载初始值

初始寄存器值 V(i)=(A,B,C,D,E,F,G,H)。

如果是第一个分组,V(0) 为IV;后续分组使用前一分组的输出。

64轮迭代更新

轮常量Tj

1
2
3
4
5
Tj=
{
0x79CC4519, 0≤j≤15(前16轮)
0x7A879D8A, 16≤j≤63(后48轮)
}

逻辑函数FFj和GGj

1
2
3
FFj(X,Y,Z) = X⊕Y⊕Z		GGj(X,Y,Z)=X⊕Y⊕Z	,0≤j≤15(前16轮)
FFj(X,Y,Z) = (X&Y)|(X&Z)|(Y&Z) ,16≤j≤63(后48轮)
GGj(X,Y,Z) = (X&Y)|(~X&Z) ,16≤j≤63(后48轮)

以第j轮迭代流程为例

计算中间变量SS1 和 SS2

结合寄存器和轮常量

1
2
SS1=((A<<<12)+E+(Tj<<<j))<<<7
SS2=(SS1⊕A<<<12)

计算临时变量TT1和TT2

1
2
TT1 = FFj(A,B,C) + D + SS2 + Wj'
TT2 = GGj(E,F,G) + H + SS1 + Wj

更新寄存器

1
2
3
4
5
6
7
8
D=C
C=B<<<9
B=A
A=TT1
H=G
G=F<<<9
F=E
E=P0(TT2)
置换函数P0
1
P0(X)=X⊕(X<<<9)⊕(X<<<17)

结果输出

1
H0=H0⊕A,H1=H1⊕B,H2=H2⊕C,H3=H3⊕D,H4=H4⊕E,H5=H5⊕F,H6=H6⊕G,H7=H7⊕H

按照大端序排列输出