最近国密SM4加密挺火的,毕竟是中国国家密码局认定的国产密码算法,在逆向加密中出现的比较多。
SM4原理
国密SM4官方文档,个人认为官方文档挺好理解的。还有就是一个人截图的浙大diffie教授的课件图片个人觉得里面的图片也很好理解,毕竟国内的资料里面基本没有很好理解的图(悄咪咪搜了一下diffie教授瞬间羡慕好学校的学生们)
加密
SM4加密分为三个过程:轮密钥的准备,32次迭代运算,后四位反序得结果
32次迭代运算
图上是32次迭代运算的公式,其中x为输入的值(32bit),F()是轮函数,rk[i]是轮密钥(32bit)。轮函数的表达式是:
即X1与x2与x3与轮密钥rk[i]异或后的值经过合成置换T函数再与x0异或。
合成置换T,由非线性变换τ和先行变换L复合而成:
1.非线性变换τ
非线性变化τ主要操作是把输入的A(8bit)分成四份分别对应到s盒(已知矩阵)中
2.线性变换L
非线性变换的输出即为线性变换的输入,过程为:
反序变换
看到这里是不是已经忘记32次迭代运算是什么了…..我们来回顾一下32次迭代运算,以上经过合成置换得到的值要与输入的第一个值x0异或得到的值即为x4的值,经过上面32次轮函数的循环,就能得到新的x0(32bit)到x32的值,最后将最后四个值经过反序变换:
输出即为加密过后的值
轮密钥的准备
轮密钥的准备放在后面讲是因为轮密钥也使用了合成置换,但是这个合成置换与前面的轮函数中的合成置换有一点区别。
轮密钥生成方法:
输入加密密钥MK(128bit)分成四份MK0(32bit),MK1,MK2.MK3分别与系统参数(已知)FK0,FK1,FK2,FK3异或,下面一个公式我们可以得到两个重要步骤。其中CK[i]为固定参数。
第一步:是类似于32迭代运算的公式得到ki+4
第二步:是我们得到的这个k[i+4]赋值给了rki
T′ 是将32次迭代运算中合成置换T的线性变换L替换为L′:
系统参数FK的取值:
固定参数CK具体值为:
解密
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。解密时,使用轮密钥顺序为(rk31,rk30,…,rk0).
实现脚本
正在修缮中…