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 知识体系总览
下面这张图帮你把本章的核心逻辑串起来:
3.7 小结
这一章我们聊了三件事:
- 公钥和私钥的「锁与钥匙」关系,以及签名场景下的特殊用法。
- RSA 算法——老牌、稳定、但密钥长。
- ECC 算法——短小精悍、但实现要小心。