差分攻击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字节,记为。其中

于是我们得到的具体值:

00070E151C232A31383F464D545B6269
70777E858C939AA1A8AFB6BDC4CBD2D9
E0E7EEF5FC030A11181F262D343B4249
50575E656C737A81888F969DA4ABB2B9
C0C7CED5DCE3EAF1F8FF060D141B2229
30373E454C535A61686F767D848B9299
A0A7AEB5BCC3CAD1D8DFE6EDF4FB0209
10171E252C333A41484F565D646B7279

解密

解密过程和加密过程完全相同,也包括32轮迭代和一次反序变换。只是在轮迭代的时候,需要将轮密钥逆序使用,即轮密钥​。

(SM4那题明天再写咕咕咕)