SM4 算法原理与实例解析
SM4(国密分组密码算法)是我国自主设计的对称分组密码标准,于 2012 年正式成为国家标准(GB/T 32907-2016),主要用于物联网、电子政务、金融等领域的数据加密。其设计理念与 AES 类似,但在轮函数、密钥扩展等细节上有独特创新,具有自主可控、安全性高、实现高效等特点。
一、SM4 核心原理:基础特性与整体流程
- 核心基础参数
分组长度:固定为 128 位(16 字节),与 AES 相同;
密钥长度:固定为 128 位(16 字节),仅支持一种密钥长度;
迭代轮数:32 轮,多于 AES-128 的 10 轮,增强安全性;
状态矩阵:128 位数据以4×4字节矩阵形式处理(按行填充,与 AES 的列填充不同);
轮密钥:通过密钥扩展生成 32 个 128 位轮密钥(K₀~K₃₁),每轮使用 1 个。 - SM4 完整加密流程
SM4 加密过程简洁清晰,32 轮迭代采用相同结构,无最终轮特殊处理,流程如下:- 数据预处理:128 位明文按 “行优先” 填入 4×4 状态矩阵(State),即第 1-4 字节为第 1 行,第 5-8 字节为第 2 行,以此类推;
- 初始密钥加:将状态矩阵与固定的系统参数 FK(4 个 32 位常量)异或;
32 轮迭代:每轮执行 “轮函数” 变换,核心是 “非线性变换 τ” 和 “线性变换 L”,并与当前轮密钥异或; - 输出变换:32 轮迭代后,将状态矩阵的 4 个字(32 位)逆序排列,得到 128 位密文。
二、SM4 核心操作详解
-
轮函数(F):32 轮迭代的核心
每轮迭代的轮函数定义为:
F(X₀, X₁, X₂, X₃, rk) = X₀ ⊕ T(X₁ ⊕ X₂ ⊕ X₃ ⊕ rk)
其中:
X₀~X₃ 是状态矩阵的 4 个 32 位字(每字由 4 字节组成);
rk 是当前轮的 32 位轮密钥;
T 是 “非线性变换 + 线性变换” 的复合函数,分为 τ 和 L 两步:
(1)非线性变换 τ
将 32 位输入拆分为 4 个 8 位字节(a₀, a₁, a₂, a₃),分别通过S 盒(SM4 标准 S 盒,8 位→8 位)替换,得到 4 个新字节(b₀, b₁, b₂, b₃),拼接为 32 位结果。
例:输入字节0x12→查 SM4 S 盒→输出0x68(具体映射见 SM4 标准表)。
(2)线性变换 L
对 τ 的 32 位输出进行线性变换,公式为:
L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24)
(<<< n 表示 32 位循环左移 n 位)
作用是增强数据的扩散性,确保 1 位变化影响多位。 -
密钥扩展:生成 32 个轮密钥
SM4 的密钥扩展与加密轮函数结构类似,从 128 位原始密钥生成 32 个 32 位轮密钥(rk₀~rk₃₁),步骤如下:- 将 128 位密钥拆分为 4 个 32 位字(MK₀~MK₃);
- 初始变换:Kᵢ = MKᵢ ⊕ FKᵢ(i=0~3,FK 为 4 个系统参数常量);
- 迭代生成轮密钥:对 i=0~31,
rkᵢ = Kᵢ₊₄ = Kᵢ ⊕ T'(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ)
其中T'是密钥扩展的复合变换(τ 与简化的线性变换 L' 组成,L' = B ⊕ (B <<< 13) ⊕ (B <<< 23)),CKᵢ是轮常量(32 位,按固定规则生成)。
三、SM4 加密实例(简化版,128 位明文)
以128 位明文和128 位密钥为例,展示核心步骤(部分中间结果简化):
1. 初始参数
128 位明文 M:01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10(16 字节);
128 位密钥 K:01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10(与明文相同,便于测试);
系统参数 FK:A3B1BAC6, 56AA3350, 677D9197, B27022DC(32 位字,共 4 个);
轮常量 CK:第 0 轮为00070e15,第 1 轮为1c232a31,…(按CKᵢ = (4i)×0x00000001在 GF (2⁸) 中生成)。
2. 步骤 1:明文转换为状态矩阵(行优先)
明文按行填充 4×4 矩阵,4 个 32 位字为:
X₀=01234567, X₁=89abcdef, X₂=fedcba98, X₃=76543210
3. 步骤 2:密钥扩展(生成轮密钥 rk₀)
密钥拆分为MK₀=01234567, MK₁=89abcdef, MK₂=fedcba98, MK₃=76543210;
初始变换:K₀=MK₀⊕FK₀=01234567⊕A3B1BAC6=A292EFA1(其余 K₁~K₃同理);
生成 rk₀:K₀⊕T'(K₁⊕K₂⊕K₃⊕CK₀) → 计算得rk₀=00000000(简化结果,实际需严格按 τ 和 L' 计算)。
4. 步骤 3:第 1 轮迭代(以 X₀~X₃为例)
轮函数输入:X₁⊕X₂⊕X₃⊕rk₀ = 89abcdef⊕fedcba98⊕76543210⊕00000000 = 70665c67;
非线性变换 τ:将 70665c67 拆分为 4 字节70,66,5c,67,经 S 盒替换为d1,55,96,38,拼接为d1559638;
线性变换 L:d1559638 ⊕ (d1559638<<<2) ⊕ ... → 结果为b83b5303;
第 1 轮输出:X₄ = X₀ ⊕ b83b5303 = 01234567⊕b83b5303 = b9181664。
5. 步骤 4:32 轮迭代与输出变换
重复 32 轮迭代(每轮更新 X₀~X₃为 X₁~X₄),最终得到 4 个 32 位字X₃₂~X₃₅,按逆序排列(X₃₅, X₃₄, X₃₃, X₃₂),得到 128 位密文:
68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46(SM4 官方测试用例结果,验证正确性)。
四、SM4 解密与应用场景
- 解密原理
SM4 解密与加密流程完全相同,仅需轮密钥逆序使用(加密用 rk₀~rk₃₁,解密用 rk₃₁~rk₀),这一设计简化了实现复杂度(加密解密可共享同一套逻辑)。 - 典型应用
金融领域:银行卡交易、移动支付的敏感数据加密;
物联网:智能家居、工业传感器的数据传输加密;
电子政务:公文传输、身份认证中的数据保护;
云安全:云端数据存储加密、用户隐私保护。
五、SM4 与 AES 的对比
| 特性 | SM4 | AES-128 |
|---|---|---|
| 分组长度 | 128 位 | 128 位 |
| 密钥长度 | 128 位 | 128 位 |
| 迭代轮数 | 32 轮 | 10 轮 |
| 状态填充 | 行优先 | 列优先 |
| 轮函数 | τ+L(固定结构) | SubBytes+ShiftRows+MixColumns+AddRoundKey |
| 安全性 | 抗差分、线性攻击,通过国家密码管理局认证 | 全球公认安全,抗多种攻击 |
| 优势 | 自主可控,适合国内合规场景 | 全球通用,软硬件优化成熟 |
SM4 作为我国自主设计的分组密码,在安全性和效率上与 AES 相当,且更符合国内信息安全合规要求,是国家大力推广的国密算法之一,未来将在更多关键领域替代国外算法
浙公网安备 33010602011771号