SM3介绍
SM3 是中国国家密码管理局发布的密码杂凑算法(Hash Algorithm),SM3 是一种密码学安全哈希函数,用于生成固定长度的消息摘要(通常为 256 比特),广泛应用于数字签名、消息认证码、数据完整性校验等领域。
初始向量
8个32位寄存器IV
1 | H0=A=0x7380166F, |
消息预处理
消息填充
把输入数据填充到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 | Tj= |
逻辑函数FFj和GGj
1 | FFj(X,Y,Z) = X⊕Y⊕Z GGj(X,Y,Z)=X⊕Y⊕Z ,0≤j≤15(前16轮) |
以第j轮迭代流程为例
计算中间变量SS1 和 SS2
结合寄存器和轮常量
1 | SS1=((A<<<12)+E+(Tj<<<j))<<<7 |
计算临时变量TT1和TT2
1 | TT1 = FFj(A,B,C) + D + SS2 + Wj' |
更新寄存器
1 | D=C |
置换函数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 |
按照大端序排列输出