2、SM2算法基础理论:椭圆曲线密码学简介、SM2算法参数与密钥对生成、SM2与RSA/ECC的对比分析
2.1 椭圆曲线密码学——从几何到密码
说实话,我第一次接触椭圆曲线时,脑子里全是「这玩意儿怎么跟加密扯上关系的?」。后来做物联网安全方案选型,才真正体会到它的精妙。
椭圆曲线密码学(ECC)的核心,是一条满足特定形式的曲线方程:y² = x³ + ax + b。配上判别式 4a³ + 27b² ≠ 0,保证曲线光滑、没有尖点或自交。
你想想看,在这条曲线上定义一种「加法」运算——两个点连一条线,延长后与曲线交于第三点,再关于 x 轴对称反射,结果就是「和」。这个运算构成一个阿贝尔群。
真正让密码学家兴奋的是标量乘法:给定一个基点 G,计算 k·G(k 个 G 相加)很容易;但反过来,已知 G 和 Q = k·G,求 k 几乎不可能——这就是椭圆曲线离散对数问题(ECDLP)。ECC 的安全性就建立在这个数学难题上。
核心理解:ECC 用更短的密钥长度,提供了与 RSA 相当甚至更高的安全强度。在物联网这种资源受限的场景里,这简直是天赐之物。
2.2 SM2 算法参数与密钥对生成
SM2 是国家密码管理局发布的椭圆曲线公钥密码算法标准(GM/T 0003-2012)。它基于 ECC,但参数是自主设计的。我在项目中遇到过不少芯片只支持 SM2 而不支持国际 ECC 曲线,所以选型时一定要确认硬件是否原生支持。
2.2.1 系统参数
SM2 使用一条特定的 256 位椭圆曲线,参数如下:
| 参数 | 值(十六进制) | 说明 |
|---|---|---|
| p | FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF | 素数域模数,256 位 |
| a | FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC | 曲线系数 a |
| b | 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93 | 曲线系数 b |
| Gx | 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7 | 基点 G 的 x 坐标 |
| Gy | BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0 | 基点 G 的 y 坐标 |
| n | FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123 | 基点 G 的阶(素数) |
避坑指南:我曾经在移植 SM2 到一款低功耗 MCU 时,发现硬件随机数生成器输出的熵不够,导致私钥存在可预测性。后来强制在密钥生成后做一次「已知答案测试(KAT)」才放心。记住:私钥的随机性直接决定安全性,别省这一步。
2.2.2 密钥对生成步骤
生成 SM2 密钥对其实就三步:
- 生成私钥 d:在 [1, n-2] 范围内选取一个随机整数。n 是基点的阶,约 2²⁵⁶ 量级。
- 计算公钥 P:P = d · G,即私钥乘以基点。这是椭圆曲线上的标量乘法。
- 验证:检查 P 是否在曲线上,且 P ≠ O(无穷远点)。
代码实现(伪代码风格):
// SM2 密钥对生成
function generateSM2KeyPair():
d = random(1, n - 2) // 私钥,256 位随机数
P = scalarMultiply(d, G) // 公钥,椭圆曲线点
if not isOnCurve(P) or P == O:
throw "密钥无效,重新生成"
return (d, P)
嗯,这里要注意:标量乘法是性能瓶颈。在固件保护场景中,密钥对通常在产线预置或安全芯片内部生成,不会在应用固件里跑这个运算。
2.3 SM2 与 RSA、ECC 的对比分析
做物联网固件保护,选哪个算法?我个人的习惯是:先看芯片资源,再看安全等级,最后看合规要求。
下面这张表是我在项目评审时经常用的对比框架:
| 对比维度 | SM2(256 位) | RSA(2048 位) | ECC(256 位,如 secp256r1) |
|---|---|---|---|
| 安全强度 | 128 位 | 112 位 | 128 位 |
| 密钥长度 | 32 字节(私钥) | 256 字节(私钥) | 32 字节(私钥) |
| 签名速度 | 快 | 慢 | 快 |
| 验签速度 | 快 | 较慢 | 快 |
| 加密速度 | 中等 | 慢 | 中等 |
| 解密速度 | 中等 | 慢 | 中等 |
| 国密合规 | 是 | 否 | 否 |
| 硬件支持 | 国内芯片普遍支持 | 广泛 | 国际芯片普遍支持 |
| 固件体积影响 | 小(约 2-4 KB 代码) | 大(约 8-12 KB 代码) | 小(约 2-4 KB 代码) |
注意:SM2 和 ECC(如 secp256r1)虽然都是椭圆曲线算法,但曲线参数不同,不能互操作。我在一个项目中见过有人把 SM2 公钥当成 ECC 公钥去验签,结果验签失败排查了两天。别踩这个坑。
2.3.1 为什么 SM2 更适合物联网固件保护?
说白了,三个理由:
- 密钥短,省空间:256 位 SM2 私钥只有 32 字节,RSA 2048 位私钥是 256 字节。固件存储空间寸土寸金,这个差距很关键。
- 运算快,省电:SM2 签名验签比 RSA 快一个数量级。电池供电的 IoT 设备,每次验签少耗几毫焦,积少成多。
- 国标合规:等保 2.0、密评都要求使用国密算法。出口设备另说,但国内项目绕不开。
当然,RSA 也有它的优势——生态成熟,几乎所有平台都有现成库。但如果你从零开始设计固件安全方案,我个人建议优先考虑 SM2。
2.4 本章知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的三个核心模块串起来了。从左到右:先理解椭圆曲线密码学的数学基础,再掌握 SM2 的具体参数和密钥生成流程,最后通过对比分析明确 SM2 在物联网场景中的定位。
我个人觉得,学 SM2 最好的方式就是「先理解 ECC 的数学直觉,再记住 SM2 的参数细节,最后用对比表格做决策」。别一上来就啃曲线方程,容易劝退。
学习建议:如果你对椭圆曲线的点加法运算感到抽象,可以找一个小型曲线(比如 y² = x³ + 2x + 3 在有限域上)手动算几个点加法的例子。我当年就是这么入门的,算过一遍就通了。