首页/我的作品/密码学/5.4 工作模式:为什么不能直接加密多块数据
密码学:守护数字世界的秘密

5.4 工作模式:为什么不能直接加密多块数据

第 30 / 78 篇 · Crazy Boy

AES一次只能加密128位(16字节)的数据。如果你的消息刚好是16字节,那没问题——直接加密就好。但现实中的消息往往更长:一封邮件可能有几千字节,一张图片可能有几兆,一部电影更是海量数据。我们该怎么办?

最简单的想法是把长消息切成一个个16字节的块,然后对每个块独立加密。这个方案听起来很自然,但它隐藏着一个巨大的陷阱。

ECB模式:最直观却最危险的选择

这种最简单的分块加密方式,在密码学中有一个正式的名字:电子密码本模式(Electronic Codebook,ECB)。它的工作方式就像一本巨大的密码本:每个明文块都独立加密,相同的明文块总是产生相同的密文块。

你可能会问:这有什么问题?问题大了。

问题一:相同的明文块暴露模式

假设你加密一张图片。图片中有一大片蓝色的天空,这意味着很多像素块是相同的。在ECB模式下,这些相同的像素块会被加密成相同的密文块。结果就是,加密后的图片虽然看起来是乱码,但仍然能看出原始的轮廓——因为相同颜色的区域在密文中仍然表现为相同的模式。

(这里可以配一张著名的ECB模式加密图片的对比图:左边是原始图片,中间是ECB加密后的“噪点图”但隐约可见轮廓,右边是其他模式加密后的完全随机图)

这个经典例子生动地说明了ECB模式的致命弱点:它不能隐藏数据的模式。攻击者即使不知道密钥,也能从密文中推断出原始数据的结构信息。

问题二:重放攻击

攻击者可以截获密文,然后重新排列密文块的顺序。由于每个块独立解密,攻击者可以打乱块顺序,甚至用之前截获的块替换新的块,而解密后可能得到有意义的但被篡改的明文。

例如,假设你的消息是“支付100元给张三”,分成几个块。攻击者可以把自己的密文块“支付10000元给李四”中的某些块替换进来,造成严重后果。

为什么不能直接分块加密?

ECB的问题根源在于:块与块之间没有任何联系。每个块都是孤立的,这给了攻击者分析和操纵的空间。

安全的加密需要做到两件事:

  1. 隐藏模式:即使明文中有重复模式,密文也不能表现出任何规律。
  2. 保证完整性:密文块之间应该有关联,使得任何篡改都能被检测到。

这就引出了工作模式的概念——如何将分组密码应用到多块数据上。

常见的工作模式

密码学家们设计了多种工作模式,每种模式都有自己的特点和适用场景。

CBC模式(密码块链接模式)

CBC模式是ECB的改进版。它的核心思想是:每个明文块在加密之前,先与前一个密文块进行异或。

  • 第一个块需要一个初始向量(IV)来代替“前一个密文块”。
  • 这样,即使两个明文块相同,只要它们前面的密文块不同,加密结果也会不同。

CBC模式有效地隐藏了数据模式。而且,密文块的顺序是固定的,不能随意调换——因为每个块的解密都依赖前一个块。

但是CBC也有缺点:加密是串行的(不能并行),而且如果密文在传输中损坏一个块,会影响当前块和下一个块的解密。

CTR模式(计数器模式)

CTR模式把分组密码变成了流密码。它不直接加密明文,而是加密一个不断递增的计数器值,然后把加密结果与明文异或得到密文。

  • 每个块使用的计数器值不同(通常是nonce加上块序号)。
  • 解密时,用同样的计数器值加密得到相同的密钥流,再与密文异或。

CTR模式的优点是可以并行计算(因为每个块的计数器值独立),而且不需要填充。它也是许多现代协议(如TLS 1.3)的首选。

GCM模式(伽罗瓦计数器模式)

GCM模式在CTR的基础上增加了认证功能。它不仅能加密数据,还能生成一个消息认证码,用于验证数据的完整性和真实性。

  • 接收方可以确认密文没有被篡改,而且确实来自声称的发送方。
  • GCM是现代密码学中推荐的认证加密模式,广泛应用于TLS、SSH等协议。

如何选择工作模式?

没有一种模式适用于所有场景,选择取决于你的需求:

  • 如果只需要加密,且可以接受并行处理,CTR是不错的选择。
  • 如果需要认证(大多数情况都需要),优先选择GCM这样的认证加密模式。
  • 绝对不要用ECB,除非你加密的是随机数据(比如加密密钥本身),而且你知道自己在做什么。

小结

工作模式是分组密码不可或缺的一部分。它们把一次只能加密16字节的AES,变成了能加密任意长度消息的强大工具。但正如我们所见,选择错误的工作模式(如ECB)可能会让整个加密形同虚设。

在下一节,我们将用一个具体的案例来警示大家:为什么ECB模式是绝对不能用的——即使是最简单的图片加密,也能让你看清它的真面目。