嵌入式TLS加密套件选择与安全强度分析与加固 - 第2节
对称加密算法:AES、ChaCha20、SM4 的原理与对比
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你用一把锁锁上箱子,再用同一把钥匙打开它。这是密码学里最基础、也最核心的部分。今天咱们聊聊三个主流选手:AES、ChaCha20 和 SM4。
AES:全球通用的老大哥
AES 是目前使用最广泛的对称加密算法。我最早接触它是在做嵌入式设备时,那时候芯片资源紧张,但 AES 的硬件加速已经非常成熟了。
AES 的核心是 SPN 结构(Substitution-Permutation Network)。它把数据分成 128 位一块,然后通过多轮操作来混淆和扩散数据。具体来说:
- 字节代换(SubBytes):用一个 S 盒把每个字节替换成另一个字节。这是非线性操作,抵抗线性密码分析的关键。
- 行移位(ShiftRows):把状态矩阵的行按不同偏移量循环左移。让列之间产生关联。
- 列混合(MixColumns):对每一列做矩阵乘法。扩散效果就在这里产生。
- 轮密钥加(AddRoundKey):把当前状态和轮密钥做异或。
密钥长度决定了轮数:
| 密钥长度 | 轮数 | 安全强度 |
|---|---|---|
| 128 位 | 10 轮 | 足够商用,量子攻击下约 2^64 |
| 192 位 | 12 轮 | 更高安全余量 |
| 256 位 | 14 轮 | 顶级安全,抗量子约 2^128 |
ChaCha20:流密码的新贵
ChaCha20 是 Daniel Bernstein 设计的流密码。它和 AES 走的是完全不同的路子。AES 是分组密码,ChaCha20 是流密码——说白了,它生成一个密钥流,然后和明文做异或。
ChaCha20 的核心是 ARX 结构:Add(加法)、Rotate(循环移位)、XOR(异或)。没有 S 盒,没有查表操作。这意味着:
- 软件实现极快,尤其是在没有 AES 硬件加速的 CPU 上。
- 没有查表,天然抵抗缓存时间侧信道攻击。
- 实现简单,不容易出错。
ChaCha20 的初始状态是一个 4×4 的矩阵,包含 128 位常量、256 位密钥、32 位计数器和 96 位 nonce。每轮做 8 次 quarter round,总共 20 轮(所以叫 ChaCha20)。
关键区别: AES 靠硬件加速吃饭,ChaCha20 靠软件优化吃饭。在移动设备上,ChaCha20 往往比 AES-128 还快。我记得有一次在 ARM Cortex-M4 上做测试,ChaCha20 的吞吐量是 AES-128 的 1.8 倍。
SM4:中国的国家标准
SM4 是中国国家密码管理局发布的商用密码算法。它的结构和 AES 类似,也是分组密码,分组长度 128 位,密钥长度 128 位,32 轮迭代。
但 SM4 有自己的特点:
- Feistel 结构:和 AES 的 SPN 不同,SM4 用的是 Feistel 网络。每轮只处理一半数据,另一半直接传递。
- S 盒设计:SM4 的 S 盒是 8×8 的,但设计原理和 AES 不同,更侧重硬件实现效率。
- 密钥扩展:SM4 的密钥扩展算法和加密算法结构相同,都是 32 轮。
说实话,SM4 在性能上不如 AES 和 ChaCha20。但它是国标,在中国政府、金融、电力等行业是强制要求。我曾经帮一家银行做合规改造,把 AES 替换成 SM4,性能下降了大约 30%,但合规性通过了。
分组模式:GCM、CCM、Poly1305
算法本身只解决加密问题,但实际应用中我们还需要认证——确保数据没有被篡改。这就是分组模式要做的事。
GCM:Galois/Counter Mode
GCM 是目前最流行的认证加密模式。它把 CTR 模式加密和 GHASH 认证结合起来。
- 加密:用 CTR 模式生成密钥流,和明文异或得到密文。
- 认证:用 GHASH(基于 Galois 域乘法)计算认证标签。
GCM 的优点:
- 可以并行计算,硬件实现效率极高。
- 支持 AAD(附加认证数据),比如 IP 头、端口号等不需要加密但需要认证的数据。
- 一次操作完成加密和认证,性能好。
但 GCM 有个坑:nonce 绝对不能重复。一旦 nonce 重复,攻击者可以恢复密钥流,进而破解所有使用相同密钥的密文。我曾经在审计一个项目时发现,他们用随机数生成 nonce,概率碰撞虽然低,但理论上存在风险。我建议他们改用计数器,从 0 开始递增,彻底避免碰撞。
CCM:Counter with CBC-MAC
CCM 是另一种认证加密模式,用 CTR 模式加密,用 CBC-MAC 做认证。
CCM 的特点:
- 加密和认证共用同一个密钥。
- 需要预先知道明文长度(因为 CBC-MAC 需要填充)。
- 不能并行计算,性能比 GCM 差。
CCM 在 Wi-Fi 的 WPA2 里用得很多。但说实话,除非你有兼容性要求,否则我建议优先选 GCM。CCM 的 nonce 管理更复杂,而且性能差一截。
Poly1305:和 ChaCha20 搭档的认证器
Poly1305 是一个一次性认证算法,通常和 ChaCha20 搭配使用(ChaCha20-Poly1305)。它基于多项式求值,在软件实现上非常快。
Poly1305 的工作方式:
- 把消息分成 16 字节的块。
- 每个块当作一个系数,在有限域上计算多项式值。
- 最后加上一个随机数,得到 128 位的认证标签。
ChaCha20-Poly1305 在 TLS 1.3 里是推荐的密码套件之一。我自己的经验是,在移动端和嵌入式设备上,ChaCha20-Poly1305 比 AES-128-GCM 快 20-40%,而且实现代码更短,不容易出 bug。
| 模式 | 加密算法 | 认证算法 | 并行性 | 性能(软件) | 典型场景 |
|---|---|---|---|---|---|
| GCM | CTR | GHASH | 高 | 高(有硬件加速) | TLS、IPsec、SSH |
| CCM | CTR | CBC-MAC | 低 | 中 | Wi-Fi WPA2、蓝牙 |
| Poly1305 | ChaCha20 | 多项式求值 | 中 | 高(无硬件加速) | TLS 1.3、移动端 |
密钥长度与安全强度
密钥长度直接决定暴力破解的难度。但这里有个常见的误解:不是说密钥长度翻倍,安全强度就翻倍。实际上,安全强度是 指数级 增长的。
- 128 位密钥:2^128 种可能。以目前最快的超级计算机(约 10^18 次/秒)来算,需要 10^19 年才能穷举完。宇宙年龄才 138 亿年。
- 256 位密钥:2^256 种可能。这个数字比宇宙中的原子总数还大。
但量子计算来了之后,情况变了。Grover 算法可以把对称加密的暴力破解复杂度从 O(2^n) 降到 O(2^(n/2))。也就是说:
- AES-128 在量子攻击下只有 2^64 安全强度。
- AES-256 还有 2^128 安全强度。
所以,如果你在规划一个 10 年以上的系统,我建议直接用 AES-256 或 ChaCha20-256。128 位在经典计算下足够,但量子计算一旦成熟,128 位就不够看了。
我的建议: 对于新系统,优先选择 AES-256-GCM 或 ChaCha20-Poly1305。前者适合有硬件加速的服务器和桌面,后者适合移动端和嵌入式。SM4 只在合规要求下使用,而且尽量配合 GCM 模式(SM4-GCM 已经有标准了)。
知识体系结构图
下面这张图展示了对称加密算法的核心知识体系,包括算法、模式和密钥长度的关系:
好了,对称加密这块就聊到这儿。记住三个核心点:算法选型看场景,模式选型看需求,密钥长度看未来。下一块咱们聊聊非对称加密,那又是另一番天地了。