一、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)。

一句话记住 ECC 的核心:私钥是一个随机大整数 k,公钥是曲线上点 Q = kG。安全性依赖于从 Q 和 G 反推 k 的计算难度。

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 摘要 + 椭圆曲线点运算。

避坑提示:很多面试者把“SM2 签名”和“SM3 摘要”混淆。记住——SM3 是哈希,SM2 是公钥签名;签名时调 SM3 做哈希,但 SM2 不是哈希算法。

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 倍。
特别注意:SM2 的曲线参数在标准中写死了,不允许自定义曲线。如果你需要在系统中集成 SM2,必须使用 GM/T 0003 附录中指定的曲线参数。改一个字节都不合规。

1.4 一张图看懂 SM2 在国密体系中的位置

下面这张图是我自己梳理的,你可以把它当作国密算法的“全家福”。SM2 居于正中,往上承接应用层,往下依赖 SM3 和随机数发生器。

国密算法体系核心结构 应用层:数字签名 / 加密 / 密钥交换 SM2 公钥密码算法 数字签名 | 密钥交换 | 公钥加密 基础密码组件 SM3 杂凑算法 SM4 对称加密 随机数发生器 底层支撑:密钥管理 / 证书体系 / 安全芯片 SM2 位于 国密体系核心层

从上图你能看到:SM2 并不是孤立的算法,它需要 SM3 提供杂凑、SM4 提供对称加密、随机数发生器提供私钥种子。面试时如果能把这个层次关系说清楚,面试官会认为你真的做过落地项目。

1.5 SM2 与 RSA 的实际工程抉择

如果你现在要做一个新系统,选 SM2 还是 RSA?我直接给建议:

  • 国内合规场景(金融、政务、医疗、电力):必须上 SM2,没得选。RSA 不合规。
  • 性能敏感场景:使用 SM2,密钥短、签名快、证书体积小。我做过一个支付网关,从 RSA-2048 迁到 SM2 后,TLS 握手时间缩短了 40%。
  • 海外互通场景:如果对方系统不支持国密,你可能需要用 RSA 或国际 ECC。但可以考虑“双证书策略”——同时签发 SM2 和 RSA 证书。
我的个人习惯:在新项目中,只要合规允许,我优先选 SM2。不是因为“国密就最好”,而是 SM2 在 256 位密钥下达到了 AES-128 的安全等级,性价比很高。而且国内生态现在已经很成熟——OpenSSL 1.1.1+ 原生支持 SM2/SM3/SM4,GmSSL、TencentSM、BabaSSL 都有国密实现。

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 高。两者的安全等级由密钥长度决定,与算法类型无关。”

好了,这一章我们把 SM2 的数学背景、国密标准体系、以及它跟 RSA、传统 ECC 的对比都过了一遍。你想想看,这些东西其实不难——底子就是一条曲线 + 一个点乘运算,再加上国密标准固定了参数。下一层我们需要深入 SM2 的签名流程和代码实现,到时候你会看到这些概念是怎么落地的。