一、SM2算法概述:椭圆曲线密码体制简介、国密标准体系(GM/T系列)、SM2与其他公钥算法(RSA/ECC)的对比
1.1 椭圆曲线密码体制——到底在曲线上做了什么?
椭圆曲线密码体制,简称 ECC,说白了就是在一种特殊的数学曲线上做点运算。你想想看,一条曲线方程长这样:y² = x³ + ax + b,再加上一个无穷远点,就构成一个群。在这个群上,我们可以定义“点加法”和“标量乘法”。
嗯,这里要注意——椭圆曲线跟椭圆没有半毛钱关系。它叫这个名字,只是因为描述它的方程跟计算椭圆周长的积分有点像。我个人习惯把 ECC 理解为“在曲线上画格子、跳格子”的游戏:从一个基点 G 开始,自己加自己 k 次,得到公钥 Q = kG。正向计算很容易,反向求 k 却极其困难。这就是椭圆曲线离散对数问题(ECDLP)的核心。
我在项目中遇到过不少开发者,一听到“椭圆曲线”就觉得数学门槛很高。其实真正落地时,你只需要理解三个东西:曲线参数(a、b、G、n、p)、密钥对(私钥是整数,公钥是坐标点)、加解密流程(点乘、点加、KDF)。
1.2 国密标准体系——GM/T 系列到底长什么样?
国密标准是国家密码管理局发布的一套商用密码算法标准,编号以 GM/T 开头。SM2 属于其中的公钥密码部分,标准号为 GM/T 0003-2012。整个 SM2 家族包含三个子部分:
- 数字签名算法(SM2-2)——用于身份认证和消息完整性
- 密钥交换协议(SM2-3)——用于双方协商会话密钥
- 公钥加密算法(SM2-4)——用于数据加密传输
SM3(GM/T 0004-2012)是密码杂凑算法,输出 256 位摘要,相当于国密版的 SHA-256。SM4(GM/T 0002-2012)是分组对称密码,密钥长度 128 位,用于数据加解密。
我曾经帮一家金融机构做国密改造,最头疼的不是算法本身,而是标准文档的冗余细节。举个例子,SM2 签名时,消息需要先经 SM3 杂凑,再把摘要转换成整数参与计算。这个流程标准里写得绕来绕去,画了三张图才说清楚。实际工程中,你只需要记住:SM2 签名 = SM3 摘要 + 椭圆曲线点运算。
1.3 SM2 与 RSA、传统 ECC 的对比——到底强在哪?
面试时这个问题几乎必问。我直接给你一张对比表,把三个算法的核心差异说清楚:
| 对比维度 | SM2(国密 ECC) | RSA | 传统 ECC(secp256k1 / P-256) |
|---|---|---|---|
| 数学基础 | 椭圆曲线离散对数 | 大整数分解 | 椭圆曲线离散对数 |
| 密钥长度(同等安全强度) | 256 位 | 3072 位 | 256 位 |
| 签名速度 | 快 | 慢(大指数模幂) | 快 |
| 验签速度 | 快 | 快(小公钥指数) | 快 |
| 国家/国际标准 | GM/T 0003-2012 | PKCS#1 / FIPS 186 | SECG / NIST SP 800-186 |
| 曲线参数可验证性 | 固定曲线(无后门疑点) | N/A | 部分曲线有争议(如 NIST P-256) |
| 国内合规性 | ★ 强制合规 | × 不合规 | × 不合规 |
从表中你能看出几个关键信息:
- 同等安全强度下,SM2 的密钥长度只有 RSA 的 1/12,这意味着存储和传输开销小得多。
- SM2 和传统 ECC 在数学上同属椭圆曲线体系,但 曲线参数不同。SM2 使用国密定义的曲线(p、a、b、G、n 都固定),不能直接用国际曲线。
- 签名验签速度方面,SM2 整体比 RSA 快很多,尤其签名侧优势明显。我做过对比测试:SM2 签名比 RSA-2048 快 5~8 倍,验签快 2~3 倍。
1.4 一张图看懂 SM2 在国密体系中的位置
下面这张图是我自己梳理的,你可以把它当作国密算法的“全家福”。SM2 居于正中,往上承接应用层,往下依赖 SM3 和随机数发生器。
从上图你能看到:SM2 并不是孤立的算法,它需要 SM3 提供杂凑、SM4 提供对称加密、随机数发生器提供私钥种子。面试时如果能把这个层次关系说清楚,面试官会认为你真的做过落地项目。
1.5 SM2 与 RSA 的实际工程抉择
如果你现在要做一个新系统,选 SM2 还是 RSA?我直接给建议:
- 国内合规场景(金融、政务、医疗、电力):必须上 SM2,没得选。RSA 不合规。
- 性能敏感场景:使用 SM2,密钥短、签名快、证书体积小。我做过一个支付网关,从 RSA-2048 迁到 SM2 后,TLS 握手时间缩短了 40%。
- 海外互通场景:如果对方系统不支持国密,你可能需要用 RSA 或国际 ECC。但可以考虑“双证书策略”——同时签发 SM2 和 RSA 证书。
1.6 面试高频点——SM2 曲线参数速记
面试时偶尔会问 SM2 的曲线参数。你不用背一整串十六进制,但要知道下面这几个关键值:
| 参数 | 含义 | SM2 取值(简要) |
|---|---|---|
| p | 素数域模数 | 2²⁵⁶ − 2²²⁴ − 2⁹⁶ + 2⁶⁴ − 1 |
| a | 曲线系数 | p − 3 |
| b | 曲线系数(固定值) | 28E9FA... (标准附录可查) |
| G | 基点(压缩/非压缩) | 04 79BE667E ... (32字节 x + 32字节 y) |
| n | 基点阶(素数) | FFFFFFFE ... (与 p 接近但略小) |
面试话术参考:“SM2 使用 256 比特的素数域椭圆曲线,参数在 GM/T 0003 附录中固定。我一般只需要知道 p、a、b、G、n 这五个值,具体数值查标准就行。”
1.7 一个常见的误解——SM2 比 RSA“安全”吗?
不是。安全强度取决于密钥长度和算法实现。SM2-256 与 RSA-3072 的安全强度大致相当,都约为 128 比特。但 SM2 的数学结构(ECDLP)在量子计算面前同样脆弱——肖尔算法能同时攻破 ECC 和 RSA。所以“SM2 比 RSA 更安全”这个说法不准确。更准确的表述是:在同等安全强度下,SM2 的密钥更短、性能更好、国内合规。
好了,这一章我们把 SM2 的数学背景、国密标准体系、以及它跟 RSA、传统 ECC 的对比都过了一遍。你想想看,这些东西其实不难——底子就是一条曲线 + 一个点乘运算,再加上国密标准固定了参数。下一层我们需要深入 SM2 的签名流程和代码实现,到时候你会看到这些概念是怎么落地的。