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 核心区别:一张图看懂

下面这张图总结了对称加密和非对称加密的核心区别。我建议你把它存下来,面试、写方案、做设计时都能用上。

对称加密 vs 非对称加密 核心对比 对称加密 密钥:同一个密钥 速度:快(硬件加速可达 Gbps) 密钥分发:困难(需要安全通道) 典型算法:AES, SM4, ChaCha20 主要用途:批量数据加密 非对称加密 密钥:公钥 + 私钥(一对) 速度:慢(比对称加密慢 100-1000 倍) 密钥分发:容易(公钥可公开) 典型算法:RSA, ECDSA, SM2 主要用途:密钥交换、数字签名 实际工程中的混合方案 用非对称加密安全传输对称密钥 → 再用对称加密加密批量数据 例如:TLS 握手阶段用 ECDHE 协商密钥,之后用 AES-GCM 加密数据 对比维度 对称加密 非对称加密 密钥数量 1 个 2 个(公钥 + 私钥) 安全性基础 密钥保密性 数学难题(因式分解/离散对数) 典型应用 磁盘加密、VPN、WiFi 数字签名、证书、密钥交换

1.4 工程中的选择策略

好了,理论讲完了。咱们聊聊实际工程里怎么选。我总结了几条经验,供你参考:

  1. 批量数据加密,用对称加密。比如固件镜像、日志文件、传感器数据流。AES-128-GCM 是我的首选,速度快,还带认证。
  2. 密钥分发和身份认证,用非对称加密。比如安全启动时的签名验证、TLS 握手、固件更新包的签名。
  3. 混合使用,取长补短。最常见的模式是:用非对称加密(如 ECDH)协商一个临时对称密钥,然后用这个密钥加密后续所有通信。TLS 就是这么干的。
  4. 考虑硬件加速。很多 MCU 和 SoC 内置了 AES 和 RSA/ECC 硬件加速模块。我在 STM32H7 上做过测试,硬件 AES 比软件实现快 50 倍以上。所以选型时,看看芯片的 TRM(技术参考手册),确认有没有密码学加速单元。

避坑指南:我曾经在一个项目里看到有人用 RSA 加密整个固件镜像(几十 MB)。结果呢?加密花了 3 分钟,解密花了 5 分钟,用户直接投诉升级太慢。正确的做法是:用 RSA 加密一个 256 位的 AES 密钥,然后用 AES 加密固件镜像。这样 RSA 只处理 32 字节,AES 处理大数据,又快又安全。

1.5 小结

这一章我们聊了对称加密和非对称加密的核心概念、历史沿革和工程选择。记住几个关键点:

  • 对称加密:快,但密钥分发难。适合批量数据加密。
  • 非对称加密:慢,但密钥管理方便。适合签名和密钥交换。
  • 实际工程中,两者配合使用才是王道。
  • 选算法时,优先考虑硬件支持和合规要求。