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 的密钥对生成过程很简单:

  1. 随机选择一个整数 d(1 < d < n-1),作为私钥
  2. 计算公钥 P = d * G(G 是基点)
  3. 私钥长度 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 证书体系的核心组成和流程关系,我建议你保存下来,后面配置时会反复用到。

SM2 证书体系核心结构 根 CA(自签名) 中间 CA 服务器证书 客户端证书 代码签名证书 说明: • 根 CA 私钥由离线 HSM 保护,仅用于签发中间 CA 证书 • 中间 CA 证书使用 SM2 签名算法,有效期通常为 5-10 年 • 终端实体证书的 SM2 公钥由 CSR 中的 SPKAC 字段携带 • 证书链验证时,从终端证书逐级向上直到根 CA 自签名证书

1.5 为什么选择 SM2?

我个人的看法是:SM2 不是「为了国产而国产」,它在技术层面确实有优势。

  • 性能优势:256 位 SM2 密钥的安全强度等价于 3072 位 RSA,签名速度快 10 倍以上
  • 存储优势:证书体积小,适合物联网、移动端等资源受限场景
  • 合规优势:等保 2.0、密评等政策明确要求关键系统使用国密算法

当然,SM2 也有短板。比如国际浏览器默认不支持 SM2 证书,需要安装国密插件或使用专用客户端。嗯,这个咱们在后面的章节会专门讲怎么处理。

我的建议:如果你的系统需要同时支持国际算法和国密算法(双证书模式),建议把 SM2 作为主证书,RSA 作为兼容降级方案。这样既满足合规,又不影响用户体验。