嵌入式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
我的经验: 在大多数场景下,AES-256 是安全的选择。但如果你做的是 IoT 设备,128 位其实也够用,毕竟性能开销更小。我曾经在一个智能门锁项目里用 AES-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%,但合规性通过了。

注意: SM4 目前只有 128 位密钥版本。虽然 128 位在经典计算下足够安全,但如果你考虑量子威胁,SM4 的 2^64 安全强度可能不够。国密局正在推进 SM4 的 256 位版本,但目前还没正式发布。

分组模式: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 已经有标准了)。

知识体系结构图

下面这张图展示了对称加密算法的核心知识体系,包括算法、模式和密钥长度的关系:

对称加密算法知识体系 对称加密算法知识体系 对称加密 AES (SPN结构) ChaCha20 (ARX结构) SM4 (Feistel结构) 128/192/256位 256位 (标准) 128位 (国标) GCM (CTR+GHASH) CCM (CTR+CBC-MAC) Poly1305 (多项式) 经典安全:2^128 ~ 2^256 量子安全:2^64 ~ 2^128 选择建议 新系统优先 AES-256-GCM 或 ChaCha20-Poly1305;合规场景使用 SM4-GCM;密钥长度不低于 128 位
避坑指南: 我曾经见过一个团队在 IoT 设备上用了 AES-256-CBC,结果因为 IV 管理不当,导致数据泄露。CBC 模式需要随机 IV,而且 IV 不能重复。后来我帮他们改成 AES-256-GCM,nonce 用计数器管理,问题就解决了。记住:模式选择比算法选择更重要。

好了,对称加密这块就聊到这儿。记住三个核心点:算法选型看场景,模式选型看需求,密钥长度看未来。下一块咱们聊聊非对称加密,那又是另一番天地了。