3. 非对称加密算法:RSA、ECC、SM2 与安全强度对比
聊到设备 PKI,核心绕不开非对称加密。说白了,就是一对钥匙——公钥加密,私钥解密。我这些年做过的项目,从智能门锁到车载 T-Box,底层算法选型几乎决定了整个安全体系的基调和成本。今天咱们就把 RSA、ECC 和 SM2 这三兄弟掰开揉碎讲清楚。
3.1 RSA 算法原理
RSA 是上世纪 70 年代的产物,至今仍是应用最广的非对称算法。它的数学基础很简单——大整数分解难题。
大致流程是这样的:
- 选两个大质数 p 和 q,计算 n = p × q。
- 计算欧拉函数 φ(n) = (p-1)(q-1)。
- 选一个公钥指数 e,通常取 65537。
- 计算私钥 d,满足 e × d ≡ 1 (mod φ(n))。
加密时:c = me mod n
解密时:m = cd mod n
嗯,公式看着简单,但实际工程里坑不少。我记得有一次做网关设备证书签发,RSA 密钥对生成在嵌入式芯片上跑了整整 40 秒——用户差点以为设备死机了。这就是 RSA 的一个痛点:密钥生成慢,尤其 p 和 q 要足够大、足够随机。
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 混用,结果互认失败——因为两条曲线的基点不一样。
3.3 SM2 国密算法
SM2 是国家密码管理局发布的椭圆曲线公钥密码算法,2010 年成为标准。说白了,它是中国版的 ECC,但曲线参数和签名流程都是自主设计的。
SM2 的曲线方程和 ECC 一样,但参数不同:
- 素数 p:256 位
- 系数 a、b:国密指定
- 基点 G:国密指定
- 阶 n:略小于 2²⁵⁶
SM2 签名流程比 ECDSA 多了一个「ZA 值」——它是用户标识、曲线参数和公钥的哈希。这个设计防止了签名被跨场景复用。我在做政务网关项目时,客户明确要求必须用 SM2,因为等保三级评审里「国密合规」是硬指标。
实际部署 SM2 要注意什么?
- OpenSSL 版本:1.1.1 以上才原生支持 SM2,低版本需要打补丁。
- 证书格式:SM2 证书的 OID 和 RSA/ECC 不同,CA 系统要单独配置。
- 性能:SM2 签名比 ECC P-256 慢约 20%-30%,但密钥生成速度差不多。
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。
3.5 算法选型决策框架
下面这张图是我自己总结的选型逻辑,画成 SVG 方便你理解。
这张图的核心逻辑很简单:先看有没有国密合规要求,有就上 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 方案时做出不后悔的决策。