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