1. SM2 算法概述:国密标准背景、椭圆曲线密码体制与对比分析

各位同学,咱们今天正式开讲《SM2 密钥派生与存储方案》的第一章。说实话,每次讲国密算法,我都会想起几年前的一个项目——客户要求把整个系统的 RSA 2048 全部替换成 SM2,当时我还在想,这玩意儿到底靠不靠谱?后来踩了不少坑,也积累了一些经验。今天就把这些心得跟大家聊聊。

1.1 国密标准的背景:为什么要有自己的密码算法?

先说说背景。国密标准,全称是“国家商用密码算法标准”,由国家密码管理局发布。你可能会问:国际上已经有 AES、RSA、ECC 这些成熟的算法了,为什么我们还要自己搞一套?

原因其实很简单:密码算法是国家安全的基础设施。你想想看,如果所有金融、政务、通信系统都依赖国外的密码算法,万一哪天人家不给你用了,或者留个后门,后果不堪设想。这不是杞人忧天,历史上确实有过类似事件。

国密标准包含一系列算法:

  • SM1:对称加密算法,不公开,硬件实现
  • SM2:椭圆曲线公钥密码算法,咱们这门课的主角
  • SM3:密码杂凑算法,类似 SHA-256
  • SM4:对称分组密码算法,类似 AES
  • SM9:基于标识的密码算法

其中 SM2 是咱们的重点。它于 2010 年发布,2016 年成为国家标准(GB/T 32918)。现在国内很多重要系统都在用,比如二代身份证、金融 IC 卡、电子政务系统等。

核心要点:国密标准不是闭门造车,而是基于国际主流密码学理论,结合我国实际需求制定的。SM2 在安全性上对标国际标准,在某些方面甚至更有优势。

1.2 SM2 椭圆曲线密码体制:它到底是怎么工作的?

好,咱们进入正题。SM2 是一种椭圆曲线公钥密码体制。说白了,就是利用椭圆曲线上的点群运算来实现加密、签名和密钥交换。

椭圆曲线长什么样?数学上,它满足方程:

y² = x³ + ax + b   (其中 4a³ + 27b² ≠ 0)

SM2 使用的是素域上的椭圆曲线,参数由国密标准指定。我习惯把椭圆曲线理解成一个“密码学游乐场”——你可以在曲线上做加法、做倍点,但这些运算很难逆向推导。这就是安全性的基础。

SM2 的核心操作包括:

  • 密钥生成:随机选择一个私钥 d,计算公钥 P = d * G(G 是基点)
  • 加密:用接收方公钥加密消息,只有持有对应私钥的人能解密
  • 签名:用私钥对消息签名,任何人可以用公钥验证签名真实性
  • 密钥交换:双方通过椭圆曲线运算协商出一个共享密钥

这里有个关键点:SM2 的椭圆曲线参数是固定的,包括曲线方程、基点、阶等。这意味着所有 SM2 实现都使用同一套参数,互操作性有保障。

我的经验:在实际项目中,很多人会忽略 SM2 的“密钥派生”环节。其实 SM2 标准中定义了专门的密钥派生函数(KDF),用于从共享秘密派生出会话密钥。这个细节在后面的章节会详细讲,但你现在就要记住:不要自己写 KDF,用标准规定的。

下面这张图展示了 SM2 加密解密的基本流程:

SM2 加密解密流程 发送方(Alice) 接收方(Bob) 明文 M 公钥 P_B SM2 加密 密文 C 网络传输 SM2 解密 私钥 d_B 明文 M 加密用公钥,解密用私钥 私钥必须安全存储,不可泄露

1.3 SM2 与 RSA/ECC 的对比分析

很多同学会问:SM2 和 RSA 比怎么样?和标准的 ECC(比如 secp256k1)比呢?我直接给你上表格,一目了然。

对比维度 SM2 RSA-2048 ECC (secp256k1)
密钥长度 256 位 2048 位 256 位
安全强度 128 位 112 位 128 位
签名速度 快 慢 快
验签速度 快 快 快
加密速度 中等 慢 中等
解密速度 中等 慢 中等
密钥生成速度 极快 慢 极快
标准化程度 国标 GB/T 32918 PKCS#1, FIPS 186 SECG, FIPS 186
国内合规性 完全合规 部分场景受限 不推荐

从表格可以看出:

  • SM2 和 ECC 在密钥长度上完胜 RSA——256 位 vs 2048 位,但安全强度更高。这就是椭圆曲线的魅力。
  • SM2 的签名速度比 RSA 快很多,但验签速度差不多。这在需要大量签名的场景下优势明显。
  • SM2 的密钥生成速度极快,RSA 生成密钥对需要很长时间(尤其是大素数生成),而 SM2 只需要一个随机数加一次倍点运算。

注意:虽然 SM2 和 secp256k1 都是 256 位椭圆曲线,但它们的参数不同,不能混用。我曾经见过有人把比特币的 secp256k1 代码直接拿来当 SM2 用,结果验签死活过不去——曲线参数不一样,算出来的点根本不对。

1.4 为什么选择 SM2?我的实际体会

说了这么多理论,聊聊我的实际感受。在项目中,我选择 SM2 主要基于以下几点:

  1. 合规性:国内金融、政务、关键基础设施项目,国密是硬性要求。这个没得选。
  2. 性能优势:同等安全强度下,SM2 的密钥更短,计算更快。在物联网设备、智能卡等资源受限环境中,这个优势非常明显。
  3. 安全性:SM2 使用的曲线经过精心选择,没有已知的安全漏洞。相比之下,有些 ECC 曲线(比如 NIST 的 P-256)曾被质疑可能存在后门(虽然没被证实)。
  4. 生态成熟度:现在主流密码库(OpenSSL、GMSSL、Bouncy Castle 等)都支持 SM2,开发起来很方便。

当然,SM2 也有不足。比如国际通用性不如 RSA 和标准 ECC,在跨境系统中可能会遇到兼容性问题。另外,SM2 的加密机制是“先加密后签名”还是“先签名后加密”,标准里没有强制规定,需要开发者自己设计——这个坑我后面会专门讲。

我的建议:如果你的项目只在国内运行,优先选 SM2。如果有跨境需求,可以考虑 SM2 + RSA 双证书方案,或者用 SM2 做签名、RSA 做加密的混合方案。具体怎么设计,咱们后面的章节会展开。