[TOC]
1. 国密 SM4 算法
SM4 分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密,以保证数据和信息的机密性。其算法公开,分组长度与密钥长度均为 128bit,加密算法与密钥扩展算法都采用32 轮非线性迭代结构,S 盒为固定的 8 比特输入 8 比特输出。
2. 分组加密
分组加密(英语:Block cipher),又称分块加密或块密码,是一种对称密钥算法。分组加密(英语:Block cipher),又称分块加密或块密码,是一种对称密钥算法。例如: AES 3DES
3. S 盒
在密码学中,一个S 盒(Substitution-box,替换盒)是对称密钥加密算法执行替换计算的基本结构。在块密码(分组加密)中,它们通常用于模糊密钥与密文之间的关系——香农的混淆理论。
通常,S-Box 接受特定数量的输入比特m,并将其转换为特定数量的输出比特n,其中n 不一定等于m。
3.1 DES S-box
011011
100101
3.2 SM4 S-box
S 盒为固定的 8 比特输入 8 比特输出的置换
4. 加/解密方式
SM4 算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。
4.1 原理
每组 128 bit(4 Byte) 按照以下方式进行加密
4.2 填充方式
将明文转化为字节,由于 SM4 加密算法按照 128 个位进行分组,最后一个分组不够 128 位的情况,需要进行填充(ZeroPadding、PKCS7Padding、PKCS5Padding)
- ZeroPadding
数据长度不对齐时使用0填充,否则不填充。
- PKCS7Padding
假设数据长度需要填充 n(n>0)个字节才对齐,那么填充 n 个字节,每个字节都是n;
如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
1 | // block size: 8 Btye / 64 bit |
- PKCS5Padding
PKCS7Padding 的子集,块大小固定为8字节。
4.3 参数
-
输入 X
X0 X1 X2 X3 由 128 bit 拆分
-
加密密钥 MK, 128 bit
1
MK=(MK0, MK1, MK2, MK3)
-
轮密钥 rk
共计 32 轮,32 个轮密钥
-
轮函数 F
每轮处理方式对应的函数
-
系统参数 FK, 4 个
1
FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC)
-
固定参数 CK, 32 个
1
2
3
4
5
6
7
800070e15, 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
4.4 轮函数 F
4.4.1 合成置换 T
一个可逆变换,由非线性变换 τ 和线性变换 L 复合而成,即 T(.)=L(τ(.))。
4.4.1.1 非线性变换
由 4 个并行的 S 盒构成
4.4.1.2 线性变换 L
非线性变换 τ 的输出是线性变换 L 的输入
4.5 加/解密算法
明文输入:(X0 , X1, X2, X3)
密文输出: (Y0 , Y1, Y2, Y3)
轮密钥: rki (解密时为倒序)
4.6 密钥扩展算法
本算法中加密算法的轮密钥由加密密钥通过密钥扩展算法生成。