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 密钥对其实就三步:

  1. 生成私钥 d:在 [1, n-2] 范围内选取一个随机整数。n 是基点的阶,约 2²⁵⁶ 量级。
  2. 计算公钥 P:P = d · G,即私钥乘以基点。这是椭圆曲线上的标量乘法。
  3. 验证:检查 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 算法基础 椭圆曲线密码学 曲线方程 y²=x³+ax+b 点加法与标量乘法 ECDLP 数学难题 SM2 参数与密钥对 系统参数(p,a,b,G,n) 私钥 d + 公钥 P=d·G 密钥对生成与验证 SM2 vs RSA vs ECC 密钥长度对比 性能与合规性 物联网场景选型建议 核心结论 SM2 以 256 位密钥提供 128 位安全强度,兼顾性能与合规

这张图把本章的三个核心模块串起来了。从左到右:先理解椭圆曲线密码学的数学基础,再掌握 SM2 的具体参数和密钥生成流程,最后通过对比分析明确 SM2 在物联网场景中的定位。

我个人觉得,学 SM2 最好的方式就是「先理解 ECC 的数学直觉,再记住 SM2 的参数细节,最后用对比表格做决策」。别一上来就啃曲线方程,容易劝退。

学习建议:如果你对椭圆曲线的点加法运算感到抽象,可以找一个小型曲线(比如 y² = x³ + 2x + 3 在有限域上)手动算几个点加法的例子。我当年就是这么入门的,算过一遍就通了。