2. 国密算法家族简介:SM2、SM3、SM4、SM9 各自的解密场景

好,咱们这一章聊点接地气的。国密不是一棵树,而是一整片林子。SM2、SM3、SM4、SM9 这四个家伙,各有各的看家本事。你想想看,要优化解密延迟,总得先知道每个算法都在哪干活吧。

我个人习惯把国密算法分成四类:公钥密码、密码杂凑、对称密码、标识密码。别急,咱们一个一个拆开说。

国密算法家族核心解密场景 国密算法家族 SM2 公钥密码 SM3 密码杂凑 SM4 对称密码 SM9 标识密码 数字签名 密钥协商 数据加密 完整性校验 消息认证码 数据加解密 批量数据保护 标识签名 标识加密 解密延迟优化的核心关注点 SM2 / SM9 · 私钥运算(GF(p)点乘,双线性对)→ 计算密集型 SM4 · 轮函数与密钥扩展 → 内存与指令优化 SM3 · 消息扩展与压缩 → 数据依赖与流水线

2.1 SM2 —— 公钥密码体系

SM2 是国家密码管理局发布的椭圆曲线公钥密码算法标准。说白了,它干的事跟 RSA 差不多,但密钥更短,安全强度更高。

它的解密场景主要有三个:

  1. 数字签名与验证:确保消息来源的不可否认性。我在项目中遇到过,很多电子政务系统用 SM2 签章。
    签名快,验签慢——这是椭圆曲线的特点。优化时应优先关注验签性能。
  2. 密钥协商:双方安全地建立一个共享密钥。SM2 密钥协商协议,我建议你记住它的握手次数,比传统 ECDH 多一步,延迟自然高一些。
  3. 数据加密:用接收方公钥加密数据,只有对方能用私钥解密。嗯,这里要注意,SM2 加密后的密文比原文长不少,网络传输时带宽也要算进去。
我曾经踩过一个坑:SM2 的私钥运算(点乘)是性能瓶颈。如果你要同时处理大量签名或解密,单线程顺序执行会很难看。可以试试预计算或批处理优化。

2.2 SM3 —— 密码杂凑算法

SM3 是国密的哈希函数。输出 256 位(32 字节)。它本身没有“解密”这一说,但它是很多解密流程的前置步骤。

应用场景其实很明确:

  • 完整性校验:文件下载后算一遍 SM3 摘要,跟原始值对比。
  • 消息认证码(MAC):配合密钥,确保消息没有被篡改。
  • 数字签名的组成部分:SM2 签名前,先对消息算 SM3 摘要。你想想看,一个签名操作,SM3 要算一遍,SM2 要算一笔,两个延迟是叠加的。

我个人习惯在优化时,先看 SM3 是否成了木桶最短的那块板。它的压缩函数运算量大,数据依赖强,想要快必须走硬件加速或 SIMD 指令优化。

SM3 的性能指标(参考):在 2.0GHz 的 CPU 上,纯软件实现约 100-150 MB/s。如果你的业务需要加密 G 级数据,这个数字你要算清楚。

2.3 SM4 —— 对称密码算法

SM4 是分组密码,分组长度 128 位,密钥长度 128 位。说白了,就是国标的 AES。

它的解密场景更直接:

  • 大量数据加密与解密:视频流、数据库加密、文件存储加密。
  • 通信加密:SSL/TLS 国密套件中的对称加密部分。

SM4 的解密跟加密几乎一样快——但有一个关键点:密钥扩展。每次切换密钥,都需要重新计算 32 轮密钥。我记得在某项目里,客户端频繁切换连接,开销大部分花在密钥扩展上。优化点很清楚:缓存常用密钥的扩展结果。

另外,SM4 支持 ECB、CBC、CTR 等模式。不同模式带来的延迟差异很大:

工作模式 解密特点 延迟敏感度
ECB 可并行,每块独立 低(建议大量数据使用)
CBC 解密可并行,但依赖前一个密文块 中
CTR 加密解密完全对称,可预计算密钥流 低(我最推荐)
GCM 带认证的加密,有额外运算 中高
如果你追求极致延迟,我建议优先考虑 CTR 模式,配合预计算密钥流,可以把解密延迟降到极限。

2.4 SM9 —— 标识密码算法

SM9 是基于双线性对的标识密码体系。最酷的地方在于:用户的公钥就是自己的标识——手机号、邮箱、身份证号。

它的解密场景集中在:

  • 标识签名与验签:不需要证书链,直接验。
  • 标识加密与解密:直接用接收方标识加密,私钥在密钥生成中心(KGC)拿到。

SM9 的解密(私钥运算)比 SM2 慢非常多。为什么?因为它用了双线性对(Tate 对或 Weil 对)。这玩意儿的计算量,我这么说吧——一次 SM9 解密耗时大约是 SM2 的 5 到 10 倍。

避坑指南:SM9 不适合高频解密场景。我曾经在一个物联网项目中看到用 SM9 做每次通信的解密,结果设备 CPU 直接满载。后来换成了 SM2 + SM4 混合方案,延迟降了两个数量级。

2.5 四种算法解密场景总结

截止到这里,我觉得可以给个表格把各家解密的优劣势摆一摆。

算法 解密典型场景 性能特点 延迟优化空间
SM2 加密数据、签名验签、密钥协商 点乘运算敏感 预计算、批处理、硬件加速
SM3 完整性校验、摘要运算 压缩函数、流水线 SIMD、硬件协处理
SM4 批量加解密、通信加密 密钥扩展、轮函数 密钥缓存、CTR预计算
SM9 标识加密、标识签名 双线性对计算 对运算优化、减少调用

嗯,说到这里,你应该对这四个家伙的背景和场景有个清晰认识了。后面的章节里,我们会深入每个算法的实现细节,带你看看到底是哪几行代码最吃性能。别急,一步一步来。