密码学基础(上):对称加密与非对称加密、哈希函数与数字签名

各位同学,咱们今天聊点硬核的。密码学这东西,说白了就是安全启动的「地基」。你想想看,如果连加密都搞不明白,后面那些签名校验、固件验证根本没法谈。我做了这么多年嵌入式安全,见过太多因为密码学基础不牢导致翻车的项目。嗯,咱们今天就把这块啃透。

对称加密:一把钥匙开一把锁

对称加密,顾名思义,加密和解密用的是同一把密钥。就像你家的门锁,用同一把钥匙锁门和开门。我最早接触嵌入式安全时,第一个项目用的就是 AES-128,那时候觉得这玩意儿真简单,后来才发现坑也不少。

核心要点:对称加密速度快,适合大量数据加密。但密钥分发是个大问题——你怎么把密钥安全地交给对方?

常见的对称加密算法有这些:

算法 密钥长度 典型应用场景
AES 128 / 192 / 256 位 固件加密、存储加密
DES 56 位 已废弃,别用了
SM4 128 位 国密标准,国内项目常用
ChaCha20 256 位 嵌入式低功耗场景

我个人习惯在资源受限的 MCU 上用 AES-128,够用且性能好。但要注意,AES 有 ECB、CBC、CTR 等模式。ECB 模式千万别用——我见过有人把固件用 ECB 加密,结果密文里还能看出图片轮廓,那叫一个尴尬。

避坑指南:我曾经在一个 IoT 项目里看到同事直接用 ECB 模式加密传感器数据,结果攻击者通过统计密文块就能推断出传感器状态。记住:永远用 CBC 或 CTR 模式,并且 IV 必须随机。

非对称加密:公钥私钥两把锁

非对称加密就聪明多了。它有一对密钥:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,反过来私钥签名的数据可以用公钥验证。这解决了对称加密的密钥分发难题。

你想想看,如果设备出厂时烧录了服务器的公钥,那服务器用私钥签名的固件,设备就能验证真伪。这就是安全启动的核心逻辑之一。

特性 对称加密 非对称加密
密钥数量 1 个 2 个(公钥 + 私钥)
速度 快(硬件加速常见) 慢(比对称慢 1000 倍以上)
典型算法 AES, SM4 RSA, ECC, SM2
主要用途 数据加密 密钥交换、数字签名

实际项目中,我们通常混合使用:用非对称加密传递对称密钥,再用对称密钥加密实际数据。这叫「混合加密」,既安全又高效。

经验之谈:RSA 密钥长度至少 2048 位,ECC 推荐 256 位(P-256)。别为了省那点 Flash 空间用 1024 位 RSA,我见过有产品因此被破解,损失惨重。

哈希函数:数据的「指纹」

哈希函数能把任意长度的数据,压缩成固定长度的摘要。而且它有个特性:输入稍微改一点,输出就面目全非。这就像给数据按个指纹,独一无二。

常见的哈希算法:

  • MD5:128 位,已破解,别用
  • SHA-1:160 位,已发现碰撞攻击,别用
  • SHA-256:256 位,目前安全,推荐
  • SM3:256 位,国密标准

哈希函数在安全启动里干啥用?校验固件完整性。设备启动时计算固件的哈希值,跟出厂时记录的哈希值对比。对得上,说明固件没被篡改。

关键特性:哈希是单向的,从摘要反推原始数据在计算上不可行。所以哈希也叫「单向散列函数」。

数字签名:防伪 + 防篡改

数字签名 = 哈希 + 非对称加密。流程是这样的:

  1. 发送方对数据计算哈希值
  2. 用私钥加密这个哈希值,得到签名
  3. 接收方用公钥解密签名,得到哈希值 A
  4. 接收方自己计算数据的哈希值 B
  5. 对比 A 和 B,一致则签名有效

这就保证了两个事情:数据确实来自声称的发送方(防伪造),数据没有被篡改(防篡改)。

注意:签名 ≠ 加密。签名不隐藏数据内容,只保证真实性和完整性。我见过有人把签名当加密用,结果敏感数据明文传输,闹了大笑话。

知识体系总览

下面这张图把今天讲的内容串起来了。你仔细看看,对称加密、非对称加密、哈希、数字签名之间的关系一目了然。

密码学基础(上)知识体系 对称加密 AES / SM4 / ChaCha20 非对称加密 RSA / ECC / SM2 哈希函数 SHA-256 / SM3 混合加密 非对称传密钥 + 对称加密数据 数字签名 哈希 + 非对称加密 安全启动应用 固件签名验证 / 启动链信任传递 说明:安全启动链路中,数字签名用于固件验证,混合加密用于安全通信 哈希函数贯穿始终,用于完整性校验和签名生成

实战中的选择建议

说了这么多理论,咱们落地到实际项目。我一般这样选型:

  • 资源极度受限(几十 KB RAM):AES-128 + SHA-256,纯软件实现也能跑
  • 有硬件加速器:优先用硬件 AES 和 SHA,速度提升 10 倍以上
  • 需要国密合规:SM4 + SM3 + SM2,注意 SM2 签名性能比 RSA 好很多
  • 安全启动场景:RSA-2048 或 ECC P-256 签名,SHA-256 做哈希

一个小技巧:我习惯在开发阶段用 OpenSSL 命令行生成测试密钥和签名,验证流程通了再移植到嵌入式平台。这样能省不少调试时间。

好了,密码学基础的上半部分就到这儿。对称加密、非对称加密、哈希、数字签名,这四个概念是安全启动的四大支柱。你把这四个搞明白了,后面讲签名链、信任根、固件升级验证的时候,就会觉得顺理成章。