1. SM4 算法概述:国密标准背景、设计目标、与 AES/DES 的比较
大家好,我是老张。今天咱们开始聊 SM4 算法。
说实话,早期我做云安全项目的时候,碰到的大多是 AES、RSA 这类国际算法。后来有一次做政务云项目,客户明确要求必须用「国密算法」—— 那种感觉,就像突然让你用中文写加密代码。当时我对 SM4 其实心里没底,总觉得它是不是 AES 的中国简化版?后来真正啃完标准文档和源码,才发现这个算法设计得很讲究,不是简单的仿制品。
这一节,我就把自己这些年对 SM4 的理解拆开来讲。不会上来就讲公式,先把背景、设计理念和它跟 AES、DES 的「打架」过程说清楚。你懂了设计者的意图,后面看代码才不会晕。
1.1 国密标准背景
SM4 算法的全称叫 SM4 分组密码算法,是中国国家密码管理局发布的商用密码标准之一。它的标准编号是 GM/T 0002-2012,2012 年正式成为国家标准。
你会问:为什么中国要搞一套自己的密码标准?
原因其实很现实。
- 自主可控:国际密码算法(比如 AES、DES)的专利和技术都掌握在国外机构手中。关键基础设施和敏感数据,用别人设计的加密算法,始终存在后门或断供风险。这一点我在银行项目里感受特别深 —— 监管要求核心系统必须使用国密,不是技术炫技,是安全底线。
- 合规要求:GB/T 39786、等保 2.0、密码法都明确规定了国密算法的使用场景。尤其是云平台做等保三级以上测评,SM4 几乎是必选项。
- 产业生态:国内芯片厂商、密码机厂商、云服务商已经将 SM4 固化到硬件中。我用过几款国产密码卡,SM4 的性能已经能跟 AES 硬件引擎掰手腕了,这点进步很大。
SM4 的前身是 SMS4 算法,最早用于无线局域网标准 WAPI(还记得当年 WAPI 和 Wi-Fi 的标准之争吗)。后来经过分析和改进,2012 年正式升格为国家标准。目前它在金融、政务、公安、社保、云计算等场景中已经广泛部署。
1.2 设计目标
SM4 在设计上有几个明确的目标。我当年读标准文档的时候,能感受到设计团队在「安全」和「效率」之间反复权衡。
- 安全性不低于 AES-128:SM4 的密钥长度是 128 位,分组长度也是 128 位。设计时对标 AES-128,在抵抗差分密码分析和线性密码分析上有强度论证。实际攻防研究也表明,目前没有公开的有效攻击方法能威胁到 SM4 的全轮版本。
- 适合软硬件实现:SM4 采用 32 轮非线性迭代结构,每轮的计算量相对均衡。我试过在 ARM Cortex-M3 上跑 SM4 软实现,存储开销很小,适合嵌入式环境。而在硬件实现上,它的 S 盒和线性变换可以流水线化,吞吐量能做到很高。
- 低延迟与低功耗:与 AES 的替换-置换网络不同,SM4 的 Feistel 骨架(严格来说是「非平衡 Feistel 变体」)使得加解密结构可以高度共享。我在云原生的密钥管理服务(KMS)中看到,SM4 硬件加速模块的功耗和延迟都比同制程的 AES 略低。
- 国内自主知识产权:这是硬性要求。算法设计不能侵犯已有的国际专利,同时要在国内生态里可落地。从结果来看,SM4 的 S 盒构造和线性置换矩阵与 AES 完全不同,没有专利纠纷风险。
1.3 与 AES/DES 的比较
我见过不少同学把 SM4 直接等同于「中国的 AES」。其实这种说法不准确。下面这张表格,我把三者的核心指标放在一起对比。你看完就明白了。
| 对比项 | SM4 | AES | DES |
|---|---|---|---|
| 算法结构 | 32 轮非线性迭代(Feistel 变体) | 替换-置换网络(SPN) | 16 轮 Feistel 网络 |
| 密钥长度 | 128 位 | 128 / 192 / 256 位 | 56 位 |
| 分组长度 | 128 位 | 128 位 | 64 位 |
| 轮数 | 32 轮 | 10 / 12 / 14 轮 | 16 轮 |
| S 盒规模 | 8×8 位(1 个 S 盒) | 8×8 位(1 个 S 盒,查表实现) | 6×4 位(8 个 S 盒) |
| 密钥扩展 | 32 轮子密钥由主密钥通过线性变换生成 | 128/192/256 位密钥分别使用不同的扩展策略 | 56 位密钥生成 16 轮子密钥,含置换与移位 |
| 软件性能 | 中等(查表优化后接近 AES) | 高(有原生指令集 AES-NI 加持) | 较低(已不被推荐使用) |
| 硬件性能 | 高(适合流水线与低功耗设计) | 非常高(广泛硬件加速器支持) | 已基本退出硬件设计 |
| 安全强度 | AES-128 等效 | AES-128 ~ AES-256 | 已不安全(56 位密钥可被暴力破解) |
| 专利/标准 | 中国国标(免费使用) | 美国 FIPS(免费使用) | 已过专利期,但仍不推荐 |
| 云环境适配 | 国内云平台原生支持度提升中 | 全球通用,支持最完善 | 仅兼容旧系统 |
从表格能看出几个关键结论:
- DES 已经过时,密钥太短,分组也短,你千万别在生产环境里用。我在一个历史遗留系统里见过 DES 加密的支付数据,当时就建议立刻做数据重加密迁移。
- AES 的算法结构是 SPN,扩散更快,每轮计算量大但轮数少。SM4 用 Feistel 变体,每轮计算量小,但轮数多到 32 轮。两种思路都能达到相似的安全边际。
- SM4 与 AES-128 在安全强度上同等级,但 AES 支持更长的密钥,这一点在要求「抗量子安全裕度」的场景中需要注意。
- 云环境下的差异主要在生态成熟度。AES 有 AES-NI 指令集,Intel/AMD 芯片原生支持;SM4 虽然没有通用 CPU 指令集,但国产 CPU(如飞腾、鲲鹏)和密码卡已经做到了硬件加速。
下面我用一张框架图,把 SM4 算法在本课程中的定位和核心知识点串起来。你以后学后面的章节也能照着图对号入座。
为什么我把这一章放在课程开头?你看完这张图就懂了。SM4 不是一个孤立的算法,它跟国密标准体系、设计方法论、现实对比紧密关联。不先把这些「周边」理清楚,后面讲密钥派生、多租户隔离、密钥轮换的时候,你很容易困惑「为什么这里要这样设计」。