SM4分组密码算法的密钥扩展算法详解
字数 1196 2025-11-14 19:18:34

SM4分组密码算法的密钥扩展算法详解

我将详细讲解SM4分组密码算法的密钥扩展过程。SM4是中国国家密码管理局发布的分组密码算法,采用32轮非线性迭代结构,分组长度和密钥长度均为128位。

一、算法概述
SM4的密钥扩展算法将128位初始密钥扩展为32个32位轮密钥。整个过程采用与加密算法类似的轮函数结构,但使用固定参数。

二、密钥扩展步骤

  1. 初始密钥处理
    初始密钥MK = (MK₀, MK₁, MK₂, MK₃),每个MKᵢ为32位
    首先通过异或固定密钥FK进行预处理:
    (K₀, K₁, K₂, K₃) = (MK₀ ⊕ FK₀, MK₁ ⊕ FK₁, MK₂ ⊕ FK₂, MK₃ ⊕ FK₃)

其中固定密钥FK为:
FK₀ = 0xA3B1BAC6
FK₁ = 0x56AA3350
FK₂ = 0x677D9197
FK₃ = 0xB27022DC

  1. 轮密钥生成迭代
    对于i = 0到31,按以下公式生成轮密钥:
    rkᵢ = Kᵢ₊₄ = Kᵢ ⊕ T'(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ)

其中:

  • T'变换是密钥扩展中的合成变换
  • CKᵢ是固定参数,每轮不同
  1. T'变换详解
    T'变换由非线性变换τ和线性变换L'组成:
    T'(·) = L'(τ(·))

非线性变换τ:将32位输入分为4个字节,分别通过S盒替换
设输入X = (x₀, x₁, x₂, x₃),则:
τ(X) = (Sbox(x₀), Sbox(x₁), Sbox(x₂), Sbox(x₃))

SM4的S盒是一个8×8的固定置换表,提供非线性特性。

  1. 线性变换L'
    L'变换定义如下:
    L'(B) = B ⊕ (B <<< 13) ⊕ (B <<< 23)

其中<<<表示循环左移,这个变换提供扩散效果。

  1. 固定参数CK生成
    CKᵢ通过以下方式生成:
    设ckᵢ,ⱼ为CKᵢ的第j字节(j=0,1,2,3)
    ckᵢ,ⱼ = (4i + j) × 7 mod 256

然后将字节组合成32位字CKᵢ。

三、完整计算示例
以第0轮轮密钥生成为例:

  1. 计算中间值:
    B = K₁ ⊕ K₂ ⊕ K₃ ⊕ CK₀

  2. 应用非线性变换:
    B' = τ(B) = Sbox(B₀) || Sbox(B₁) || Sbox(B₂) || Sbox(B₃)

  3. 应用线性变换:
    B'' = L'(B') = B' ⊕ (B' <<< 13) ⊕ (B' <<< 23)

  4. 生成轮密钥:
    rk₀ = K₄ = K₀ ⊕ B''

重复此过程31次,得到全部32个轮密钥。

四、算法特点

  • 密钥扩展与加密结构相似,实现简单
  • 每轮轮密钥都依赖于之前所有密钥
  • 固定参数CK确保轮密钥的随机性
  • 非线性S盒和线性变换提供足够的安全性

这个过程确保了即使初始密钥有少量变化,也会通过多轮迭代产生完全不同的轮密钥序列,满足密码学的扩散和混淆原则。

SM4分组密码算法的密钥扩展算法详解 我将详细讲解SM4分组密码算法的密钥扩展过程。SM4是中国国家密码管理局发布的分组密码算法,采用32轮非线性迭代结构,分组长度和密钥长度均为128位。 一、算法概述 SM4的密钥扩展算法将128位初始密钥扩展为32个32位轮密钥。整个过程采用与加密算法类似的轮函数结构,但使用固定参数。 二、密钥扩展步骤 初始密钥处理 初始密钥MK = (MK₀, MK₁, MK₂, MK₃),每个MKᵢ为32位 首先通过异或固定密钥FK进行预处理: (K₀, K₁, K₂, K₃) = (MK₀ ⊕ FK₀, MK₁ ⊕ FK₁, MK₂ ⊕ FK₂, MK₃ ⊕ FK₃) 其中固定密钥FK为: FK₀ = 0xA3B1BAC6 FK₁ = 0x56AA3350 FK₂ = 0x677D9197 FK₃ = 0xB27022DC 轮密钥生成迭代 对于i = 0到31,按以下公式生成轮密钥: rkᵢ = Kᵢ₊₄ = Kᵢ ⊕ T'(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ) 其中: T'变换是密钥扩展中的合成变换 CKᵢ是固定参数,每轮不同 T'变换详解 T'变换由非线性变换τ和线性变换L'组成: T'(·) = L'(τ(·)) 非线性变换τ:将32位输入分为4个字节,分别通过S盒替换 设输入X = (x₀, x₁, x₂, x₃),则: τ(X) = (Sbox(x₀), Sbox(x₁), Sbox(x₂), Sbox(x₃)) SM4的S盒是一个8×8的固定置换表,提供非线性特性。 线性变换L' L'变换定义如下: L'(B) = B ⊕ (B <<< 13) ⊕ (B << < 23) 其中<< <表示循环左移,这个变换提供扩散效果。 固定参数CK生成 CKᵢ通过以下方式生成: 设ckᵢ,ⱼ为CKᵢ的第j字节(j=0,1,2,3) ckᵢ,ⱼ = (4i + j) × 7 mod 256 然后将字节组合成32位字CKᵢ。 三、完整计算示例 以第0轮轮密钥生成为例: 计算中间值: B = K₁ ⊕ K₂ ⊕ K₃ ⊕ CK₀ 应用非线性变换: B' = τ(B) = Sbox(B₀) || Sbox(B₁) || Sbox(B₂) || Sbox(B₃) 应用线性变换: B'' = L'(B') = B' ⊕ (B' <<< 13) ⊕ (B' << < 23) 生成轮密钥: rk₀ = K₄ = K₀ ⊕ B'' 重复此过程31次,得到全部32个轮密钥。 四、算法特点 密钥扩展与加密结构相似,实现简单 每轮轮密钥都依赖于之前所有密钥 固定参数CK确保轮密钥的随机性 非线性S盒和线性变换提供足够的安全性 这个过程确保了即使初始密钥有少量变化,也会通过多轮迭代产生完全不同的轮密钥序列,满足密码学的扩散和混淆原则。