4、加密算法基础:对称加密(AES)、非对称加密(RSA/ECC)、哈希算法(SHA-256)
加密算法,说白了就是给数据上锁的钥匙。在嵌入式加密狗里,这三类算法各司其职,缺一不可。我做了这么多年安全方案,见过太多因为选错算法导致整个系统被攻破的案例。今天咱们就把这三兄弟掰开揉碎了讲清楚。
4.1 对称加密:AES 算法
对称加密,顾名思义,加密和解密用的是同一把钥匙。就像你家的门锁,用钥匙锁上,还得用同一把钥匙打开。在嵌入式环境里,AES 是绝对的主流。
核心要点:AES 是目前公认最安全的对称加密算法,硬件加速器在多数 MCU 上都有集成。
4.1.1 AES 的工作模式
我个人习惯把 AES 的工作模式分成两类:流模式(CTR、GCM)和块模式(ECB、CBC)。这里有个坑,我一开始做项目时也踩过。
- ECB(电子密码本模式):最简单,但最不安全。同样的明文块会加密成同样的密文块。我在一个门禁项目里见过有人用 ECB 加密卡片 ID,结果被攻击者直接重放攻击。千万别用!
- CBC(密码分组链接模式):每个明文块先和前一个密文块异或,再加密。需要初始化向量(IV)。这是最常用的模式。
- CTR(计数器模式):把 AES 当成流密码用,可以并行计算。适合需要随机访问的场景。
- GCM(伽罗瓦/计数器模式):CTR 模式加上认证标签,既能加密又能防篡改。我强烈推荐在加密狗里用这个模式。
注意:ECB 模式在嵌入式加密狗中绝对禁用。我曾经在一个客户代码里发现他们用 ECB 加密固件,结果攻击者通过分析密文模式直接还原了部分固件结构。
4.1.2 AES 的密钥长度
AES 支持 128、192、256 位密钥。在加密狗里,我建议直接用 AES-256。虽然计算量稍大,但安全裕度更高。你想想看,128 位的密钥空间是 2^128,这已经够大了,但量子计算机出现后,256 位会更稳妥。
// AES-256 CBC 模式加密示例(伪代码)
uint8_t key[32] = {0x2b, 0x7e, 0x15, 0x16, ...}; // 256位密钥
uint8_t iv[16] = {0x00, 0x01, 0x02, ...}; // 初始化向量
uint8_t plaintext[] = "Hello, Secure World!";
uint8_t ciphertext[sizeof(plaintext)];
aes256_cbc_encrypt(key, iv, plaintext, ciphertext, sizeof(plaintext));
小技巧:在嵌入式环境里,密钥不要硬编码在代码里。我习惯把密钥存储在加密狗的 OTP(一次性可编程)区域,或者用物理不可克隆函数(PUF)生成。
4.2 非对称加密:RSA 与 ECC
非对称加密,就是公钥和私钥成对出现。公钥可以公开,私钥必须保密。这玩意儿在加密狗里主要用于密钥交换和数字签名。
4.2.1 RSA 算法
RSA 基于大整数分解的数学难题。简单说,两个大素数相乘很容易,但反过来分解就很难。我刚开始接触 RSA 时,觉得这原理挺优雅的。
- 密钥长度:RSA 至少要用 2048 位,1024 位已经被认为不安全了。在加密狗里,我建议用 4096 位,虽然慢点,但安全。
- 性能问题:RSA 在嵌入式环境里很慢。一次 2048 位的签名操作可能需要几百毫秒。所以一般只用来做密钥交换,不直接加密大量数据。
- 应用场景:数字签名、证书验证、密钥封装。
避坑指南:我曾经在一个项目中,用 RSA 直接加密固件包,结果发现每次升级都要花 10 多秒。后来改成 RSA 加密 AES 密钥,再用 AES 加密固件,速度提升了 100 倍。
4.2.2 ECC 算法
ECC(椭圆曲线密码学)是 RSA 的替代方案。同样的安全强度下,ECC 的密钥长度更短。比如,256 位的 ECC 相当于 3072 位的 RSA。
为什么会这样?因为 ECC 基于椭圆曲线离散对数问题,破解难度比大整数分解高得多。在加密狗这种资源受限的环境里,ECC 简直是天选之子。
| 安全等级 | RSA 密钥长度 | ECC 密钥长度 | 性能对比 |
|---|---|---|---|
| 80 位 | 1024 位 | 160 位 | ECC 快 3-5 倍 |
| 128 位 | 3072 位 | 256 位 | ECC 快 10 倍以上 |
| 256 位 | 15360 位 | 512 位 | ECC 优势巨大 |
建议:在加密狗里,我推荐使用 ECC 的 secp256r1 曲线(也叫 P-256)。这是 NIST 标准曲线,硬件支持广泛,而且安全可靠。
4.3 哈希算法:SHA-256
哈希算法,说白了就是给数据算个指纹。不管数据多大,算出来的哈希值长度固定。而且,哪怕只改一个比特,哈希值都会天翻地覆。
4.3.1 SHA-256 的特性
- 单向性:从哈希值反推原始数据,理论上不可能。我见过有人想暴力破解 SHA-256,结果算了几个月都没结果。
- 抗碰撞性:找到两个不同数据有相同哈希值,几乎不可能。SHA-256 的碰撞概率是 2^-128,比中彩票还难。
- 固定输出:不管输入是 1 字节还是 1GB,输出都是 256 位(32 字节)。
4.3.2 在加密狗中的应用
哈希算法在加密狗里主要有三个用途:
- 固件完整性校验:计算固件的 SHA-256 值,和预存的值比对。如果对不上,说明固件被篡改了。
- 密码存储:不要存明文密码,存密码的哈希值。用户登录时,计算输入密码的哈希值,和存储的比对。
- 数字签名:先对数据算哈希,再用私钥签名哈希值。这样效率高,而且安全。
// SHA-256 计算示例(伪代码)
uint8_t data[] = "Firmware Version 1.2.3";
uint8_t hash[32];
sha256_calculate(data, sizeof(data), hash);
// 输出哈希值
for (int i = 0; i < 32; i++) {
printf("%02x", hash[i]);
}
注意:不要用 MD5 或 SHA-1!这两个算法已经被证明有碰撞攻击。我见过一个老项目还在用 MD5 做固件校验,结果被攻击者伪造了固件。现在最低标准就是 SHA-256。
4.4 三种算法的协同工作
在实际的加密狗方案里,这三种算法不是孤立使用的。我习惯这样搭配:
- 密钥交换:用 ECC 或 RSA 协商出一个临时 AES 密钥。
- 数据加密:用 AES-GCM 加密实际数据,同时提供认证。
- 完整性校验:用 SHA-256 计算数据的哈希值,确保没被篡改。
- 数字签名:用 ECC 对哈希值签名,证明数据来源可信。
总结一下:对称加密管速度,非对称加密管密钥分发,哈希算法管完整性。三者结合,才能构建一个完整的嵌入式安全方案。嗯,这里要注意,算法选型时一定要考虑 MCU 的硬件加速能力,否则性能会很难看。
最后说一句:加密算法只是安全的一部分。密钥管理、随机数生成、侧信道防护,这些同样重要。我见过太多项目算法选对了,但密钥直接明文存储,结果功亏一篑。记住,安全是一个系统工程。