3、非对称加密基础:公钥与私钥的概念,RSA与ECC算法简介

聊到固件签名,绕不开一个核心话题——非对称加密。说实话,我刚入行那会儿,总觉得这玩意儿是数学家的玩具,跟我一个写C的嵌入式工程师没啥关系。直到有一次,我在一个OTA升级项目里,因为签名验签流程没搞透,差点让整批设备变砖……嗯,从那以后,我老老实实把这块啃完了。

今天咱们就把它拆开揉碎,不讲那些吓人的数学公式,只讲你写固件时真正需要知道的东西。

3.1 对称加密 vs 非对称加密:一个简单的比喻

先理清一个基本概念。你想想看,加密这事儿,本质上就是「藏东西」。

  • 对称加密:就像你用一个密码箱,锁上和打开用的是同一把钥匙。你寄给朋友,得先把钥匙也给他。问题是——钥匙在路上被截了怎么办?
  • 非对称加密:更像一个信箱。你把信箱挂在门口,谁都能往里塞信(公钥加密),但只有你有钥匙能打开取信(私钥解密)。

在固件签名场景里,我们用的是非对称加密的另一种玩法——私钥签名,公钥验签。这个顺序千万别搞反了,我见过不少新手在这上面栽跟头。

核心概念一句话:

  • 公钥:公开的,谁都可以拿。用来加密数据或验证签名。
  • 私钥:绝密的,只有签名者持有。用来解密数据或生成签名。

3.2 公钥与私钥:谁管谁?

我个人习惯把这对关系理解成「锁」和「钥匙」的变体。但要注意,这里有两套用法:

场景 发送方用 接收方用 目的
加密通信 接收方的公钥 自己的私钥 保证只有接收方能解密
数字签名 自己的私钥 发送方的公钥 保证数据来源可信、未被篡改

在固件签名联调里,我们主要关心第二行。你拿私钥给固件打个「指纹」,设备端拿公钥验证这个指纹对不对。公钥是公开的,但私钥一旦泄露,整个信任链就崩了。

我曾经踩过的坑: 有个项目把私钥硬编码在了编译脚本里,结果代码仓库被误设为公开……虽然及时发现,但所有已出货的设备都得换公钥。那叫一个酸爽。记住:私钥永远不要出现在代码仓库、编译日志、或者任何可被外部访问的地方。

3.3 RSA算法:老牌劲旅

RSA 是1977年诞生的算法,到今天依然是应用最广泛的非对称加密算法之一。它的安全性基于一个数学难题——大整数分解。

说白了就是:两个大质数乘起来很容易,但给你一个巨大的乘积,想反推出是哪两个质数,难如登天。

在固件签名场景里,RSA 的典型用法是这样的:

// 伪代码示意:RSA签名与验签
// 签名端(私钥操作)
signature = RSA_sign(private_key, firmware_binary);

// 验签端(公钥操作)
result = RSA_verify(public_key, firmware_binary, signature);
if (result == VALID) {
    // 固件可信,允许升级
} else {
    // 固件被篡改,拒绝升级
}

RSA 的优点是成熟、稳定、硬件加速支持好。很多 MCU 和 MPU 都内置了 RSA 硬件加速引擎,算起来飞快。

但缺点也很明显——密钥太长。RSA 2048 位的密钥,光公钥就 256 字节。在资源受限的 IoT 设备上,这可不是个小数目。

RSA 密钥强度 公钥大小 签名大小 安全等级
RSA-1024 128 字节 128 字节 已不推荐
RSA-2048 256 字节 256 字节 当前主流
RSA-4096 512 字节 512 字节 更高安全

我的建议: 如果你的 MCU 有硬件 RSA 加速,且 Flash 空间充裕(比如 2MB 以上),RSA-2048 是稳妥之选。但如果你的设备只有 256KB Flash,RSA 的公钥和签名开销可能会让你头疼。

3.4 ECC算法:后起之秀

ECC(椭圆曲线密码学)是 RSA 的强力竞争者。它的核心优势是——用更短的密钥,达到同等级别的安全强度。

为什么会这样?因为 ECC 的数学基础是椭圆曲线上的离散对数问题,破解难度比大整数分解高得多。你想想看,RSA 2048 位的安全等级,ECC 用 256 位就能搞定。

安全等级 RSA 密钥长度 ECC 密钥长度 签名大小
80 位 1024 位 160 位 约 40 字节
112 位 2048 位 224 位 约 56 字节
128 位 3072 位 256 位 约 64 字节
256 位 15360 位 512 位 约 128 字节

看到没?ECC 256 位的签名才 64 字节,比 RSA 2048 的 256 字节小了四倍。在固件升级场景里,这意味着更少的传输开销、更快的验签速度。

不过 ECC 也有它的脾气:

  • 曲线选择很重要。别自己发明曲线,老老实实用 NIST P-256(也叫 secp256r1)或者 Curve25519。
  • 硬件加速不如 RSA 普及。很多低端 MCU 没有 ECC 硬件加速,纯软件实现会慢一些。
  • 实现复杂度更高。ECC 的侧信道攻击防护比 RSA 更难做。

注意: 千万别用 secp256k1(比特币那条曲线)来做固件签名。那条曲线虽然安全,但缺乏标准化的签名方案,而且很多安全库对它的支持不够完善。我见过有人图省事直接用比特币库的代码,结果验签逻辑跟标准固件升级流程对不上,联调了三天才找到问题。

3.5 RSA vs ECC:怎么选?

这个问题没有标准答案,但我可以给你一些参考:

  • 选 RSA 的场景:MCU 有 RSA 硬件加速、Flash 空间充裕、团队对 RSA 更熟悉、需要兼容旧设备。
  • 选 ECC 的场景:Flash/RAM 受限、传输带宽有限、追求更高安全密度、新项目从头开始。

我个人更倾向 ECC。原因很简单——在 IoT 设备上,每一字节都珍贵。ECC 256 位能搞定的事,何必用 RSA 2048 位呢?

3.6 知识体系总览

下面这张图帮你把本章的核心逻辑串起来:

非对称加密在固件签名中的知识体系 非对称加密 公钥 (Public Key) 私钥 (Private Key) RSA 算法 ECC 算法 私钥签名 · 公钥验签 公钥加密 · 私钥解密 固件签名与验签 固件签名场景中,我们主要使用「私钥签名 · 公钥验签」这条路径

3.7 小结

这一章我们聊了三件事:

  • 公钥和私钥的「锁与钥匙」关系,以及签名场景下的特殊用法。
  • RSA 算法——老牌、稳定、但密钥长。
  • ECC 算法——短小精悍、但实现要小心。