要补一下之前巅峰极客SM4那题的坑。我们先来看SM4算法
SM4
SM4密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。
- 该算法的分组长度为128位(即16字节,4字),密钥长度为128位(即16字节,4字)。
- 加密算法与密钥扩展算法都采用32轮非线性迭代结构。
- 密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
- 数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
加密过程图
SM4的分组长度为4字,因此,其输入的是4字明文
32次轮迭代
我们现在给了4字明文
F函数
-
合成置换
: 合成置换
接受1字的输入 ,得到1字的输出 。它包含非线性变换 和线性变换 ,即 。 -
非线性变换
: 非线性变换接受1字的输入,记为
,输出为1字的结果,记为 。 非线性变换就是对输入参数的每个字节进行S盒变换,得到输出结果。S盒作用和AES中的类似,就是替换字节。
-
线性变换
: 运算公式如下
其中<<<为循环位移
-
经过这两种变换,就完成了一次轮迭代,计算出了下一个字的内容。
反序变换
加密过程的第二步是一次简单的反序变换。将迭代最后得到的四个字
SM4密钥扩展算法
SM4的密钥为128位(4字),经过密钥扩展,获得32个1字的轮密钥。记原密钥为
Step1:与系统参数异或——初始化密钥
首先需要让原始密钥的每个字
系统参数取值如下:
Step2:轮迭代生成轮密钥
迭代方法
和加密过程类似,需要进行32次轮迭代,生成32个轮密钥。
第一轮迭代:
这里,
第二轮迭代和第一轮类似,下面我们给出迭代的通式
置换T'
其中
的取值
一共有32个
于是我们得到
00070E15 | 1C232A31 | 383F464D | 545B6269 |
---|---|---|---|
70777E85 | 8C939AA1 | A8AFB6BD | C4CBD2D9 |
E0E7EEF5 | FC030A11 | 181F262D | 343B4249 |
50575E65 | 6C737A81 | 888F969D | A4ABB2B9 |
C0C7CED5 | DCE3EAF1 | F8FF060D | 141B2229 |
30373E45 | 4C535A61 | 686F767D | 848B9299 |
A0A7AEB5 | BCC3CAD1 | D8DFE6ED | F4FB0209 |
10171E25 | 2C333A41 | 484F565D | 646B7279 |
解密
解密过程和加密过程完全相同,也包括32轮迭代和一次反序变换。只是在轮迭代的时候,需要将轮密钥逆序使用,即轮密钥
(SM4那题明天再写咕咕咕)
Comments NOTHING