2、非对称加密基础:公钥与私钥、RSA与ECC算法对比、密钥长度与安全强度

聊固件签名信任,绕不开非对称加密。说白了,它就是整个信任链的数学地基。

我刚开始做嵌入式安全那会儿,总觉得这玩意儿是纯数学问题,离工程很远。后来踩了几次坑才明白——选错算法、配错密钥长度,轻则固件升级慢得像蜗牛,重则签名直接被攻破。嗯,今天咱们就把这块掰开揉碎了讲清楚。

2.1 公钥与私钥:一对天生的搭档

非对称加密的核心,就是一对密钥:私钥和公钥。

  • 私钥:自己藏着,谁都不给。用来签名或解密。
  • 公钥:公开出去,谁要都行。用来验签或加密。

你想想看,这就像一把锁和一把钥匙。私钥是钥匙,公钥是锁。你用私钥签名,别人用公钥验签——确认这固件确实是你发的,没被篡改过。

核心原则:私钥永远不能离开安全存储区(比如HSM、SE、TEE)。我在项目中见过有人把私钥硬编码在固件里……嗯,那次之后整个产品线都重做了。

为什么叫“非对称”?因为加密和解密用的不是同一把钥匙。公钥加密的数据,只有私钥能解开;私钥签名的数据,只有公钥能验证。这种单向性,是信任模型的根基。

2.2 RSA与ECC:两大主流算法对比

目前固件签名领域,RSA和ECC是两大主流。我个人的习惯是:资源够用上RSA,资源紧张上ECC。但具体怎么选,得看场景。

2.2.1 RSA:老牌劲旅

RSA诞生于1977年,基于大整数分解难题。简单说就是:两个大质数相乘很容易,但把乘积分解回质数极难。

  • 优点:实现成熟,硬件加速普遍,兼容性最好。
  • 缺点:密钥越长,计算越慢。2048位RSA签名,在低端MCU上可能要几百毫秒。
  • 典型场景:服务器端签名、PC/手机端验签。

我的经验:在Cortex-M4上做RSA-2048验签,优化得好大概50ms。但如果用RSA-4096,直接飙到200ms+。所以嵌入式端我一般只验签,签名放服务器。

2.2.2 ECC:后起之秀

ECC基于椭圆曲线离散对数难题。同样的安全强度下,ECC的密钥长度远小于RSA。

  • 优点:密钥短、签名小、计算快。256位ECC ≈ 3072位RSA的安全强度。
  • 缺点:实现复杂,曲线选择多(P-256、secp256k1、Curve25519等),选错了有坑。
  • 典型场景:IoT设备、资源受限的MCU、需要频繁签名的场景。

避坑指南:我曾经在项目里用了secp256r1(P-256),结果发现某个老款MCU的硬件加速器只支持P-256,不支持secp256k1。嗯,从那以后我养成了习惯——先查硬件支持列表,再选曲线。

2.3 密钥长度与安全强度:别被数字骗了

很多人觉得密钥越长越安全。其实不对。安全强度取决于算法和密钥长度的组合。我整理了一张对比表,你一看就明白:

安全强度(位) RSA密钥长度 ECC密钥长度 签名大小 典型场景
80 1024 160-223 128B / 40-56B 已不推荐
112 2048 224-255 256B / 56-64B 当前最低标准
128 3072 256-383 384B / 64-96B 推荐长期使用
192 7680 384-511 960B / 96-128B 高安全场景
256 15360 512+ 1920B / 128B+ 未来10年

看到没?RSA-2048和ECC-256的安全强度差不多,但签名大小差了4倍。在固件升级场景里,签名大小直接影响升级包体积和传输时间。你想想看,一个IoT设备通过BLE传固件,多传256字节可能要多花好几秒。

我的建议:新项目直接上ECC P-256(secp256r1)。安全强度128位,签名只有64字节,大多数MCU硬件加速器都支持。除非你有兼容性要求(比如必须跟老系统对接),才考虑RSA-2048。

2.4 一张图看懂非对称加密在固件签名中的角色

下面这张SVG图,把公钥/私钥、RSA/ECC、密钥长度和固件签名的关系串起来了。我画的时候特意把信任链的流向标清楚了:

非对称加密在固件签名信任链中的角色 非对称加密 → 固件签名信任链 私钥(签名者持有) RSA-2048 / ECC P-256 签名算法 公钥(设备端验证) 固件中预置 / 证书链 输入 输出 安全强度 = 算法强度 + 密钥长度 + 随机数质量 缺一不可,任何一个短板都会导致信任链断裂 RSA-2048: 256B签名 ECC P-256: 64B签名 安全强度 ≈ 128位

2.5 实际选型建议

说了这么多理论,最后给点实在的。我根据项目经验,总结了几个选型原则:

  1. 别用RSA-1024了。NIST早在2015年就建议淘汰,现在用就是给自己挖坑。
  2. ECC优先选P-256。兼容性好,硬件支持广,安全强度够用。
  3. 如果MCU没有硬件加速器,ECC的软件实现比RSA快得多。我在STM32F0上跑过,ECC-256签名验证只要30ms,RSA-2048要150ms。
  4. 签名大小敏感的场景(比如BLE OTA),无脑选ECC。64字节 vs 256字节,差距太大了。
  5. 后量子安全暂时不用考虑。等NIST标准定下来再说,现在ECC和RSA还能用10年。

一个小技巧:如果你不确定选哪个,就用ECC P-256 + RSA-2048双算法支持。固件里同时预置两种公钥,签名时根据设备能力选择。我上一个项目就是这么干的,兼容性拉满。

好了,非对称加密的基础就聊到这儿。记住一句话:私钥是命根子,公钥是通行证,算法是锁芯,密钥长度是锁的粗细。任何一个环节出问题,信任链就断了。