3、RSA签名算法:RSA密钥生成、RSA签名与验签流程、RSA在安全启动中的局限性
聊到安全启动,RSA 绝对是绕不开的经典算法。我最早接触 RSA 是在做一款车载 TBox 的安全启动方案时,那时候对它的理解还停留在「公钥加密、私钥解密」这个层面。后来真正上手做签名验签,才发现这里面门道不少。今天咱们就把 RSA 在安全启动里的角色拆开来看。
3.1 RSA 密钥生成——大质数是地基
RSA 的安全性,说白了就建立在「大数分解很难」这个数学事实上。你想想看,两个大质数乘起来很容易,但给你一个乘积让你反推是哪两个质数,那就难了。
密钥生成的步骤大致是这样:
- 随机选两个大质数 p 和 q,长度通常 1024 位或 2048 位
- 计算 n = p × q,n 就是模数
- 计算欧拉函数 φ(n) = (p-1)(q-1)
- 选一个公钥指数 e,常用 65537(0x10001)
- 计算私钥指数 d,满足 e × d ≡ 1 (mod φ(n))
- 公钥就是 (n, e),私钥就是 (n, d)
这里有个坑——p 和 q 不能太接近。我曾经在项目里见过一个同事用随机数生成器,结果 p 和 q 差值很小,导致 n 能被快速分解。嗯,那批设备差点要召回重做。
我的习惯:生成密钥对时,我会额外检查 p 和 q 的差值是否大于 2^(bitlen/2 - 100)。这个经验值是从一次安全审计中学来的。
3.2 RSA 签名与验签流程
签名和验签,很多人容易和加密解密搞混。我简单说:签名用私钥,验签用公钥。这和加密正好反过来。
签名流程
- 对原始消息做哈希运算,得到消息摘要
- 用私钥对摘要做 RSA 运算,生成签名
- 把原始消息和签名一起发给接收方
验签流程
- 接收方拿到消息和签名
- 对消息做同样的哈希运算
- 用公钥解密签名,得到摘要
- 对比两个摘要,一致则验签通过
代码实现其实不复杂。下面是一个简化的签名示例:
// 签名端(私钥签名)
uint8_t hash[SHA256_DIGEST_SIZE];
SHA256_Compute(message, message_len, hash);
uint8_t signature[RSA_KEY_SIZE];
RSA_Private_Encrypt(hash, SHA256_DIGEST_SIZE,
private_key, signature);
// 验签端(公钥验签)
uint8_t hash_from_msg[SHA256_DIGEST_SIZE];
SHA256_Compute(message, message_len, hash_from_msg);
uint8_t hash_from_sig[SHA256_DIGEST_SIZE];
RSA_Public_Decrypt(signature, RSA_KEY_SIZE,
public_key, hash_from_sig);
if (memcmp(hash_from_msg, hash_from_sig, SHA256_DIGEST_SIZE) == 0) {
// 验签通过
} else {
// 验签失败
}
注意:实际产品中绝对不能直接用裸 RSA 签名。必须使用 PKCS#1 v1.5 或 PSS 填充方案。我见过一个 IoT 设备因为没用填充,被选择密文攻击直接攻破。
3.3 RSA 在安全启动中的局限性
RSA 虽然经典,但在安全启动场景下,有几个硬伤不得不提。
| 局限性 | 具体表现 | 影响 |
|---|---|---|
| 签名体积大 | 2048 位 RSA 签名占 256 字节 | 增加固件包大小,小 MCU 吃不消 |
| 验签速度慢 | 公钥验签比 ECC 慢 5-10 倍 | 启动时间变长,用户体验差 |
| 密钥长度增长 | 量子计算威胁下需 4096 位以上 | 存储和计算开销翻倍 |
| 填充方案复杂 | PSS 实现容易出错 | 引入安全漏洞风险 |
我在一个智能门锁项目里就吃过 RSA 的亏。当时选了 2048 位 RSA,结果那颗 Cortex-M0 的 MCU 验签一次要 800 多毫秒。用户按指纹开门,愣是等了一秒多才响应。后来换成了 ECDSA,验签时间降到了 50 毫秒以内。
核心结论:RSA 在安全启动中仍然可用,但更适合以下场景:
- 有硬件加速器的 SoC(比如很多 ARM Cortex-A 系列)
- 对启动时间不敏感的设备(如网关、服务器)
- 需要兼容旧有 PKI 体系的系统
下面这张图能帮你快速理解 RSA 签名验签在安全启动中的位置:
说实话,RSA 在安全启动领域正在被 ECC 和 Ed25519 逐步替代。但很多老项目、车规级芯片、以及需要兼容 FIPS 140 认证的场景,RSA 依然是主力。我的建议是:新项目优先考虑 ECDSA,存量系统做好 RSA 密钥长度升级计划。
避坑指南:如果你必须在资源受限的 MCU 上用 RSA,记得开启硬件加速器。我曾经在 STM32H7 上做过测试,开启硬件 RSA 后验签时间从 300ms 降到了 8ms。差距就是这么大。