2. 密码学基础回顾:对称加密、非对称加密与哈希函数
各位同学,咱们今天聊点实在的。密码学这东西,听起来高大上,其实核心就那么几块砖。我做了这么多年嵌入式安全,说白了,大部分时间就是在跟这三样东西打交道:AES、RSA/ECC、还有SHA。你想想看,一个受限设备上跑密码套件,选来选去,底子不就是这些算法吗?
我个人习惯,在讲具体选型之前,先把这些基础原理捋一遍。不是为了掉书袋,而是为了后面讲“为什么这个芯片上不能用 RSA 2048”或者“为什么 ECC 在 Cortex-M0 上反而更慢”的时候,你能立刻反应过来。
2.1 对称加密:AES 的核心原理
对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。在嵌入式世界里,AES 是绝对的主角。DES 太老,RC4 有漏洞,SM4 在国内用得多但国际生态弱。所以咱们重点看 AES。
AES 的核心参数:
- 分组大小:固定 128 位(16 字节)。不管你数据多大,都得切成 16 字节一块来处理。
- 密钥长度:128、192、256 位。我建议在受限设备上至少用 AES-128,能上 256 更好。
- 轮数:10 轮(128 位密钥)、12 轮(192 位)、14 轮(256 位)。
AES 的运算过程,你可以想象成一个“混淆-扩散”的循环。每一轮做四件事:SubBytes(字节代换)、ShiftRows(行移位)、MixColumns(列混合)、AddRoundKey(轮密钥加)。最后一轮少一个 MixColumns。
嗯,这里要注意:AES 本身只是一个分组密码,它只定义了怎么加密一个 16 字节的块。实际应用中,你得选一个工作模式。我在项目中遇到过有人直接拿 ECB 模式加密固件,结果密文里还能看出图片轮廓……那叫一个尴尬。
| 模式 | 特点 | 嵌入式适用性 |
|---|---|---|
| ECB | 简单,但相同明文块产生相同密文块 | ❌ 不推荐,有信息泄露风险 |
| CBC | 需要 IV,加密串行,解密可并行 | ✅ 常用,但注意 IV 管理 |
| CTR | 将 AES 变成流密码,可并行 | ✅ 非常适合受限设备,省内存 |
| GCM | 认证加密模式,同时提供完整性 | ✅ 推荐,但需要硬件加速 |
我的经验:在资源紧张的 MCU 上,如果硬件没有 AES 加速器,CTR 模式往往比 CBC 快,因为它可以预计算密钥流。我曾经在一个 STM32F0 项目上,用 CTR 模式把加密吞吐量提升了将近 40%。
2.2 非对称加密:RSA 与 ECC
非对称加密,就是公钥和私钥成对出现。公钥给别人,私钥自己藏好。这东西计算量比对称加密大得多,但在密钥分发和数字签名场景下,它是不可替代的。
2.2.1 RSA:大整数分解的数学游戏
RSA 的安全性基于大整数分解的困难性。简单说:给你两个大素数 p 和 q,乘起来得到 n 很容易;但给你 n,让你反推出 p 和 q,难。
RSA 的密钥长度通常用 n 的位数表示。1024 位已经不安全了,现在最低要求是 2048 位。但在受限设备上,2048 位的 RSA 签名验证一次可能要几百毫秒甚至几秒。
避坑指南:我曾经在一个项目里,用了一颗主频 48MHz 的 Cortex-M3 芯片做 RSA 2048 签名。结果呢?一次签名花了 3.2 秒。产品经理当场脸就绿了。后来我们换成了 ECC,签名时间降到了 200 毫秒以内。
2.2.2 ECC:椭圆曲线上的高效替代
ECC 的安全性基于椭圆曲线离散对数问题。同样的安全强度下,ECC 的密钥长度比 RSA 短得多。比如:
- RSA 2048 ≈ ECC 224-256(安全强度相当)
- RSA 3072 ≈ ECC 256-384
这意味着什么?意味着 ECC 的密钥更小、签名更短、计算更快。在受限设备上,这简直是天大的优势。
常用的曲线有:secp256r1(NIST P-256)、secp384r1、Curve25519(X25519)。我个人比较喜欢 Curve25519,因为它设计上就考虑了侧信道攻击的防护,实现起来不容易踩坑。
| 算法 | 密钥长度(位) | 安全强度(位) | 签名大小(字节) | 嵌入式适用性 |
|---|---|---|---|---|
| RSA-2048 | 2048 | 112 | 256 | ❌ 慢,密钥大 |
| RSA-3072 | 3072 | 128 | 384 | ❌ 更慢 |
| ECC P-256 | 256 | 128 | 64 | ✅ 推荐 |
| ECC Curve25519 | 256 | 128 | 64 | ✅ 强烈推荐 |
2.3 哈希函数:SHA-2 与 SHA-3
哈希函数,就是把任意长度的数据,压缩成一个固定长度的“指纹”。这个指纹是唯一的(理论上),而且不可逆。你没法从哈希值反推出原始数据。
在嵌入式领域,哈希函数主要用在:固件完整性校验、数字签名、消息认证码(HMAC)、密钥派生。
2.3.1 SHA-2:当前的事实标准
SHA-2 家族包括 SHA-224、SHA-256、SHA-384、SHA-512。其中 SHA-256 是使用最广泛的。它的输出是 256 位(32 字节),安全强度 128 位。
SHA-2 的结构是 Merkle-Damgård 架构。简单说:把消息分成块,每块 512 位(SHA-256)或 1024 位(SHA-512),然后一块一块地迭代压缩。
SHA-256 的核心参数:
- 消息块大小:512 位(64 字节)
- 输出长度:256 位(32 字节)
- 安全强度:128 位(抗碰撞)
- 内部状态:8 个 32 位寄存器
SHA-2 在大多数 MCU 上都有硬件加速器。如果没有,纯软件实现也不算太慢。我记得在一个 72MHz 的 STM32F103 上,纯软件 SHA-256 大概能跑到 2-3 MB/s,够用。
2.3.2 SHA-3:新一代的备选
SHA-3 是 NIST 在 2015 年发布的,跟 SHA-2 没有继承关系。它的核心是 Keccak 海绵结构。跟 SHA-2 的 Merkle-Damgård 完全不同。
海绵结构的好处是:灵活。你可以根据需要调整输出长度。SHA-3 家族包括 SHA3-224、SHA3-256、SHA3-384、SHA3-512,还有两个可扩展输出函数 SHAKE128 和 SHAKE256。
但在受限设备上,SHA-3 目前还没有 SHA-2 普及。硬件加速器也少。我个人建议:除非你有特殊需求(比如抗量子攻击的预备),否则优先用 SHA-256。
我的建议:在选哈希函数时,先看看你的 MCU 有没有硬件加速。如果有 SHA-256 加速,那就用它。如果没有,SHA-256 的软件实现也够用。SHA-3 可以先放一放,等生态成熟了再说。
2.4 知识体系总览
下面这张图,把咱们刚才讲的核心内容串起来了。你保存好,后面选密码套件的时候,随时回来对照。
2.5 小结:选型前的心理准备
好了,基础回顾就到这里。你可能会问:讲了这么多,到底怎么选?别急,后面几章会一个一个场景拆开讲。
但有一点我现在就可以告诉你:没有银弹。AES 快但不解决密钥分发问题,RSA 能签名但慢得要命,ECC 又快又小但曲线实现容易出 bug。你得根据你的设备算力、内存、功耗、安全等级,综合权衡。
我个人习惯,在开始选型之前,先列一张表:
- 设备主频多少?(有没有硬件加速器?)
- RAM 和 Flash 剩多少?(能不能放下算法库?)
- 安全等级要求多高?(消费级?工业级?还是军规?)
- 通信协议有没有强制要求?(比如 TLS 1.3 必须支持哪些套件?)
把这四个问题想清楚,再回头看 AES、RSA、ECC、SHA,你就知道该选谁了。