SM3密码算法学习笔记
SM3密码算法是中国自主研发的一种密码哈希算法,具有高效、安全和可控的特点。它广泛应用于数字签名、消息认证码、随机数生成等密码学应用中,并且与国际上广泛使用的SHA-256等哈希算法相比,SM3算法具有更高的安全性和可控性。
1.概述
输入:0<L<264
输出:256bit 的消息摘要
对长度为L比特的消息m,SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。
2.填充
填充消息也就是进行补位操作,第一位补1,其余位补k个0,直到满足l+1+k≡448 mod 512。
一个消息填充的示例如下图:

3.迭代压缩
常数与函数
初始值
IV=7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
常量
Tj={79cc4519,7a879d8a,0≤t≤1516≤t≤63
布尔函数
FFj(X,Y,Z)={X⊕Y⊕Z,(X∧Y)∨(X∧Z)∨(Y∧Z),0≤t≤1516≤t≤63
GGj(X,Y,Z)={X⊕Y⊕Z,(X∧Y)∨(¬X∧Z),0≤t≤1516≤t≤63
式中X,Y,Z为字。
置换函数
P0(X)=X⊕(X<<<9)⊕(X<<<17)
P1(X)=X⊕(X<<<15)⊕(X<<<23)
式中X为字。
3.1 迭代过程
将填充后的消息m′分成512-bit的信息块,可以表示为m′=B(0)B(1)...B(n−1)
其中n=(l+k+65)/512
对m′进行n次迭代,V(i+1)=CF(V(i),B(i)),其中CF为压缩函数,V(0)为256比特初始值IV,B(i)为填充后的消息分组,迭代压缩的结果为V(n)。
3.2 消息扩展
将消息分组B(i)按如下方法扩展生成132个字W0,W1,...,W67,W0′,W1′,...,W63′,用于压缩函数CF
a) 将消息分组B(i)划分为16个字W0,W1,...,W15
b) 对于W16−W67,
Wj←P1(Wj−16⊕Wj−9⊕(Wj−3<<<15))⊕(Wj−13<<<7)⊕Wj−6
c) 对于W0′−W63′,
Wj′=Wj⊕Wj+4
3.3 压缩函数
令A、B、C、D、E、F、G、H为字寄存器,SS1、SS2、TT1、TT2为中间变量,压缩函数V(i+1)=CF(V(i),B(i)),0≤i≤n−1。计算过程描述如下
ABCDEFG←V(i)
执行64次运算
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)
执行这些运算后,执行
V(i+1)←ABCDEFG⊕V(i)
其中,字的存储为大端(big-endian)格式。
杂凑值
ABCDEFG←V(n)
输出256比特的杂凑值y=ABCDEFGH