1. 密码学基础:对称加密与非对称加密
各位同学好,我是老周。今天咱们开始第一讲——对称加密与非对称加密。这两个概念是整个密码学的基石,也是后面安全启动、固件签名、信任链这些东西的根。你如果把这部分吃透了,后面三十章都会顺很多。
我先说个我自己的经历。刚入行那会儿,我给一个物联网设备做固件升级方案。当时图省事,直接用了一个固定的 AES 密钥,写死在代码里。结果呢?产品上市三个月,被人用逻辑分析仪把 SPI Flash 里的固件 dump 出来,密钥直接暴露。那次教训让我明白——密码学不是拼算法,是拼密钥管理。对称加密快,但密钥怎么安全地给到对方?非对称加密能解决密钥分发,但慢得让人抓狂。所以实际工程里,两者往往是搭配着用的。
1.1 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一个密钥。你想想看,就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。这个模型简单、高效,硬件实现也快。
核心公式:
- 加密:
C = E(K, P)—— 用密钥 K 加密明文 P,得到密文 C - 解密:
P = D(K, C)—— 用同一个密钥 K 解密密文 C,恢复明文 P
1.1.1 历史沿革
对称加密的历史其实非常久远。古罗马的凯撒密码,就是最早的对称加密——把字母往后挪三位,解密再挪回来。当然,那玩意儿现在连玩具都算不上。
现代对称加密的里程碑是 1977 年发布的 DES(数据加密标准)。DES 用 56 位密钥,在当年算是固若金汤。但随着计算机性能提升,1999 年,EFF 用一台 25 万美元的专用机器,22 小时就暴力破解了一个 DES 密钥。嗯,这里要注意——56 位密钥在今天已经不安全了。
后来有了 3DES(三重 DES),本质上是把 DES 跑三遍,密钥长度变成 112 位或 168 位。但效率太低,逐渐被淘汰。2001 年,NIST 正式发布了 AES(高级加密标准),密钥长度支持 128、192、256 位。到今天,AES-128 仍然是嵌入式安全领域的黄金标准。
1.1.2 常见算法与参数
| 算法 | 密钥长度 | 分组大小 | 状态 | 典型场景 |
|---|---|---|---|---|
| DES | 56 位 | 64 位 | 已废弃 | 历史遗留系统 |
| 3DES | 112/168 位 | 64 位 | 逐步淘汰 | 旧金融终端 |
| AES | 128/192/256 位 | 128 位 | 推荐使用 | 嵌入式、TLS、磁盘加密 |
| SM4 | 128 位 | 128 位 | 国标 | 国内商用密码 |
我的建议:新项目直接上 AES-128 或 AES-256。别碰 DES,别碰 3DES。如果你做国内项目,SM4 也是合规选择。我在一个车规级 MCU 项目里用过 SM4 硬件加速模块,性能跟 AES 差不多,但合规审查省了很多事。
1.1.3 工作模式
对称加密还有一个坑——工作模式。AES 本身只加密 128 位数据块,但你的数据可能比这长得多。怎么处理?这就引出了工作模式。
- ECB(电子密码本):每个块独立加密。简单,但不安全。同样的明文块会得到同样的密文块,容易泄露模式信息。我曾经在客户的固件镜像里看到 ECB 加密的 logo 图片,解密后还能隐约看出轮廓——这就是 ECB 的典型问题。
- CBC(密码分组链接):每个块加密前先跟上一个密文块异或。需要初始化向量(IV)。安全性好,但不能并行加密。
- CTR(计数器模式):把计数器加密后跟明文异或。可以并行,支持随机访问。我比较喜欢这个模式,尤其是在流式加密场景里。
- GCM(伽罗瓦/计数器模式):CTR 模式加上认证标签,同时提供加密和完整性校验。这是目前最推荐的模式。
避坑指南:我曾经在一个 IoT 项目里看到有人用 ECB 模式加密传感器数据。结果攻击者通过观察密文重复模式,直接推断出了传感器的采样周期和触发事件。记住——ECB 永远不要用在生产环境。如果你需要认证加密,直接上 GCM。
1.2 非对称加密:公钥锁、私钥开
对称加密有个致命问题——密钥分发。你想想看,如果两个人要通信,得先商量好同一个密钥。但商量密钥的通道本身可能是不安全的。这就成了先有鸡还是先有蛋的问题。
非对称加密解决了这个问题。它用一对密钥:公钥可以公开给任何人,私钥只有自己知道。公钥加密的数据,只有私钥能解开;反过来,私钥签名的数据,公钥可以验证。
核心公式:
- 加密:
C = E(PK, P)—— 用公钥 PK 加密明文 P - 解密:
P = D(SK, C)—— 用私钥 SK 解密密文 C - 签名:
S = Sign(SK, M)—— 用私钥 SK 对消息 M 签名 - 验签:
Verify(PK, M, S)—— 用公钥 PK 验证签名 S
1.2.1 历史沿革
非对称加密的概念是 1976 年由 Diffie 和 Hellman 提出的。他们发表了一篇划时代的论文——《密码学的新方向》。但当时他们只有密钥交换的方案,没有完整的加密算法。
1977 年,Rivest、Shamir 和 Adleman 提出了 RSA 算法,以三人的姓氏首字母命名。RSA 基于大整数分解的数学难题——两个大素数相乘容易,但从乘积反推因子极难。这个算法至今仍被广泛使用。
1985 年,ElGamal 算法提出,基于离散对数难题。同年,Miller 和 Koblitz 各自独立提出了椭圆曲线密码学(ECC),用更短的密钥达到同等安全强度。举个例子:RSA-2048 的安全强度,ECC 用 256 位密钥就能达到。这对嵌入式设备来说,简直是福音。
1.2.2 常见算法对比
| 算法 | 数学难题 | 密钥长度(等效 AES-128) | 性能 | 典型场景 |
|---|---|---|---|---|
| RSA | 大整数分解 | 3072 位 | 慢(尤其私钥操作) | 数字签名、密钥传输 |
| ECC(ECDSA/ECDH) | 椭圆曲线离散对数 | 256 位 | 快 | 嵌入式、TLS、安全启动 |
| SM2 | 椭圆曲线离散对数 | 256 位 | 快 | 国内商用密码 |
| DSA | 离散对数 | 3072 位 | 中等 | 历史遗留 |
我的建议:嵌入式安全启动场景,优先选 ECC(P-256 或 P-384)。RSA 的私钥操作太慢,在资源受限的 MCU 上,一次 RSA-2048 签名可能要几百毫秒。而 ECDSA 签名通常在几十毫秒以内。如果你做国内项目,SM2 是合规且高效的选择。
1.3 核心区别:一张图看懂
下面这张图总结了对称加密和非对称加密的核心区别。我建议你把它存下来,面试、写方案、做设计时都能用上。
1.4 工程中的选择策略
好了,理论讲完了。咱们聊聊实际工程里怎么选。我总结了几条经验,供你参考:
- 批量数据加密,用对称加密。比如固件镜像、日志文件、传感器数据流。AES-128-GCM 是我的首选,速度快,还带认证。
- 密钥分发和身份认证,用非对称加密。比如安全启动时的签名验证、TLS 握手、固件更新包的签名。
- 混合使用,取长补短。最常见的模式是:用非对称加密(如 ECDH)协商一个临时对称密钥,然后用这个密钥加密后续所有通信。TLS 就是这么干的。
- 考虑硬件加速。很多 MCU 和 SoC 内置了 AES 和 RSA/ECC 硬件加速模块。我在 STM32H7 上做过测试,硬件 AES 比软件实现快 50 倍以上。所以选型时,看看芯片的 TRM(技术参考手册),确认有没有密码学加速单元。
避坑指南:我曾经在一个项目里看到有人用 RSA 加密整个固件镜像(几十 MB)。结果呢?加密花了 3 分钟,解密花了 5 分钟,用户直接投诉升级太慢。正确的做法是:用 RSA 加密一个 256 位的 AES 密钥,然后用 AES 加密固件镜像。这样 RSA 只处理 32 字节,AES 处理大数据,又快又安全。
1.5 小结
这一章我们聊了对称加密和非对称加密的核心概念、历史沿革和工程选择。记住几个关键点:
- 对称加密:快,但密钥分发难。适合批量数据加密。
- 非对称加密:慢,但密钥管理方便。适合签名和密钥交换。
- 实际工程中,两者配合使用才是王道。
- 选算法时,优先考虑硬件支持和合规要求。