1. SM4算法概述与国家标准归纳总结

SM4 是咱们国家自己的分组密码标准。说白了,它就是个 128 位的加密算法,密钥也是 128 位,专门用来保护像无线局域网、物联网这些场景里的数据。我记得第一次看到这个算法是在一个政务云的项目里,当时还嘀咕能不能直接用 AES,结果客户指着国标文件说:必须用 SM4。嗯,从那以后我就开始认真研究它了。

1.1 算法背景与标准化历程

SM4 最早叫 SMS4,2006 年由国家密码管理局发布,2016 年正式成为国标 GB/T 32907-2016。我个人习惯把国际标准 ISO/IEC 18033-3:2010 也翻出来对照着看,因为里面把 SM4 收了进去,这样在做海外合规时就有据可依。

  • 国内标准:GB/T 32907-2016《信息安全技术 SM4分组密码算法》
  • 行业标准:GM/T 0002-2012《SM4分组密码算法》
  • 国际标准:ISO/IEC 18033-3:2010 中纳入 SM4

其实 SM4 的迭代轮数(32轮)比 AES 多了一倍,但它的硬件实现相当轻量。我在 FPGA 上做过一次 PCL 测速,8 级流水线能做到 5Gbps 以上,比某些软件 AES 实现还快。

1.2 算法核心结构

SM4 是典型的 Feistel 结构。128 位明文分成 4 个 32 位的字,每轮只改写其中一个字,剩下的三个字直接递推。你想想看,这样设计的好处是加解密几乎一样,只需要把轮密钥反过来用就行。

每轮核心操作就是三步:轮密钥异或 → S盒替换 → 线性变换。S 盒用的是固定 8×8 表,输入 8 位输出 8 位;线性变换是个 32 位的循环移位+XOR,我习惯叫它“加扰器”。

核心参数速记:分组 128 位,密钥 128 位,32 轮,每轮密钥由原始密钥通过密钥扩展算法生成 32 个 32 位轮密钥。

下面这张图把加密流程完整画出来了,我建议你配合代码一起看。

SM4 加密流程 明文(128bit) 密钥(128bit) 密钥扩展 初始状态 (X0~X3) 轮函数 F (32轮迭代) XOR → S盒 → 线性变换 迭代 32 次 密文(128bit)

个人经验:SM4的S盒设计非常巧妙——它的代数次数是7,能抵抗差分和线性密码分析。我在审计一个开源SM4实现时,发现有人把S盒值拷贝错了,导致加密结果完全不对。这种坑我曾经踩过,后来再也不手写S盒表了,直接复用标准头文件。

1.3 与AES的对比

很多同学会问:“SM4 和 AES 到底该选谁?”其实两个都是安全的对称密码,但侧重点不同。下面这个表是我在项目选型时经常翻的备忘录。

对比项 SM4 AES
分组长度 128 bit 128 bit
密钥长度 128 bit(固定) 128/192/256 bit
轮数 32 10/12/14
S盒大小 8×8(1个S盒) 8×8(1个S盒,AES不同)
结构类型 Feistel 网络 SP 网络
硬件面积 较小(适合嵌入式) 中等
国密合规 必须 部分场景禁止

避坑指南:我曾经在一个国密改造项目里直接拷贝了AES的CTR模式代码来跑SM4,结果发现SM4的CTR实现需要把轮密钥重新排序——因为SM4的加解密结构对称但密钥扩展顺序相反。千万别想当然。

1.4 国标合规要点

如果你的产品要做商用密码认证,下面这几关必须过:

  1. 算法实现:必须严格按照 GB/T 32907-2016 实现,S盒值、线性变换参数不能有偏差。我见过有人把循环移位方向搞反了,自测能加解密,但送到检测中心一测就挂了。
  2. 密钥管理:密钥生成、存储、销毁必须符合 GM/T 0051-2016《密码设备管理 对称密钥管理技术要求》。
  3. 工作模式:ECB 模式在国标里被建议避免使用,推荐 CBC、CTR、GCM 等。我个人习惯在并发场景下用 GCM 模式,既能加密又能认证。
  4. 随机数要求:IV 和随机数必须由合格的物理噪声源产生,不能用伪随机替代。

最后补一句:SM4 的并发监控和容量审计我会在后面几章细讲,这一章你先把算法本身啃透。每个字节、每个异或都不要放过。