1. SM4 算法简介:发展历史、应用场景与性能特点
做并发性能审计,首先得搞清楚被审计的对象是谁。SM4 是咱们国家自主设计的对称分组密码算法,块长 128 位,密钥长 128 位,32 轮迭代。说白了,它和 AES 在同一个赛道上,但实现细节差别很大。我个人习惯在性能测试开始前,先翻一遍算法的底层特性——不然压测跑出来的数据,你根本不知道是算法本身的瓶颈,还是实现上的坑。
1.1 发展历史:从“无名”到“国标”
SM4 最早是 2006 年由中科院等单位提出,当时还不叫 SM4,叫 SMS4。我记得那时候文档就几十页,公开资料很少,圈内人大多把它当“有线保密标准”。2012 年,国家密码管理局正式发布 GM/T 0002-2012,算法名称也改成了 SM4。到 2016 年,GB/T 32907-2016 把它推到了国家标准层面。
这里有个关键点——SM4 的轮函数结构和 AES 完全不同。AES 用 S-box + ShiftRows + MixColumns,SM4 用非线性变换 τ (一个 8×8 的 S-box 组成) 和线性变换 L。我在早期做 SM4 硬件实现时,发现 τ 里的 S-box 复用率很高,适合查表优化;但查表在软件里缓存友好度不一定好,尤其多核并行时,伪共享问题很头疼。
关键年表:
- 2006 – SMS4 算法草案发布
- 2012 – GM/T 0002-2012 商用密码标准
- 2016 – GB/T 32907-2016 国家标准
- 至今 – 应用从党政扩展至金融、物联网、5G 等
1.2 应用场景:你正在使用的领域,基本都有它
SM4 的典型场景有三类,我在性能测试中基本都遇到过:
| 场景 | 特点 | 并发性能敏感点 |
|---|---|---|
| 电子政务 / 党政文件传输 | 数据包小、连接众多 | 首次密钥加载开销显著 |
| 金融 IC 卡 / 移动支付 | 交易实时性要求高 | 单次加解密时间 ≤ 20ms |
| 物联网 / 车联网 | 设备数万级,资源受限 | 软件实现需极致轻量 |
| VPN / 安关 | 大流量、多隧道 | 多核并行 / 硬件卸载 |
你想想看,政务系统动辄几十万并发连接,每条连接都要握手、加密、解密。如果 SM4 实现得不好,CPU 就会被查表、轮函数循环占满,吞吐量直线下跌。我在一次金融网关审计中,就碰到过因为 CBC 模式依赖数据依赖,导致多核无法线性加速的案例——这个我们后面章节会细聊。
1.3 性能特点:为什么并发审计绕不开它
SM4 软件实现的性能,相比 AES 有差距。主要原因:
- 轮数多:32 轮,而 AES-128 是 10 轮。轮数多了,指令数自然膨胀。
- 查表 vs 位操作:软件常用查表法实现 τ 变换,一次查 4 张 256 字节的表。你跑单线程没事,多核下这些表在 L1 里打架,性能可能掉 30%。
- 密钥扩展固定:密钥扩展只做一次,但轮密钥存储模式对缓存行对齐敏感。我曾经因为没做
alignas(64),导致多线程轮密钥被误判成同一缓存行,锁震荡了两天才找到根因。
避坑指南:多线程并行时,务必把每轮密钥数组做缓存行对齐。我一般用 posix_memalign 或 C++17 的 std::hardware_destructive_interference_size。亲测有效,性能能提 15%。
硬件实现方面,SM4 每轮逻辑简单(一个 τ + 一个 L + 异或),非常适合流水线设计。现在主流 FPGA 和 CPU 都开始提供 SM4 指令扩展(比如 ARM Crypto Extension 里的 SM4 指令),能把每轮时延压到 1 个时钟。但多数场景下,软件仍是主力,所以并发数分析必须覆盖纯软实现和硬件卸载两种模式。
小心:不要轻信厂商宣称的“SM4 峰值性能”。峰值往往是单核+单条流水线极限,实际并发场景下,锁竞争、内存带宽、系统调用都会把它打回原形。审计时一定要测真实场景——比如 1000 线程同时做 64 字节加密,和 1 线程做 1MB 加密,结果天差地别。
1.4 本章知识结构
下面这张图概括了 SM4 算法与并发性能审计的核心关系。每个节点都指向后续章节的讨论点——轮函数细节、密钥扩展优化、多核并行模式、测试指标等。你可以把它当作导览图。
记住这个图。之后每一章,我们都会回到这里——轮函数优化的影响、密钥扩展的 cache 行为、并行模式的选取,都能在这张图上找到位置。我自己做性能审计时,手里都摆一张类似的图,跑测试前先瞄一眼,思路就清了。
—— 本章完 ——