1. SM2 算法概述:国密标准背景、椭圆曲线原理与算法对比
各位同学好,我是老周。在 PKI 领域摸爬滚打了十几年,从最早的 RSA 1024 一直做到现在的 SM2 国密改造。今天咱们聊的这门课,核心就是 SM2 证书的配置全流程。但别急着上手敲命令——先花一章把 SM2 的来龙去脉搞清楚,后面你踩坑的概率会小很多。
1.1 国密标准背景:为什么要有自己的算法?
说白了,这事跟「信息安全自主可控」直接挂钩。早些年咱们的金融、政务系统大量使用 RSA 和 ECC 算法,密钥体系和证书链都掌握在国外厂商手里。一旦国际形势变化,别人随时可以卡你脖子。
我记得 2010 年左右参与过一个银行 CA 系统升级项目,当时用的还是 RSA 2048。客户问了一句:「如果哪天 RSA 的专利授权出问题,我们怎么办?」——这个问题当时没人能回答。也正是从那时起,国家密码管理局开始大力推动国密算法体系。
国密标准的核心包括:
- SM2:椭圆曲线公钥密码算法(对标 ECDSA/ECDH)
- SM3:密码杂凑算法(对标 SHA-256)
- SM4:分组密码算法(对标 AES)
其中 SM2 是咱们这门课的主角。它于 2010 年发布,2016 年正式成为国家标准(GB/T 32918)。现在金融、电力、政务、医疗等关键行业,新建系统基本都要求支持 SM2 证书。
核心要点:国密不是「另起炉灶」,而是基于国际公认的数学难题(椭圆曲线离散对数问题)重新设计参数,确保安全性的同时做到自主可控。
1.2 SM2 椭圆曲线算法原理
椭圆曲线密码学(ECC)的基础数学概念,我尽量用大白话讲清楚。
1.2.1 椭圆曲线长什么样?
SM2 使用的椭圆曲线方程是:
y² = x³ + ax + b (mod p)
其中 a、b 是系数,p 是一个大素数。SM2 标准中固定了 a、b、p 的值,以及基点 G 的坐标和阶 n。这些参数都是公开的,不需要你自己生成。
你想想看,椭圆曲线上的点构成一个加法群。两个点 P 和 Q 相加,得到第三个点 R。这个「加法」的几何意义是:过 P、Q 做直线,与曲线交于第三点,再关于 x 轴对称得到 R。
为什么这能用来做密码?因为「已知 P 和 Q,求 k 使得 Q = kP」非常困难——这就是椭圆曲线离散对数问题(ECDLP)。
1.2.2 SM2 的密钥对生成
SM2 的密钥对生成过程很简单:
- 随机选择一个整数 d(1 < d < n-1),作为私钥
- 计算公钥 P = d * G(G 是基点)
- 私钥长度 256 位,公钥长度 512 位(未压缩格式)
我在项目中遇到过不少新手问:「私钥是随机数,那会不会跟别人重复?」——n 的大小是 2²⁵⁶ 量级,宇宙中的原子数才 2²⁶⁵ 左右,重复概率基本可以忽略。
1.2.3 SM2 的数字签名流程
SM2 签名算法与 ECDSA 类似,但多了一个用户标识符 Z 的参与,这是国标的特色:
签名方:
1. 计算 Z = Hash(ENTLA || IDA || a || b || xG || yG || xP || yP)
2. 计算 e = Hash(Z || M)
3. 生成随机数 k,计算点 (x1, y1) = k * G
4. 计算 r = (e + x1) mod n
5. 计算 s = ((1 + d)⁻¹ * (k - r * d)) mod n
6. 输出签名 (r, s)
验签方:
1. 同样计算 Z 和 e
2. 验证 r, s 在 [1, n-1] 范围内
3. 计算 t = (r + s) mod n
4. 计算点 (x1', y1') = s * G + t * P
5. 验证 r == (e + x1') mod n
个人经验:SM2 签名中引入 Z 值,相当于把用户身份信息「绑定」到了签名里。我曾经在对接某政务系统时,对方没算 Z 直接拿原始消息验签,结果死活验不过——这个坑我踩过,大家注意。
1.3 SM2 与 RSA / ECC 的对比
很多同学会问:「SM2 跟 ECDSA 到底有什么区别?跟 RSA 比谁更强?」——咱们直接上表格。
| 对比维度 | SM2 | RSA | ECC(ECDSA) |
|---|---|---|---|
| 数学基础 | 椭圆曲线离散对数 | 大整数分解 | 椭圆曲线离散对数 |
| 密钥长度(安全等价) | 256 位 | 3072 位 | 256 位 |
| 签名速度 | 快 | 慢 | 快 |
| 验签速度 | 快 | 快 | 快 |
| 密钥生成速度 | 极快 | 慢 | 极快 |
| 证书体积 | 小 | 大 | 小 |
| 标准化程度 | 国标 GB/T 32918 | PKCS#1 / RFC 8017 | ANSI X9.62 / FIPS 186 |
| 专利风险 | 无(自主可控) | 有(已过期) | 有(部分专利) |
从表里能看出来:SM2 和 ECDSA 在数学基础上是同源的,但 SM2 在参数选择、签名流程上做了国标定制。RSA 虽然成熟,但同等安全强度下密钥太长,性能差很多。
避坑指南:我曾经在迁移一个老系统时,发现对方 CA 签发的是 RSA 2048 证书,但应用层只支持 SM2 验签。结果所有证书都得重新签发,业务中断了整整两天。所以做架构设计时,一定要提前确认上下游的算法兼容性。
1.4 SM2 证书体系结构图
下面这张图展示了 SM2 证书体系的核心组成和流程关系,我建议你保存下来,后面配置时会反复用到。
1.5 为什么选择 SM2?
我个人的看法是:SM2 不是「为了国产而国产」,它在技术层面确实有优势。
- 性能优势:256 位 SM2 密钥的安全强度等价于 3072 位 RSA,签名速度快 10 倍以上
- 存储优势:证书体积小,适合物联网、移动端等资源受限场景
- 合规优势:等保 2.0、密评等政策明确要求关键系统使用国密算法
当然,SM2 也有短板。比如国际浏览器默认不支持 SM2 证书,需要安装国密插件或使用专用客户端。嗯,这个咱们在后面的章节会专门讲怎么处理。
我的建议:如果你的系统需要同时支持国际算法和国密算法(双证书模式),建议把 SM2 作为主证书,RSA 作为兼容降级方案。这样既满足合规,又不影响用户体验。