2. 密码学基础(上)
各位同学,欢迎来到《签名包机制与固件防篡改实战》的第二章节。今天咱们不急着写代码,先把密码学这块地基夯实了。说实话,我见过太多固件被攻破的案例,根子都出在密码学基础不牢上。你想想看,连加密算法怎么工作的都不清楚,怎么保证签名包不被伪造?
这一章我会把对称加密、非对称加密和哈希函数的核心原理讲透。别担心数学公式,我会用工程视角来拆解。咱们的目标是:学完就能在固件安全场景里做出正确的技术选型。
一、对称加密:AES 的原理与模式
对称加密,说白了就是加密和解密用同一把钥匙。你拿它锁门,也得拿它开门。在固件领域,AES 是绝对的主流。我个人习惯把 AES 看作一个「黑盒置换网络」,它通过多轮混淆和扩散,把明文打散成密文。
1.1 AES 核心原理
AES 的密钥长度可以是 128、192 或 256 位。我建议你在固件项目中至少用 AES-256,虽然慢一点,但安全余量足。它的核心操作就四个:
- SubBytes(字节代换):通过 S 盒非线性替换每个字节。这是抗线性攻击的关键。
- ShiftRows(行移位):把状态矩阵的行循环移位,实现字节间的扩散。
- MixColumns(列混合):对每列做矩阵乘法,进一步扩散。
- AddRoundKey(轮密钥加):把当前状态和轮密钥异或。
嗯,这里要注意:AES 不是简单地把这些操作重复一遍。128 位密钥需要 10 轮,192 位 12 轮,256 位 14 轮。每轮的轮密钥由初始密钥通过密钥扩展算法生成。
1.2 AES 工作模式
光有 AES 算法还不够,你得选一个工作模式。模式决定了如何把明文分块、如何关联各块。我列个表,把常见的几个模式说清楚:
| 模式 | 特点 | 固件场景适用性 | 我踩过的坑 |
|---|---|---|---|
| ECB | 每块独立加密,相同明文得到相同密文 | ❌ 不推荐 | 曾经用 ECB 加密固件配置块,攻击者通过密文模式直接推断出配置内容 |
| CBC | 每块与前一块密文异或后再加密,需要 IV | ✅ 可用,但注意 IV 管理 | IV 写死在代码里,导致同一固件不同实例的加密结果相同 |
| CTR | 将计数器加密后与明文异或,可并行 | ✅ 推荐 | 计数器溢出导致密钥流重复,幸好测试阶段发现了 |
| GCM | CTR + 认证标签,同时提供加密和完整性校验 | ✅ 强烈推荐 | 现在我的固件加密首选 GCM,省掉单独算 MAC 的麻烦 |
二、非对称加密:RSA 与 ECC 原理
非对称加密,就是公钥加密、私钥解密,或者反过来。在签名包机制里,我们通常用私钥签名、公钥验签。这样私钥只保存在签名服务器上,设备端只存公钥,安全性大大提高。
2.1 RSA 原理
RSA 的安全性基于大整数分解的困难性。简单说就是:两个大素数相乘很容易,但从乘积反推出两个素数极难。RSA 的密钥对生成过程是这样的:
- 随机选择两个大素数 p 和 q
- 计算 n = p × q
- 计算 φ(n) = (p-1)(q-1)
- 选择公钥指数 e(常用 65537)
- 计算私钥指数 d,满足 e × d ≡ 1 (mod φ(n))
公钥是 (n, e),私钥是 (n, d)。加密时计算 c = m^e mod n,解密时 m = c^d mod n。
2.2 ECC 原理
ECC(椭圆曲线密码学)是 RSA 的强力竞争者。它的安全性基于椭圆曲线离散对数问题。同样的安全强度下,ECC 的密钥长度远小于 RSA。举个例子:
| 安全等级 | RSA 密钥长度 | ECC 密钥长度 |
|---|---|---|
| 80 位 | 1024 位 | 160 位 |
| 112 位 | 2048 位 | 224 位 |
| 128 位 | 3072 位 | 256 位 |
| 256 位 | 15360 位 | 512 位 |
看到差距了吧?在资源受限的嵌入式设备上,ECC 优势明显。我建议固件签名优先考虑 ECC,特别是 NIST P-256 或 Curve25519 曲线。
三、哈希函数:SHA-256 特性与碰撞
哈希函数,你可以把它想象成一个「数字指纹提取器」。不管输入多大,输出固定长度。而且,哪怕输入只改一个比特,输出也会面目全非。在签名包机制里,我们通常先对固件算哈希,再对哈希值签名。这样既保证完整性,又提高签名效率。
3.1 SHA-256 核心特性
- 固定输出长度:256 位,32 字节
- 单向性:从哈希值反推输入,计算上不可行
- 抗碰撞性:找到两个不同输入产生相同哈希值,计算上不可行
- 雪崩效应:输入微小变化,输出约一半比特翻转
SHA-256 的处理流程大致是:填充消息到 512 位的倍数,分成 512 位块,每块经过 64 轮压缩函数,最终输出 256 位摘要。
3.2 碰撞问题
理论上,任何哈希函数都存在碰撞,因为输入空间远大于输出空间。但实际中,找到碰撞的难度取决于哈希函数的设计强度。SHA-256 目前没有已知的有效碰撞攻击。
不过,SHA-1 已经被攻破了。2017 年,Google 和 CWI 研究所展示了第一个 SHA-1 碰撞实例。这意味着什么?如果你还在用 SHA-1 做固件签名,攻击者可以构造两个不同固件,但哈希值相同,从而绕过签名验证。
四、知识体系总览
为了让你更直观地理解这三类密码学原语在固件安全中的关系,我画了一张结构图:
五、实战选型建议
学完原理,咱们得落地。我根据多年固件安全经验,给你几个选型建议:
- 固件加密存储:用 AES-256-GCM。GCM 模式自带认证标签,能检测密文是否被篡改。密钥用设备唯一密钥(从硬件安全模块派生)。
- 固件签名:用 ECDSA with SHA-256。曲线选 NIST P-256 或 Curve25519。签名过程在安全服务器上完成,设备只验签。
- 固件完整性校验:用 SHA-256。在启动加载阶段,计算固件哈希,与签名包中的哈希值比对。
- 密钥管理:公钥烧死在设备一次性可编程存储器(OTP)中。私钥保存在硬件安全模块(HSM)里,永远不离开 HSM。