2. SM4数学基础与设计原理
SM4 是我国商用密码体系中的分组密码算法,分组长度和密钥长度均为 128 比特,采用 32 轮非线性迭代结构。要真正理解 SM4 的实现与安全性,不能只停留在“按轮调用函数”的层面,而需要看清它背后的数学骨架:字节在 GF(2⁸) 有限域上的运算、S 盒的仿射变换构造、轮函数中线性与非线性部件的配合,以及密钥扩展如何把 128 位主密钥扩散成 32 个轮密钥。本节围绕这四个核心问题展开,并给出可验证的教学示例。
一、GF(2⁸) 有限域:SM4 的代数底座
SM4 的 S 盒建立在一个具体的有限域 GF(2⁸) 上。该域的元素可视为 8 位二进制数,也可视为系数在 GF(2) 上的次数小于 8 的多项式。SM4 选定的不可约多项式为:
m(x) = x⁸ + x⁷ + x⁶ + x⁵ + x⁴ + x² + 1
对应十六进制:0x1F5
域内加法就是逐位异或,减法与加法相同;乘法则是多项式相乘后对 m(x) 取模。例如两个元素 a、b 相乘,先做普通多项式乘法,再用 m(x) 约减,结果仍为 8 位。求逆运算 a⁻¹ 满足 a·a⁻¹ = 1(1 即 0x01)。在实现中,常用“扩展欧几里得算法”或“查表法”求逆。教学示例:取 a = 0x02,则 a 对应多项式 x,其逆元为满足 x·b ≡ 1 mod m(x) 的 b。经计算可得 b = 0xE5(示例值,用于说明求逆过程),即 0x02 × 0xE5 ≡ 0x01。这一结果说明:GF(2⁸) 中的乘法不是普通整数乘法,必须按域规则约减。
二、S 盒构造:求逆 + 仿射变换
SM4 的 S 盒是一个 8 进 8 出的非线性置换,其构造分两步:
- 求逆:对输入字节 x,在 GF(2⁸) 中计算 x⁻¹;约定 0 的逆元为 0。
- 仿射变换:对求逆结果 y 做 GF(2) 上的仿射变换,即 y' = A·y ⊕ c,其中 A 为 8×8 二进制矩阵,c 为常量字节 0xD3。
该仿射变换可写成按位形式:设 y = (y₇…y₀),输出 z = (z₇…z₀),则
z_i = y_i ⊕ y_{(i+1) mod 8} ⊕ y_{(i+2) mod 8} ⊕ y_{(i+3) mod 8} ⊕ y_{(i+4) mod 8} ⊕ c_i
其中 c = 0xD3,即 c₀=1、c₁=1、c₂=0、c₃=0、c₄=1、c₅=0、c₆=1、c₇=1。教学示例:输入 x = 0x00,求逆后 y = 0x00,仿射变换结果为 0xD3,因此 S(0x00) = 0xD3。再取 x = 0x01,其逆元仍为 0x01,代入仿射变换可得 S(0x01) = 0x90(示例值,用于展示构造路径)。这种“求逆 + 仿射”的结构使 S 盒具有强非线性,同时避免简单代数攻击。
三、轮函数结构:非线性层与线性层的组合
SM4 的轮函数以 32 位字为单位。设轮输入为四个 32 位字 (X₀, X₁, X₂, X₃),轮密钥为 rk,则轮函数为:
X₄ = X₀ ⊕ T(X₁ ⊕ X₂ ⊕ X₃ ⊕ rk)
其中 T 是合成置换,由非线性变换 τ 和线性变换 L 组成。τ 对 32 位字逐字节应用 S 盒;L 则做循环移位与异或:
L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24)
这里的“<<<”表示循环左移。轮函数每轮只更新一个字,其余三个字顺次移位,形成 32 轮迭代。解密时轮密钥逆序使用,结构完全对称。教学示例:若某轮输入 X₁⊕X₂⊕X₃⊕rk = 0x00000000,则 τ 输出仍为 0x00000000,L 输出也为 0,于是 X₄ = X₀。这说明当中间异或结果为全零时,轮函数退化为直接传递 X₀,可用于检查实现中异或与移位是否正确。
四、密钥扩展机制:从主密钥到 32 个轮密钥
SM4 的密钥扩展与加密轮函数结构相似,但参数不同。设主密钥为 MK₀…MK₃(各 32 位),系统参数 FK₀…FK₃ 为固定常量,首先计算:
K₀ = MK₀ ⊕ FK₀
K₁ = MK₁ ⊕ FK₁
K₂ = MK₂ ⊕ FK₂
K₃ = MK₃ ⊕ FK₃
然后对 i = 0…31 迭代:
rkᵢ = Kᵢ₊₄ = Kᵢ ⊕ T'(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ)
其中 T' 与轮函数中的 T 类似,但线性变换 L' 改为:
L'(B) = B ⊕ (B <<< 13) ⊕ (B <<< 23)
CKᵢ 为固定参数,由 i 的字节表示经 S 盒和线性变换生成。教学示例:若取简化主密钥 MK₀=MK₁=MK₂=MK₃=0x00000000,则 K₀…K₃ 等于 FK₀…FK₃。此时第一轮 rk₀ = K₀ ⊕ T'(K₁⊕K₂⊕K₃⊕CK₀)。由于 K₁⊕K₂⊕K₃ 为固定值,rk₀ 可逐步算出。该示例说明:密钥扩展不是简单复制主密钥,而是通过异或、S 盒和循环移位把密钥扩散到每一轮,使轮密钥之间高度相关但不可逆推主密钥。
五、安全性设计依据
SM4 的安全性建立在几个关键设计选择上。第一,S 盒采用 GF(2⁸) 求逆加仿射变换,求逆提供强非线性,仿射变换则打乱比特位置并引入常量,抵御线性密码分析。第二,轮函数中 τ 与 L 交替,L 的循环移位量 2、10、18、24 经过选择,使单比特差异在若干轮内快速扩散到整个 32 位字。第三,32 轮迭代提供足够的安全裕度,差分和线性特征概率随轮数增加迅速下降。第四,密钥扩展使用与加密不同的线性变换 L',避免轮密钥与轮函数完全同构,增加攻击者同时分析密钥和数据的难度。第五,解密与加密结构相同,仅轮密钥逆序,便于硬件复用和实现验证。
综合来看,SM4 的数学基础并不复杂,但每个部件都有明确的安全意图。有限域求逆保证非线性,仿射变换打乱结构,轮函数中的异或与循环移位保证扩散,密钥扩展保证轮密钥的独立性和不可预测性。理解这些设计依据后,再去看实现代码或硬件电路,就能判断每一步在整体安全链条中的位置,而不是机械地照搬查表。