SM4国密算法

发布于 2021-08-11  133 次阅读





差分攻击2

要补一下之前巅峰极客SM4那题的坑。我们先来看SM4算法

SM4

SM4密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。

  1. 该算法的分组长度为128位(即16字节,4字),密钥长度为128位(即16字节,4字)。
  2. 加密算法与密钥扩展算法都采用32轮非线性迭代结构。
  3. 密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
  4. 数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

加密过程图

SM4的分组长度为4字,因此,其输入的是4字明文,加密后输出4字密文。加密过程分为两步,由32次轮迭代和1次反序变换组成。

32次轮迭代

我们现在给了4字明文 ​,第一轮迭代就是使用前4字明文和第一轮的轮密钥计算第5个字:​ ,第二轮迭代就是计算第6个字​​,以此类推。最终我们得到了36个字。

F函数

​为合成置换。

  • 合成置换:

    合成置换接受1字的输入,得到1字的输出。它包含非线性变换和线性变换,即

    1. 非线性变换

      非线性变换接受1字的输入,记为,输出为1字的结果,记为

      非线性变换就是对输入参数的每个字节进行S盒变换,得到输出结果。S盒作用和AES中的类似,就是替换字节。

    2. 线性变换​:

      运算公式如下

      其中<<<为循环位移

经过这两种变换,就完成了一次轮迭代,计算出了下一个字的内容。

 

反序变换

加密过程的第二步是一次简单的反序变换。将迭代最后得到的四个字进行反序,得到最终的密文​.

SM4密钥扩展算法

SM4的密钥为128位(4字),经过密钥扩展,获得32个1字的轮密钥。记原密钥为

Step1:与系统参数异或——初始化密钥

首先需要让原始密钥的每个字与系统参数​异或,得到四个新的字​。

系统参数取值如下:

Step2:轮迭代生成轮密钥

迭代方法

和加密过程类似,需要进行32次轮迭代,生成32个轮密钥。

第一轮迭代:

这里,类似于之前的是固定参数。

第二轮迭代和第一轮类似,下面我们给出迭代的通式

置换T'​

其中​函数和加密过程中的是一样的。

是个线性变换函数:

的取值

一共有32个,即计算每一轮的轮密钥均需要不同的

的长为1字,即4字节,记为。其中

于是我们得到的具体值:

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那题明天再写咕咕咕)