SM4算法学习

发布时间 2023-12-13 20:41:25作者: 起个名字费老劲儿了

简介

SM4算法是我国商用密码标准,其前身是SMS4算法。SM4算法是一个分组加密算法,分组长度和密钥长度均128bit。SM4算法使用32轮的非线性迭代结构。SM4在最后一轮非线性迭代之后加上了一个反序变换,因此SM4中只要解密密钥是加密密钥的逆序,它的解密算法与加密算法就可以保持一致。

SM4算法过程

加解密

输入的明文为 128bit 的数据,将其按位拆分成 4 个 32bit 的数据 x0,x1,x2,x3
当 i=0 时为第一次轮变换,一直进行到 i=31 结束
xi 暂时不做处理,将 xi+1,xi+2,xi+3 和轮密钥 rki 异或得到一个 32bit 的数据,作为盒变换的输入
即 sbox_input=xi+1⊕xi+2⊕xi+3⊕rki,⊕ 符号代表异或运算
将 sbox_input 拆分成 4 个 8bit 数据,分别进行盒变换,之后再将 4 个 8bit 输出合并成一个 32bit 的 sbox_output
将刚才获得的 sbox_output 分别循环左移 2,10,18,24 位,得到 4 个 32bit 的结果,记移位结果为 y2,y10,y18,y24
将移位的结果 y2,y10,y18,y24 与盒变换输出 sbox_output 和 xi 异或,得到 xi+4
即 xi+4=sbox_output⊕y2⊕y10⊕y18⊕y24⊕xi
至此完成了一轮的加解密运算
在实际加解密过程中,上述运算要执行 32 轮,同时使用 32 个不同的 rki,rki 由密钥拓展生成
最后将生成的最后 4 个 32bit 数据 x35,x34,x33,x32 合并成一个 128bit 的数据 output,作为最后的输出结果

密钥拓展

密钥拓展的过程和加解密大同小异
输入的原始密钥 key 为 128bit 的数据,将其按位拆分成 4 个 32bit 的数据 K0,K1,K2,K3
将初始密钥 K0,K1,K2,K3 分别异或固定参数 FK0,FK1,FK2,FK3 得到用于循环的密钥 k0,k1,k2,k3
即 k0=K0⊕FK0,k1=K1⊕FK1,k2=K2⊕FK2,k3=K3⊕FK3
进入轮密钥 rki 的生成
当 i=0 时为第一次轮变换,一直进行到 i=31 结束
ki 暂时不做处理,将 ki+1,ki+2,ki+3 和固定参数 CKi 异或得到一个 32bit 的数据,作为盒变换的输入
即 sbox_input=ki+1⊕ki+2⊕ki+3⊕cki
将 sbox_input 拆分成 4 个 8bit 数据,分别进行盒变换,之后再将 4 个 8bit 输出合并成一个 32bit 的 sbox_output
将刚才获得的 sbox_output 分别循环左移 13,23 位,得到 2 个 32bit 的结果,记移位结果为 y13,y23
将移位的结果 y13,y23 与盒变换输出 sbox_output 和 ki 异或,得到 ki+4
即 rki=ki+4=sbox_output⊕y13⊕y23⊕ki
至此完成了一轮的加解密运算
在实际加解密过程中,上述运算要执行 32 轮,同时使用 32 个不同的 CKi,CKi 为固定参数
执行完 32 轮后,便可获得 32 个用于加解密的 rki