1. SM4 算法概述
说起 SM4,得先从国密算法的大背景聊起。你可能听说过“商用密码”这个词——2000 年前后,国内金融、政务系统开始意识到不能用国外算法一条道走到黑。当时我们团队参与了一些行业标准评审,我记得最头疼的事就是:每个行业自己搞一套对称算法,互不兼容。后来国家密码管理局出手了,把 SMS4(SM4 的前身)定为无线局域网标准里的核心算法。
1.1 发展历史
2006 年,国家发布 SMS4 算法规范,主要用于 WAPI 无线安全。说实话,那时候我在做无线芯片的协议栈,第一次看到 SMS4 的 S 盒设计,心里还犯嘀咕——
“这玩意儿跟 AES 比到底行不行?”
后来跑了几轮仿真,发现它硬件实现面积比 AES 小了将近 30%,功耗也低。嗯,这里要注意,国标 SM4 的轮函数结构是 Feistel 变种,加解密路径几乎一样,实现起来很友好。
| 时间 | 事件 | 我的体会 |
|---|---|---|
| 2006 年 | 发布 SMS4 标准(无线局域网用) | 首次接触国密对称算法,感觉设计保守但稳定 |
| 2012 年 | SM4 成为国家密码行业标准 GM/T 0002-2012 | 参与过金融 IC 卡方案评审,开始大量用国密 |
| 2016 年 | 正式成为国家标准 GB/T 32907-2016 | 看到越来越多国外芯片开始支持 SM4 硬件加速 |
| 2021 年 | 进入 ISO/IEC 18033-3 | 国际互认信号,出海项目省了不少沟通成本 |
我个人习惯把 SM4 的发展分成三个阶段:行业定制期(2006~2011)、国标推广期(2012~2020)、国际互认期(2021 至今)。你在做密钥刷新方案时,一定要清楚你的系统用的是哪个版本的 SM4——老版本 SMS4 的 S 盒和轮数跟新国标一样,但密钥扩展细节略有差异,我在一个老旧嵌入式项目中就踩过这个坑。
1.2 国家标准
SM4 对应的国标号是 GB/T 32907-2016,全称《信息安全技术 SM4 分组密码算法》。说白了,这就是一份“使用说明书”加“安全约束清单”。你想想看,一个算法要成为国标,至少得把下面这几件事说清楚:
- 算法结构:128 位 Feistel 变种,32 轮非线性迭代
- S 盒:固定的 8×8 查表,共 16 个 S 盒(其实是同一个,只是位置不同)
- 密钥扩展:128 位主密钥 -> 32 个 32 位轮密钥
- 加解密流程:相同结构,只是轮密钥使用顺序相反
- 工作模式:ECB、CBC、CTR、OFB、CFB(GCM 后来也纳入了国密系列)
我尤其想提一下 密钥扩展 部分。SM4 用了 128 位的系统参数 FK 和固定参数 CK,这些参数在国标里是定死的。你做密钥轮换时,如果直接复用主密钥扩展会引入安全隐患——轮密钥和主密钥之间的代数关系太清晰。所以后面章节我们专门讲“边界刷新”,就是要在会话密钥生成时切断这种线性关联。
1.3 典型应用场景
国密 SM4 现在几乎覆盖了“全栈”加密需求。我给你列几个我实际参与过的场景:
- 金融 IC 卡:银行卡个人化、脱机数据认证。我做过一个密钥管理子系统,SM4 用在卡片和 POS 终端的会话加密上。当时遇到的最大问题是 密钥生命周期管理——卡片一发行就是三五年,中间必须支持会话密钥在线更新。
- 无线局域网(WAPI):这是 SM4 的“老本行”。无线传输容易丢包,你设计的会话密钥刷新方案必须支持 无状态恢复(也就是接收方能通过计数器的值算出当前用哪个密钥片)。
- VPN 网关:IPSec 里的国密改造。记得有一次要对接 C/S 架构的加密机,我发现对方用的 SM4 是 ECB 模式直接加密会话密钥……吓得我赶紧建议改成 CTR 模式,避免了重放攻击。
- 移动支付:手机端和服务器之间的安全通道。这里有个细节:手机的 SM4 实现通常是软件(ARM NEON 指令加速),而服务器是硬件加速或 OPAQUE 协议——你的密钥轮换算法要考虑两端性能不对称。
- 物联网安全模块:比如电表、水表、车联网 T-Box。SM4 的硬件实现面积小、功耗低,很适合资源受限设备。我见过一个低功耗方案,把会话密钥存在 SRAM 里,每次上电用 PUF 派生——这里边界刷新就特别关键,否则攻击者能通过电压毛刺读走敏感数据。
1.4 SM4 算法知识体系
下面这张图帮你快速建立本章的知识骨架。注意看 发展历史、标准体系、应用场景 三条主脉怎么汇聚到“会话密钥边界刷新与轮换”这个课程主题上的。
从这张图能看出来,SM4 的三大支柱最终都指向同一个工程问题:密钥怎么安全、高效地轮到?历史告诉我们要兼容国标升级,标准告诉我们要遵守密钥扩展规范,场景告诉我们不同设备有不同约束。接下来 29 章,就是一步步拆解这个核心问题。