3. 非对称加密算法:RSA、ECC、SM2 与安全强度对比

聊到设备 PKI,核心绕不开非对称加密。说白了,就是一对钥匙——公钥加密,私钥解密。我这些年做过的项目,从智能门锁到车载 T-Box,底层算法选型几乎决定了整个安全体系的基调和成本。今天咱们就把 RSA、ECC 和 SM2 这三兄弟掰开揉碎讲清楚。

3.1 RSA 算法原理

RSA 是上世纪 70 年代的产物,至今仍是应用最广的非对称算法。它的数学基础很简单——大整数分解难题。

大致流程是这样的:

  1. 选两个大质数 p 和 q,计算 n = p × q。
  2. 计算欧拉函数 φ(n) = (p-1)(q-1)。
  3. 选一个公钥指数 e,通常取 65537。
  4. 计算私钥 d,满足 e × d ≡ 1 (mod φ(n))。

加密时:c = me mod n
解密时:m = cd mod n

嗯,公式看着简单,但实际工程里坑不少。我记得有一次做网关设备证书签发,RSA 密钥对生成在嵌入式芯片上跑了整整 40 秒——用户差点以为设备死机了。这就是 RSA 的一个痛点:密钥生成慢,尤其 p 和 q 要足够大、足够随机。

避坑指南:我曾经遇到一个项目,开发人员为了省时间,直接用了 OpenSSL 默认的随机数种子生成 RSA 密钥。结果同一批次设备的私钥竟然有重复!后来排查发现是硬件熵源没初始化。记住:RSA 的安全性高度依赖随机数质量,嵌入式设备尤其要检查 TRNG(真随机数发生器)是否正常工作。

3.2 ECC 椭圆曲线算法

ECC 是 RSA 的「后浪」。它基于椭圆曲线离散对数问题(ECDLP),数学上比 RSA 更「难啃」。你想想看,同样的安全强度,ECC 的密钥长度只有 RSA 的十分之一左右。

椭圆曲线方程长这样:y² = x³ + ax + b(外加一个无穷远点)。

核心操作是「点乘」:k × G,其中 G 是基点,k 是私钥(一个大整数),结果 Q 就是公钥。从 Q 反推 k 在计算上不可行——这就是 ECC 的安全根基。

我个人习惯在 IoT 设备上优先考虑 ECC。为什么?

  • 密钥短:256 位 ECC 约等于 3072 位 RSA 的安全强度。
  • 运算快:签名和密钥交换比 RSA 快一个数量级。
  • 带宽省:证书体积小,适合 NB-IoT、LoRa 这类窄带通信。

但 ECC 也有脾气。曲线参数选错了,安全强度直接归零。我见过有人用 SECP256r1 和 SECP256k1 混用,结果互认失败——因为两条曲线的基点不一样。

经验之谈:做设备 PKI 时,建议统一使用 NIST P-256(即 secp256r1)或 Curve25519。前者兼容性最好,后者性能更优。别自己「发明」曲线参数,那是密码学家干的事。

3.3 SM2 国密算法

SM2 是国家密码管理局发布的椭圆曲线公钥密码算法,2010 年成为标准。说白了,它是中国版的 ECC,但曲线参数和签名流程都是自主设计的。

SM2 的曲线方程和 ECC 一样,但参数不同:

  • 素数 p:256 位
  • 系数 a、b:国密指定
  • 基点 G:国密指定
  • 阶 n:略小于 2²⁵⁶

SM2 签名流程比 ECDSA 多了一个「ZA 值」——它是用户标识、曲线参数和公钥的哈希。这个设计防止了签名被跨场景复用。我在做政务网关项目时,客户明确要求必须用 SM2,因为等保三级评审里「国密合规」是硬指标。

实际部署 SM2 要注意什么?

  1. OpenSSL 版本:1.1.1 以上才原生支持 SM2,低版本需要打补丁。
  2. 证书格式:SM2 证书的 OID 和 RSA/ECC 不同,CA 系统要单独配置。
  3. 性能:SM2 签名比 ECC P-256 慢约 20%-30%,但密钥生成速度差不多。
核心结论:如果项目有国密合规要求,SM2 是必选项。如果没有,ECC P-256 在性能和生态成熟度上更优。RSA 适合需要兼容老旧系统的场景。

3.4 密钥长度与安全强度对比

很多人问我:「密钥越长越安全,对吧?」
对,但不全对。安全强度不是线性增长的。我整理了一张对比表,你一看就明白。

安全等级 RSA 密钥长度 ECC 密钥长度 SM2 密钥长度 对称密钥等效
80 位 1024 160 — 80
112 位 2048 224 — 112
128 位 3072 256 256 128
192 位 7680 384 — 192
256 位 15360 521 — 256

看到没?128 位安全强度下,RSA 要 3072 位,ECC 和 SM2 只要 256 位。这就是为什么现代 PKI 系统都在往 ECC 迁移——证书小、握手快、省电。

但 RSA 1024 位已经被破解了(2010 年学术界公开分解了一个 1024 位 RSA 模数)。现在最低要求是 2048 位,我建议新项目直接上 3072 位或切 ECC。

注意:密钥长度不是越大越好。RSA 4096 位在嵌入式设备上签名一次可能要 200 毫秒以上,电池根本扛不住。选型时要平衡安全、性能和功耗。

3.5 算法选型决策框架

下面这张图是我自己总结的选型逻辑,画成 SVG 方便你理解。

非对称算法选型决策框架 非对称算法选型决策框架 设备 PKI 算法选型 有国密合规要求? 无国密合规要求 SM2 国密算法 兼容老旧系统? RSA 2048/3072 ECC P-256 选型建议 IoT 设备优先 ECC P-256 或 SM2;服务端可保留 RSA 3072 做兼容;2048 位以下 RSA 不建议新项目使用。

这张图的核心逻辑很简单:先看有没有国密合规要求,有就上 SM2;没有就看是否需要兼容老旧系统,需要就留 RSA,不需要直接上 ECC P-256。我个人在 90% 的新项目里都推荐 ECC——省带宽、省电、省证书存储空间。

3.6 工程落地避坑清单

最后,我把自己踩过的坑列出来,你直接拿去用:

  • 随机数质量:嵌入式设备一定要用硬件 TRNG,别用软件伪随机。我见过某款 MCU 的随机数生成器在低温下输出重复值,导致密钥碰撞。
  • 曲线参数校验:ECC/SM2 公钥必须校验是否在曲线上。攻击者可以伪造一个不在曲线上的公钥,绕过验证。
  • 密钥存储:私钥绝不能明文存 Flash。用安全元件(SE)或 TEE 保护,至少也要做 AES 加密存储。
  • 证书链长度:RSA 证书链每多一级,握手时间增加约 5-10ms。ECC 证书链短,优势明显。
  • 算法降级攻击:服务端要禁用 SSLv3、TLS 1.0/1.1,只允许 TLS 1.2+,且 cipher suite 里只保留 ECDHE 或 SM2 套件。

嗯,算法选型没有银弹。RSA 像老黄牛,稳但笨重;ECC 像跑车,快但挑路;SM2 像合规的专车,特定场景必须上。理解它们的数学原理和工程特性,你才能在设计 PKI 方案时做出不后悔的决策。