3、加密算法基础:对称加密(AES/DES)、非对称加密(RSA/ECC)、哈希算法(SHA-256)在固件中的应用

加密算法,说白了就是固件防克隆的「锁芯」。你想想看,加密狗里跑的程序,如果没有加密保护,别人拿个编程器一读,直接就抄走了。我做了这么多年固件逆向,见过太多因为加密选型不当导致被破解的案例。今天咱们就把三种核心算法在固件里的用法掰开揉碎讲清楚。

3.1 对称加密:AES 与 DES

对称加密,就是加密和解密用同一把钥匙。在固件里,它最常用的场景是保护固件镜像本身。我习惯把对称加密比作「保险柜」——钥匙丢了,谁都打不开;钥匙对了,瞬间就能开。

DES 已经过时了,别用。我记得十年前有个项目,客户坚持用 DES 加密固件,结果被我用一台普通 PC 在 24 小时内就破解了密钥。DES 的密钥长度只有 56 位,现在用 FPGA 暴力破解,几分钟的事。

AES 是当前的主流。在固件中,我建议使用 AES-128 或 AES-256。为什么?因为很多低成本的加密芯片(比如 ATECC608A)硬件支持 AES-128,跑起来不费电。如果你用高端一点的 MCU,AES-256 更稳妥。

实战要点:

  • 密钥不要硬编码在固件里。我曾经逆向过一个路由器固件,密钥就写在字符串表里,一眼就看到了。
  • 使用 CBC 或 GCM 模式,不要用 ECB。ECB 模式会泄露明文模式,这在固件加密中是致命的。
  • IV(初始化向量)每次要随机生成,不能固定。
// AES-128 CBC 加密固件块示例(伪代码)
uint8_t key[16] = {0x2b, 0x7e, 0x15, 0x16, ...}; // 从安全存储读取
uint8_t iv[16];  // 随机生成
aes_cbc_encrypt(firmware_block, firmware_len, key, iv);

3.2 非对称加密:RSA 与 ECC

非对称加密,公钥加密、私钥解密。在加密狗里,它主要用来做身份认证和密钥交换。说白了,就是让加密狗证明「我是我」。

RSA 是老牌选手。我建议密钥长度至少 2048 位。为什么?1024 位的 RSA 在 2015 年左右就被证明可以被国家级的攻击者破解了。在固件里,RSA 通常用来签名固件更新包——私钥在厂商手里,公钥烧在加密狗里。这样别人伪造的固件,狗根本不认。

ECC 是后起之秀。同样的安全强度,ECC 的密钥长度只有 RSA 的十分之一。比如 256 位的 ECC 相当于 3072 位的 RSA。在资源受限的加密狗芯片里,ECC 优势明显。我最近一个项目用的就是 ECC P-256 曲线,签名验证速度比 RSA 快了一个数量级。

我的经验:

如果你做的是电池供电的加密狗,优先选 ECC。RSA 的私钥运算太耗电了。我曾经测过,一次 RSA-2048 签名,电流飙到 50mA,持续了 2 秒。ECC 同样的操作,10mA 不到,0.1 秒搞定。

// ECC 签名验证流程(固件端)
// 1. 从加密狗读取公钥
// 2. 接收固件更新包和签名
// 3. 验证签名
if (ecc_verify(public_key, firmware_hash, signature) == SUCCESS) {
    // 签名有效,允许更新
} else {
    // 签名无效,拒绝
}

3.3 哈希算法:SHA-256

哈希算法,不是加密,是「指纹」。SHA-256 会把任意长度的数据,变成固定 256 位的摘要。在固件里,它有三个核心用途:完整性校验、密码存储、数字签名的基础。

完整性校验:每次加密狗启动时,计算固件的 SHA-256 哈希值,和出厂时烧录的哈希值对比。如果对不上,说明固件被篡改了。我见过一个案例,攻击者修改了固件里的一个字节,结果哈希值完全变了,加密狗直接拒绝启动。

密码存储:千万别把用户密码明文存到加密狗里。存 SHA-256 的哈希值。验证时,计算输入密码的哈希,和存储的哈希比对。但要注意,单纯的 SHA-256 不够安全,要加盐(salt)。

避坑指南:

我曾经犯过一个错误:直接用 SHA-256 对密码做哈希,没加盐。结果用户密码是 "123456",彩虹表一查就出来了。后来我改成 SHA-256(salt + password),每次随机生成盐值,这个问题才解决。

// 固件完整性校验示例
uint8_t expected_hash[32] = {0xab, 0xcd, ...}; // 出厂时烧录
uint8_t computed_hash[32];
sha256_calculate(firmware_start, firmware_size, computed_hash);
if (memcmp(expected_hash, computed_hash, 32) == 0) {
    // 固件完整
} else {
    // 固件被篡改,进入安全模式
}

3.4 三种算法在固件中的协同使用

实际项目中,这三种算法很少单独使用。我习惯把它们组合起来,形成一套完整的加密体系。

场景 对称加密 非对称加密 哈希算法
固件加密存储 AES-256 加密固件 RSA 加密 AES 密钥 SHA-256 校验完整性
固件更新 AES 解密更新包 ECC 签名验证 SHA-256 生成摘要
身份认证 ECC 挑战-响应 SHA-256 生成挑战值
密码保护 SHA-256 + 盐值

举个例子:加密狗启动时,先用 SHA-256 校验固件完整性。如果通过,再用 ECC 和主机做双向认证。认证成功后,用 RSA 加密的 AES 密钥解密固件核心代码。你看,三种算法各司其职,缺一不可。

核心原则:

  • 对称加密:速度快,用来加密大量数据
  • 非对称加密:安全性高,用来保护对称密钥和做签名
  • 哈希算法:不可逆,用来做完整性校验和密码存储

三者结合,才能构建一个真正安全的加密狗系统。

嗯,这一章的内容就到这里。下一章我们会深入讲加密算法的具体实现,包括如何在资源受限的 MCU 上高效运行这些算法。到时候我会分享一些我在优化 AES 实现时踩过的坑,保证让你少走弯路。