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 在加密狗中的应用

哈希算法在加密狗里主要有三个用途:

  1. 固件完整性校验:计算固件的 SHA-256 值,和预存的值比对。如果对不上,说明固件被篡改了。
  2. 密码存储:不要存明文密码,存密码的哈希值。用户登录时,计算输入密码的哈希值,和存储的比对。
  3. 数字签名:先对数据算哈希,再用私钥签名哈希值。这样效率高,而且安全。
// 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 的硬件加速能力,否则性能会很难看。

最后说一句:加密算法只是安全的一部分。密钥管理、随机数生成、侧信道防护,这些同样重要。我见过太多项目算法选对了,但密钥直接明文存储,结果功亏一篑。记住,安全是一个系统工程。