📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
非对称(PKC)与对称(SBK)加密算法全指南
在现代计算系统(尤其是嵌入式设备、移动设备、安全启动场景)中,加密算法的核心作用可以总结为两类:
① 真实性与完整性 —— 通过非对称密码(PKC)实现签名与验证
② 机密性 —— 通过对称加密(SBK)保护数据不被读取
这两类算法不是竞争关系,而是互补关系。很多系统(包括 NVIDIA Jetson、Android Verified Boot、Linux 内核模块签名、TLS 协议等)都同时使用 PKC + 对称密钥来实现完整的安全体系。
本文将用系统化、逻辑清晰的方式,从算法本质讲起,再通过示例、流程图、表格等方式解释它们的用途与差异,帮助你从根本上掌握两类加密算法的核心价值。

1. 密码学的两大支柱:PKC 与对称加密
几乎所有现代加密系统,都可以用一个极简的逻辑图表示:
┌─────────────────────────┐
│ 非对称密码(PKC) │
│ Signature Sign/Verify │
│ 用于验证“是否被篡改?” │
└─────────────────────────┘
│
▼
┌─────────────────────────┐
│ 对称加密(SBK) │
│ Encryption/Decryption │
│ 用于保护“是否会被读到?”│
└─────────────────────────┘
- PKC 解决 完整性 & 身份真实性(数据没有被改、来自可信方)。
- SBK 解决 机密性(数据不能被别人看到)。
两类算法分别解决不同的安全目标,因此在 Secure Boot、磁盘加密、通信安全中一起出现十分正常。
2. 非对称密码(PKC)
PKC = Public Key Cryptography,即“公钥密码学”。它最大的特点是:
两把不同的钥匙:公钥 & 私钥
一个负责签名(或解密),另一个负责验证(或加密)。
以下是最常见 PKC 算法:
| 算法 | 类型 | 特点 | 典型用途 |
|---|---|---|---|
| RSA | 非对称 | 成熟稳定、密钥大、速度较慢 | 数字签名、密钥交换、证书体系 |
| ECDSA | 非对称(椭圆曲线) | 密钥短、速度快、非常适合嵌入式设备 | Secure Boot、内核模块签名 |
| Ed25519 | 新型椭圆曲线 | 高速、高安全性、实现简单 | 应用签名、SSH |
在 Secure Boot 体系中(例如 Jetson、Android Verified Boot、UEFI Secure Boot):
PKC 负责“签名 → 验证”,确保执行的镜像一定来自可信方。
2.1 PKC 的核心能力:数字签名
数字签名回答的问题只有一个:
“这份数据有没有被篡改?是不是真的是某人发的?”
数字签名不是“加密”,因为签名后的数据一般仍然可以被任何人读取,它的作用是:
- 确保数据的 完整性(内容没有被修改)
- 确保数据的 来源可信(确实是某个私钥持有者签的)
接下来用一个具体示例讲解整个流程。
2.1.1 PKC 签名验证流程(示例)
假设你要给一个镜像 bootloader.bin 签名。
流程图(简化版)
私钥持有者(厂家) 公钥持有者(设备)
──────────────────────────────────────────────────────
│ │
│ 1. 对镜像做哈希(SHA256) │
│ hash = SHA256(image) │
│ │
│ 2. 使用私钥对 hash 做签名 │
│ signature = Sign(hash, PrivateKey) │
│ │
├── 将 image + signature 发送给设备 ────────▶│
│
│ 3. 设备计算同样的 hash
│ hash2 = SHA256(received_image)
│
│ 4. 使用公钥验证签名
│ Verify(signature, hash2, PublicKey)
│
│ 如果验证成功 → 镜像可信
│ 如果失败 → 镜像被篡改 or 来源不可信
示例(伪代码)
# 厂家端(用于签名)
image = load("bootloader.bin")
h = sha256(image)
signature = sign_with_private_key(h, privkey)
bundle = image + signature
# 设备端(用于验证)
image, signature = extract(bundle)
h1 = sha256(image)
t = verify_with_public_key(signature, h1, pubkey)
if t:
print("OK: image is trusted")
else:
print("ERROR: tampered or invalid signature")
至此你可以看到:
PKC 并不加密镜像内容,它只是保证镜像没有被篡改且来源可信。
2.2 PKC 典型应用
| 场景 | 为什么必须使用 PKC? |
|---|---|
| Secure Boot | 必须保证 bootloader 未被篡改,否则攻击者可替换恶意镜像 |
| OTA 升级包签名 | 防止中间人攻击替换升级包 |
| Linux 内核模块签名 | 防止加载恶意模块 |
| TLS、HTTPS | 验证服务器身份 |
| 软件分发(APK、deb、rpm) | 确保软件包来自官方 |
一句话总结:
PKC 负责“不允许别人改”。
3. 对称加密(SBK)
对称加密(Symmetric Encryption)指的是 同一把密钥用于加密/解密:
加密:ciphertext = Encrypt(plaintext, Key)
解密:plaintext = Decrypt(ciphertext, Key)
你可以看到,对称加密不像 PKC 那样使用两把钥匙,而是:
一把密钥决定一切。泄露 = 全盘泄露。
在嵌入式系统中,常见对称算法包括:
| 算法 | 类型 | 用途 |
|---|---|---|
| AES-128/256 | 分组加密 | 最常用的块加密算法,广泛用于 SBK |
| ChaCha20 | 流加密 | 移动设备、TLS 中常用 |
| GCM 模式 | AEAD 加密 | 同时保证加密与完整性 |
3.1 SBK 的安全目标
SBK 解决的问题与 PKC 完全不同,它回答的是:
“别人能不能看到内容?”
对称加密的核心价值:
- 保护机密性(Confidentiality)
- 防止逆向工程与敏感数据泄露
- 阻止固件被攻击者直接分析
在安全启动体系中:
SBK 负责对镜像进行加密,防止攻击者读取其中的内容(如关键算法、AI 模型、商业逻辑)。
3.2 SBK 对称加密流程(示例)
假设有一个关键二进制文件:
initrd.img
厂家使用 SBK 对其加密:
cipher = AES_Encrypt(initrd_img, SBK)
设备启动时,BootROM 或 Bootloader 持有同一把密钥 SBK,可以解密:
initrd = AES_Decrypt(cipher, SBK)
流程图
厂家端 设备端
────────────────────────────────────────────────────────────
│ │
│ plaintext = initrd.img │
│ │
│ 1. 使用 SBK 加密 │
│ ciphertext = AES128(plaintext, SBK) │
│ │
├── 将 ciphertext 烧录到设备 ─────────────▶│
│
│ 2. 设备读取密文
│ plaintext = AES128_Decrypt(ciphertext, SBK)
│
│ plaintext 才能被执行
3.3 示例(伪代码)
# 加密
from Crypto.Cipher import AES
cipher = AES.new(SBK, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(data))
# 解密
cipher = AES.new(SBK, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(encrypted))
SBK 非常简单,但安全性高度依赖:
- 密钥是否泄露?
- 密钥是否存放在硬件安全区域?(如 eFuse、TrustZone、TEE)
- 是否使用安全的模式(如 GCM 而不是 ECB)
一句话总结:
SBK 负责“不允许别人看”。
4. PKC vs SBK:对比总结
| 项目 | PKC(非对称) | SBK(对称) |
|---|---|---|
| 目标 | 完整性、身份认证 | 机密性 |
| 密钥数量 | 一对公钥/私钥 | 一把密钥 |
| 密钥泄露影响 | 私钥泄露非常严重;公钥泄露无影响 | 密钥泄露 = 全部内容可被解密 |
| 速度 | 较慢 | 很快(适合大文件) |
| 常见用途 | Secure Boot、签名、证书 | 固件加密、数据保护 |
| 是否可逆 | 签名不可逆,验证可行 | 加密可逆(解密) |
一个系统中通常两者同时出现:
PKC 确保镜像不能被改
SBK 确保镜像不能被读
5. PKC + SBK 在实际系统中的组合应用
以 Secure Boot 为例,一个完整的启动过程通常包含两个步骤:
① 使用 PKC 验证是否被篡改
- Bootloader 是否来自厂家
- Kernel 是否来自厂家
- Rootfs 是否来自厂家
攻击者无法修改内容,否则签名验证失败。
② 使用 SBK 加密关键镜像(可选)
- 防止攻击者 dump 出 AI 模型
- 防止分析 bootloader 内部逻辑
- 防止商业逻辑泄露
攻击者即使得到固件,也无法解密。
6. 实战视角:如何选择 PKC 或 SBK?
| 场景 | 使用 PKC? | 使用 SBK? | 原因 |
|---|---|---|---|
| Secure Boot | ✔ 必须 | 可选 | 必须验证完整性 |
| OTA 升级包 | ✔ 必须 | 可选 | 必须防篡改 |
| AI 模型保护 | 可选 | ✔ 强烈推荐 | 防止被复制 |
| 商业逻辑/算法保护 | 可选 | ✔ 强烈推荐 | 防止逆向工程 |
| 文件系统保护 | 可选 | ✔ | 防止数据泄露 |
一句话总结:
- PKC:不让别人改
- SBK:不让别人看
7. 整体总结(一页 PPT 可用)
┌────────────────────┐
│ 非对称密码 (PKC) │
│ - 公钥/私钥 │
│ - 签名验证 │
│ - 防篡改、防伪造 │
└────────────────────┘
│
▼
┌────────────────────┐
│ 对称加密 (SBK) │
│ - 单一密钥 │
│ - 加密/解密 │
│ - 防读取、防逆向 │
└────────────────────┘
PKC 用于验证完整性(是否被改)
SBK 用于保护机密性(是否被读)
8. 结束语
非对称加密与对称加密并不是替代关系,而是构成现代安全体系的基础组合:
- PKC 提供信任根(Root of Trust)
- SBK 保护数据机密性
- 二者结合构成现代系统安全链
理解它们的本质,你就能理解 Secure Boot、TLS、磁盘加密、应用签名等所有现代安全机制背后的逻辑。
📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
PKC与对称加密算法解析
32

被折叠的 条评论
为什么被折叠?



