SM4 算法原理与实例解析

SM4(国密分组密码算法)是我国自主设计的对称分组密码标准,于 2012 年正式成为国家标准(GB/T 32907-2016),主要用于物联网、电子政务、金融等领域的数据加密。其设计理念与 AES 类似,但在轮函数、密钥扩展等细节上有独特创新,具有自主可控、安全性高、实现高效等特点。

一、SM4 核心原理:基础特性与整体流程

  1. 核心基础参数
    分组长度:固定为 128 位(16 字节),与 AES 相同;
    密钥长度:固定为 128 位(16 字节),仅支持一种密钥长度;
    迭代轮数:32 轮,多于 AES-128 的 10 轮,增强安全性;
    状态矩阵:128 位数据以4×4字节矩阵形式处理(按行填充,与 AES 的列填充不同);
    轮密钥:通过密钥扩展生成 32 个 128 位轮密钥(K₀~K₃₁),每轮使用 1 个。
  2. SM4 完整加密流程
    SM4 加密过程简洁清晰,32 轮迭代采用相同结构,无最终轮特殊处理,流程如下:
    • 数据预处理:128 位明文按 “行优先” 填入 4×4 状态矩阵(State),即第 1-4 字节为第 1 行,第 5-8 字节为第 2 行,以此类推;
    • 初始密钥加:将状态矩阵与固定的系统参数 FK(4 个 32 位常量)异或;
      32 轮迭代:每轮执行 “轮函数” 变换,核心是 “非线性变换 τ” 和 “线性变换 L”,并与当前轮密钥异或;
    • 输出变换:32 轮迭代后,将状态矩阵的 4 个字(32 位)逆序排列,得到 128 位密文。

二、SM4 核心操作详解

  1. 轮函数(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 位变化影响多位。

  2. 密钥扩展:生成 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 解密与应用场景

  1. 解密原理
    SM4 解密与加密流程完全相同,仅需轮密钥逆序使用(加密用 rk₀~rk₃₁,解密用 rk₃₁~rk₀),这一设计简化了实现复杂度(加密解密可共享同一套逻辑)。
  2. 典型应用
    金融领域:银行卡交易、移动支付的敏感数据加密;
    物联网:智能家居、工业传感器的数据传输加密;
    电子政务:公文传输、身份认证中的数据保护;
    云安全:云端数据存储加密、用户隐私保护。

五、SM4 与 AES 的对比

特性 SM4 AES-128
分组长度 128 位 128 位
密钥长度 128 位 128 位
迭代轮数 32 轮 10 轮
状态填充 行优先 列优先
轮函数 τ+L(固定结构) SubBytes+ShiftRows+MixColumns+AddRoundKey
安全性 抗差分、线性攻击,通过国家密码管理局认证 全球公认安全,抗多种攻击
优势 自主可控,适合国内合规场景 全球通用,软硬件优化成熟

SM4 作为我国自主设计的分组密码,在安全性和效率上与 AES 相当,且更符合国内信息安全合规要求,是国家大力推广的国密算法之一,未来将在更多关键领域替代国外算法

posted on 2025-09-14 12:59  Ctrl+C人生  阅读(288)  评论(0)    收藏  举报