分组长度
数据分组(明文,密文)长度=128位、密钥长度=128位
数据处理单位:字(32位)(32bit)
密码算法特点
对合运算:解密算法与加密算法相同 解密算法与加密算法相同
子密钥生成算法与加密算法结构类似 (加密算法与密钥扩展算法均采用32轮非线性迭代结构)
密码结构
滑动窗口结构
SM4 密码算法结构
加密流程还是分为两部分:明文加密部分与密钥扩展部分(每次密钥的生成)
明文加密部分
- 输入明文:(X0,X1,X2,X3),128位,四个字。
- 输入轮密钥:rki ,i=0,1,…,31,共32个轮密钥。
- 输出密文:(Y0,Y1,Y2,Y3),128位,四个字。
Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)【F为轮函数】
= Xi ⊕T( Xi+1⊕ Xi+2⊕ Xi+3⊕rki), i = 0,1…31
(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)【注意最后的反序】
F轮函数部分(经过32轮迭代)
1.S盒字节非线性替换(非线性变换τ)
- 把128bit明文分为4个32位字(X0,X1,X2,X3)
- X1,X2,X3,rK相互异或得到32位字
- 将这32位字并行输入5*4个S盒
输入的前半字节为行号,后半字节为列号,行列交叉点处的数据即为输出。(查S盒,与AES的字节替换类似)
2.字线性部件L变换
- 输出的结果再进行循环左移;
- 最后与X0进行异或。
32位输入,32位输出。
设输入为B,输出为C,表为:
C=L(B)
运算规则:
C=L(B)
=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18) ⊕(B<<<24)
X4=C⊕X0
并将输出结果添加到明文的最后一个字后,进入第二次轮函数……直到第32轮函数执行完毕。最后四次经过轮函数得到的(X35 X34 X33 X32)4个32位字即为密文。
密钥扩展部分(密钥的生成)
常数FK
在密钥扩展中使用一些常数,4个常数
FK0=(A3B1BAC6) =(A3B1BAC6)
FK1=(56AA3350) =(56AA3350)
FK2=(677D9197 ) =(677D9197 )
FK3=(B27022DC) =(B27022DC)
三、SMS4密码算法20
⑹密钥扩展算法
32个固定参数Cki,i=0,1,2…31
00070e15, 1c232a31, 383f464d, 545b6269, 00070e15, 1c232a31, 383f464d, 545b6269,
70777e85, 8c939aa1, a8afb6bd, c4cbd2d9, 70777e85, 8c939aa1, a8afb6bd, c4cbd2d9,
e0e7eef5, fc030a11, 181f262d, 343b4249, e0e7eef5, fc030a11, 181f262d, 343b4249,
50575e65, 6c737a81, 888f969d, a4abb2b9, 50575e65, 6c737a81, 888f969d, a4abb2b9,
c0c7ced5, dce3eaf1, f8ff060d, 141b2229, c0c7ced5, dce3eaf1, f8ff060d, 141b2229,
30373e45, 4c535a61, 686f767d, 848b9299, 30373e45, 4c535a61, 686f767d, 848b9299,
a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209, a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209,
10171e25, 2c333a41, 484f565d, 646b7279 10171e25, 2c333a41, 484f565d, 646b7279
- 输入加密密钥:MK=(MK0,MK1,MK2,MK3)
- 输出轮密钥:rki ,i=0,1…,30,31
- 中间数据:Ki,i=0,1, …, 34,35
输入加密密钥MK=(MK0,MK1,MK2,MK3)
(K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)
For i=0,1…,30,31 Do
rki=Ki+4=Ki⊕T’(Ki+1⊕Ki+2⊕Ki+3⊕CKi)
说明:T’变换与加密算法轮函数中的T基本相同,只将其中的线性变换L修改为以下:L’(B)=B⊕(B<<<13)⊕(B<<<23)