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 加密解密的基本流程:
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 主要基于以下几点:
- 合规性:国内金融、政务、关键基础设施项目,国密是硬性要求。这个没得选。
- 性能优势:同等安全强度下,SM2 的密钥更短,计算更快。在物联网设备、智能卡等资源受限环境中,这个优势非常明显。
- 安全性:SM2 使用的曲线经过精心选择,没有已知的安全漏洞。相比之下,有些 ECC 曲线(比如 NIST 的 P-256)曾被质疑可能存在后门(虽然没被证实)。
- 生态成熟度:现在主流密码库(OpenSSL、GMSSL、Bouncy Castle 等)都支持 SM2,开发起来很方便。
当然,SM2 也有不足。比如国际通用性不如 RSA 和标准 ECC,在跨境系统中可能会遇到兼容性问题。另外,SM2 的加密机制是“先加密后签名”还是“先签名后加密”,标准里没有强制规定,需要开发者自己设计——这个坑我后面会专门讲。
我的建议:如果你的项目只在国内运行,优先选 SM2。如果有跨境需求,可以考虑 SM2 + RSA 双证书方案,或者用 SM2 做签名、RSA 做加密的混合方案。具体怎么设计,咱们后面的章节会展开。