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的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 国标合规要点
如果你的产品要做商用密码认证,下面这几关必须过:
- 算法实现:必须严格按照 GB/T 32907-2016 实现,S盒值、线性变换参数不能有偏差。我见过有人把循环移位方向搞反了,自测能加解密,但送到检测中心一测就挂了。
- 密钥管理:密钥生成、存储、销毁必须符合 GM/T 0051-2016《密码设备管理 对称密钥管理技术要求》。
- 工作模式:ECB 模式在国标里被建议避免使用,推荐 CBC、CTR、GCM 等。我个人习惯在并发场景下用 GCM 模式,既能加密又能认证。
- 随机数要求:IV 和随机数必须由合格的物理噪声源产生,不能用伪随机替代。
最后补一句:SM4 的并发监控和容量审计我会在后面几章细讲,这一章你先把算法本身啃透。每个字节、每个异或都不要放过。