SM4 常见工作模式:ECB、CBC、CTR、GCM 模式及性能差异
做并发数容量审计,绕不开 SM4 的工作模式选择。不同模式对并发性能的影响,说句实在话,比算法本身的差异还要大。我经常跟团队讲:“选对模式,压测数据能好看一倍。” 这一章咱们就挨个聊透。
ECB 模式:简单但危险
ECB(电子密码本)是最基础的分组模式。每个明文块独立加密,互不干扰。
- 加密可并行:多核 CPU 可以同时加密不同数据块,吞吐量很高。
- 解密可并行:同样,解密也完全并行。
- 致命缺陷:相同明文块 → 相同密文块。明文的结构信息会直接暴露。我在一次金融接口审计中见过有人用 ECB 加密交易报文,结果攻击者根据密文重复性直接猜出了字段边界……后来我们紧急切换了模式。
⚠️ 警告:ECB 模式在 任何生产环境 下都应被禁止。并发再高也不值得用。国密标准 SM4 虽然支持 ECB,但实际审计中一旦发现,直接打回重做。
CBC 模式:经典但串行加密
CBC(密码分组链接)引入了初始向量 IV。每个明文块先与前一个密文块异或,再加密。这带来一个关键限制:加密必须串行,因为后一块依赖前一块的输出。
- 加密不可并行:只能单线程顺序处理,吞吐量受限。
- 解密可并行:解密时只需要前一个密文块,所以可以并行。
- 错误扩散:一个密文块损坏会导致两个明文块出错。我遇到过因为网络丢包导致 CBC 解密连续报错的问题,排查时浪费了不少时间。
做并发压测时,CBC 的加密端往往成为瓶颈。尤其当业务报文长度较小时,串行加密的开销占比会很高。
CTR 模式:并发神器
CTR(计数器模式)把分组密码变成了流密码。它通过加密递增的计数器值产生密钥流,再与明文异或。关键点:计数器独立于数据,所以加密和解密都可以完全并行。
- 加密可并行:每个数据块对应不同的计数器值,直接并行加密。
- 解密可并行:同样,解密也是并行生成密钥流,再异或。
- 无需填充:明文长度任意,直接异或即可,省去 padding 处理。
- 可随机访问:想解密中间的某一段,直接计算对应计数器就行。这在磁盘加密或大数据场景下非常有用。
💡 经验:我个人的习惯是在高并发加密网关中首选 CTR 模式。它的性能曲线非常平缓,核数翻倍吞吐量几乎线性增长。曾经我们用 8 核 ARM 做 SM4-CTR,压测到 10Gbps 线速,CPU 负载才 60% 左右。
GCM 模式:又安全又快,但有点重
GCM(Galois/Counter Mode)是认证加密模式(AEAD)。它基于 CTR 做加密,同时用伽罗瓦域乘法计算认证标签。加密和认证同时完成。
- 加密可并行:底层是 CTR,所以加密并行度很高。
- 解密可并行:一样。
- 集成认证:一个接口同时输出密文和 MAC,省去额外 HMAC 步骤。
- 额外计算开销:伽罗瓦域乘法需要专门的硬件指令(如 AES-NI 的 PCLMULQDQ),或者纯软件实现会占用不少 CPU。
- IV 重用风险:CTR 模式下 IV 不能重复,否则密钥流相同,异或能直接恢复明文。GCM 同理,一旦 IV 碰撞,整个认证机制都会失效。
我个人在部署 SM4-GCM 时吃过亏:某次测试环境 IV 生成器线程不安全,重复了两次,结果解密出来的数据全是乱码,还差点误判为算法 bug。后来我在每个 IV 前面加了时间戳+序列号,才彻底解决。
性能差异一览
下面这张表是我根据多次压测总结的,测试环境:Intel Xeon Gold 6248,32 线程,SM4 软件实现(无硬件加速)。
| 工作模式 | 加密并行 | 解密并行 | 错误扩散 | 额外开销 | 相对吞吐量(多核) |
|---|---|---|---|---|---|
| ECB | ✅ 可并行 | ✅ 可并行 | 无 | 无 | 高(但安全否决) |
| CBC | ❌ 串行 | ✅ 可并行 | 2 个块 | 需 Padding | 中等(加密拖后腿) |
| CTR | ✅ 可并行 | ✅ 可并行 | 无 | 无 | 高 |
| GCM | ✅ 可并行 | ✅ 可并行 | 无(认证会失败) | 域乘法 | 较高(有认证消耗) |
你看,CTR 和 GCM 在多核场景下优势明显。ECB 虽然快但已被判死刑。CBC 加密串行的缺口在大量并发时会很痛苦——我曾经压一个 CBC 加密服务,核数从 4 加到 16,吞吐量只涨了 30%,因为加密锁都在等前一块的输出。
📌 结论:做并发数容量审计时,优先考虑 CTR 或 GCM。如果业务需要认证(大多数场景都该要),GCM 是标准答案;如果只需要机密性且对性能极致追求,CTR 是最佳选择。