第 1 章 SM2 算法概述:国密标准、应用场景、与 RSA/ECC 对比

各位同学,欢迎来到《SM2 加解密性能优化实战教程》。今天咱们聊聊 SM2 的身世、它能干什么,以及它跟 RSA、普通 ECC 到底差在哪儿。

说实话,我最早接触 SM2 是在一个政务云项目中。客户要求必须用国密算法,但团队里没人真正写过 SM2 代码。后来花了三周踩坑,才把签名验签跑通。那一轮折腾让我对 SM2 的原理和坑点记忆犹新。

1.1 国密标准与 SM2 的地位

SM2 是中国国家密码管理局发布的椭圆曲线公钥密码算法标准(GM/T 0003-2012)。它属于国密系列中的“非对称密码”部分,跟对称加密的 SM4、哈希的 SM3 搭配使用。

核心定位:SM2 是国密体系中用于密钥协商、数字签名、数据加密的“脊梁”。说白了,它替代的就是 RSA 和普通 ECDSA 在应用层的位置。

为什么会专门搞一套国密标准?嗯,这里有两个关键原因:

  • 自主可控:避免依赖国外算法专利,防止被卡脖子。
  • 安全基线:RSA 在同等安全强度下需要更长的密钥,ECC 虽然好但参数是欧美选的。SM2 采用 256 位素域椭圆曲线,安全强度对标 RSA-3072,计算效率却高得多。

我在信创项目里反复被问过:“SM2 真的安全吗?”你想想看,SM2 使用的椭圆曲线是经过国内密码专家精心挑选的,曲线方程是 y² = x³ + ax + b,参数基点是公开可验证的。而且 SM2 的签名方案基于 Schnorr 改造,比 ECDSA 少了随机数生成攻击面——这个后面我会详细讲。

1.2 应用场景:你在哪见过它?

SM2 现在几乎覆盖了国内的网络安全要地。我列几个实际落地的场景:

  • 电子政务:税务、社保、工商等系统的数字证书签发(CA 证书)。
  • 金融支付:银行网银、手机银行的交易签名和传输加密。
  • 物联网:智能电表、车联网设备中的身份认证和密钥协商。
  • 增值税发票:税控盘里的签章加密,背后全是 SM2+SM3+SM4。

避坑指南:我曾经在一个智慧园区项目中,直接把 SM2 公钥放在固件里做设备认证,结果发现固件被反编译后密钥全泄露了。后来改成了安全芯片存储 + 签名验证流程才解决。所以我建议你,在物联网场景下,私钥绝不能明文存储在文件系统里。

下表把 SM2 的主要能力拆开,方便你对照:

功能 对应标准 典型用途 性能瓶颈
密钥交换 GM/T 0003.3 TLS 握手中的国密套件 点乘运算次数较多
数字签名 GM/T 0003.2 身份认证、电子签章 签名快,验签慢(约 2x)
加解密 GM/T 0003.4 关键数据传输加密 加密中涉及 KDF 计算

个人经验:我在做 SM2 加密性能调优时,最常踩的坑是 KDF(密钥派生函数)的重复计算。记得把加密时算出的共享密钥缓存起来,别每次都跑两遍 KDF。这个后面第 18 章会专门讲。

1.3 SM2 与 RSA、ECC 的对比

很多人问我:“SM2 跟普通 ECC 有什么区别?”其实 SM2 本身就是一种 ECC,但它用了国家规定的唯一一条 256 位素域曲线(sm2p256v1)。而国际上常用的 ECC 曲线有 secp256r1、secp256k1(比如比特币用的)。

下面这张表是我在实际项目中总结的对比数据(安全强度按 NIST 级别对标):

对比项 RSA-2048 ECC (secp256r1) SM2 (sm2p256v1)
密钥长度(位) 2048 256 256
同等安全强度 ≈ 112 bit ≈ 128 bit ≈ 128 bit
签名速度(相对) 慢 快 中等(与 ECDSA 相当)
验签速度(相对) 快 慢(公钥恢复) 慢(约 1.5x ECDSA)
密码学特性 可公钥加密 仅签名/密钥交换 签名+加密+密钥交换
标准化程度 国际通用 国际通用 中国国标+行业标准

你会注意到,SM2 的验签比 ECDSA 慢一些,这跟它签名过程中多了一次模逆运算有关。但 SM2 的加密功能是标准 ECC 没有的——它直接用椭圆曲线做混合加密(类似 ECIES),而 ECDSA 一般不直接支持加密,你得自己拼装。

注意:虽然 SM2 和 ECC 底层都是椭圆曲线点乘,但 SM2 的加密格式、签名格式与国际标准完全不同。千万不要直接把 ECDSA 验签代码改几个参数就拿来验 SM2 签名——我见过有人这么干,结果调试了两天没通过。接口规范务必参照国家密码管理局发布的完整标准文档。

1.4 SM2 的核心运算流程

为了让你有个直观印象,我画了一张图,把 SM2 加解密的主干流程串起来:

SM2 加解密核心流程 SM2 混合加解密流程(密钥交换 + 对称加密) 发送方 A(明文 + 接收方公钥) 接收方 B(自己的私钥) 获取公钥 ① 生成临时密钥对 (r,R) ② 点乘: K = r * P_B ③ KDF 派生工作密钥 ④ SM4/GCM 加密明文 ⑤ 输出: 密文 + R 传输 (R + 密文) ① 点乘: K' = d_B * R ② KDF 派生相同密钥 ③ 对称解密得到明文 ✅ 明文恢复 核心计算:点乘运算 √(性能瓶颈所在)

这张图展示的是 SM2 加密通信的典型模式。说白了就是:发送方用对方的公钥和自己的临时私钥算出一个共享密钥,然后用这个共享密钥派生出一个对称密钥去加密数据。接收方拿到临时公钥和自己的私钥,算出同样的共享密钥,解密。

注意,整个过程最耗时的步骤是椭圆曲线上的点乘运算(步骤②和接收方的步骤①)。我曾在 ARM 开发板上做过测试,一次 256 位点乘大约需要 1-2 毫秒(软件实现)。如果一次加密要跑两次点乘,并发一上来,CPU 就顶不住了。这也是咱们这个教程要优化的核心矛盾。

1.5 本章小结

咱们梳理一下今天的关键点:

  1. SM2 是什么:国标定义的一种公钥密码算法,安全强度 128 位,密钥长度 256 位。
  2. 应用场景:电子政务、金融支付、物联网等需要自主可控密码的地方。
  3. 对比 RSA/ECC:SM2 比 RSA 更短但更安全;相比普通 ECC,SM2 多了加密功能并且曲线参数固定。
  4. 核心流程:椭圆曲线点乘 + KDF 派生 + 对称加密,点乘是性能瓶颈。

嗯,这些背景搞清楚了,咱们后面的优化才能有的放矢。等你遇到 SM2 加密慢的场景,心中就有数了:这不是算法本身的问题,而是实现层次上可以抠的细节多着呢。