1. SM2算法概述:国密标准背景、椭圆曲线密码体制与主流算法对比

各位同行,咱们今天先聊聊SM2的来龙去脉。说实话,我刚接触国密那会儿,心里也犯嘀咕——这玩意儿跟RSA、ECDSA到底差在哪儿?后来在几个等保项目和密评项目中反复折腾,才慢慢摸清了门道。

1.1 国密标准背景:为什么要有自己的密码算法?

SM2是国家密码管理局在2010年发布的椭圆曲线公钥密码算法标准,编号GM/T 0003-2012。说白了,这是咱们国家自己的非对称密码体系。

我印象最深的是2018年参与的一个政务云项目。客户要求必须全栈国密,从SSL证书到签名验签,全部换成SM2。当时市面上成熟的SM2方案还不多,踩了不少坑。但这也让我意识到——国密不是可选项,而是合规的硬门槛。

核心驱动因素:

  • 自主可控:摆脱对RSA、ECDSA等国外算法的依赖,防止后门风险
  • 合规要求:等保2.0、密评、关键信息基础设施保护条例均要求使用国密
  • 性能优势:同等安全强度下,SM2密钥更短、计算更快

嗯,这里要注意:SM2不是单一算法,而是一整套密码体系,包括数字签名、密钥交换、公钥加密三个子协议。标准文档有六部分,我建议做审计的朋友至少把GM/T 0003.1-2012(总则)和GM/T 0003.2-2012(数字签名)啃下来。

3.2 SM2椭圆曲线密码体制:数学原理与工程实现

椭圆曲线密码(ECC)的核心,是在一个有限域上的椭圆曲线点群中定义离散对数问题。SM2选用的是256位的素域椭圆曲线,参数由国密局指定。

公式长这样:y² = x³ + ax + b (mod p),其中p是一个256位的大素数。SM2的曲线参数a、b、基点G、阶n都是固定的,这一点跟ECDSA可以自定义曲线不同。

我个人习惯:做审计时,第一件事就是验证曲线参数是否与标准一致。曾经有个项目,开发人员从网上拷了一段SM2实现,结果曲线参数被篡改过,签名验签一直失败。查了两天才发现是参数问题。

SM2的密钥对生成很简单:

  • 私钥d:一个随机整数,范围[1, n-2]
  • 公钥P:P = d * G,即基点G的d倍点

签名过程稍微复杂些,涉及随机数k、椭圆曲线点乘、模逆运算。我审计时重点关注随机数质量——如果k值重复或可预测,私钥就暴露了。

// SM2签名核心步骤(伪代码)
// 输入:消息M,私钥d,曲线参数
// 输出:签名(r, s)

1. 计算消息摘要 e = SM3(M)
2. 生成随机数 k ∈ [1, n-1]
3. 计算椭圆曲线点 (x1, y1) = k * G
4. 计算 r = (e + x1) mod n
5. 计算 s = ((1 + d)⁻¹ * (k - r * d)) mod n
6. 输出签名 (r, s)

避坑指南:我曾经审计过一个SM2签名模块,发现随机数k的生成使用了C语言的rand()函数。这玩意儿不是密码学安全的随机数生成器,攻击者只要收集到几十个签名,就能通过格攻击还原私钥。切记:SM2的随机数必须使用CTR_DRBG或Hash_DRBG等密码学安全随机数生成器。

1.3 SM2与RSA/ECDSA对比:选型与审计视角

做安全审计,你得知道不同算法的弱点在哪里。我整理了一张对比表,方便大家快速定位风险点。

对比维度 SM2 RSA ECDSA
数学基础 椭圆曲线离散对数 大整数分解 椭圆曲线离散对数
密钥长度(安全等价) 256位 3072位 256位
签名速度 快 慢 快
验签速度 快 快 快
标准曲线 固定(国密指定) N/A 可自定义(如secp256k1)
哈希算法 SM3(256位) SHA-1/SHA-256 SHA-1/SHA-256
主要风险 随机数质量、曲线参数篡改 密钥长度不足、填充攻击 随机数重用、曲线选择不当

你想想看,RSA 3072位密钥才能达到SM2 256位的安全强度,这在嵌入式设备或IoT场景下简直是灾难。我做过一个智能门锁的审计,RSA 2048位签名要花3秒,换成SM2后降到200毫秒,用户体验完全不一样。

至于SM2和ECDSA,虽然数学基础相同,但细节差异很大:

  • 曲线参数:SM2固定,ECDSA可自定义。自定义曲线容易出安全问题,我见过有人用弱曲线导致离散对数问题可解
  • 哈希算法:SM2绑定SM3,ECDSA通常用SHA-256。SM3的安全性经过国家密码管理局评估,目前没有公开的有效攻击
  • 签名结构:SM2的签名(r, s)与ECDSA类似,但计算方式不同。SM2在签名中加入了用户标识,防止签名重用攻击

审计要点总结:

  • 检查SM2曲线参数是否与GM/T 0003标准一致
  • 验证随机数生成器是否为密码学安全级别
  • 确认哈希算法使用SM3而非其他算法
  • 检查密钥长度是否为256位(SM2标准规定)
  • 验证签名验签流程是否包含用户标识

下面这张图展示了SM2在整个国密体系中的位置,以及它与RSA、ECDSA的对比关系。我画这张图时特意把审计关注点标出来了,方便大家做安全评估时快速定位。

SM2算法体系与主流算法对比框架 国密标准 GM/T 0003-2012 数字签名算法 密钥交换协议 公钥加密算法 曲线参数(固定) p, a, b, G, n(256位素域) 哈希算法(固定) SM3(256位输出) SM2 vs RSA • 密钥短80% • 签名快3-5倍 • 无填充攻击风险 SM2 vs ECDSA • 曲线参数固定 • 哈希算法固定 • 含用户标识防重用 审计关注点 • 随机数质量 • 参数完整性 • 实现合规性 审计提示 SM2的固定参数既是优势(减少配置错误),也是风险(一旦参数被篡改,所有依赖方受影响) 建议在审计时:1)校验曲线参数哈希值 2)验证随机数生成器 3)检查SM3实现正确性

最后说一句,SM2不是银弹。我在审计中见过不少实现层面的问题——比如用Java的BigInteger类直接做模逆运算导致侧信道泄露,或者把私钥明文存在数据库里。算法本身安全,但实现不当照样出问题。后面的章节我会逐一展开这些审计要点。