AES(12):AES 工作模式
AES 是一种分组加密算法,它将待加密的明文分割为 n 个16字节大小的数据块(block),然后分别对这 n 块数据进行加密。
我们来看两个问题。
第1个问题。假设明文 P 是“ABC”,密钥是 K,使用 AES 基本算法,对明文加密两次(两次都是使用密钥 K),分别得到密文 C1 和 C2。那么 C1 和 C2 是否相同(AES 基本加密算法,请参见《AES(10):AES 基本算法》)?
第2个问题。假设明文 P 有160个字节,被分割为10个数据块。虽然明文 P 被分割为10个数据块,但是显然,在整个加密过程中,所使用的密钥仅仅是1个(记为 K)。再第1个数据块中包含“ABC”,第8个数据块中也包含“ABC”。使用 AES 算法加密(注意,是 AES 算法,不是 AES 基本算法),第1块中的“ABC”对应密文是 C1,第8块中的“ABC”对应的密文是 C2。那么 C1 和 C2 是否相同?
第1个问题的答案是确定的,C1 等于 C2,这是由 AES 基本算法决定的,这里就不再赘述。
第2个问题的答案是不确定的,C1 与 C2,可能相同,也可能不同,这与 AES 具体的算法有关,或者说,与 AES 的工作模式有关。
AES 有5种经典的工作模式,分别如下。
1)电码本模式(Electronic Codebook,ECB)
2)密文分组链接模式(Cipher Block Chaining,CBC)
3)密文反馈模式(Cipher FeedBack,CFB)
4)输出反馈模式(Output FeedBack,OFB)
5)计算器模式(Counter,CTR)
这5种工作模式是什么含义呢?为什么它们对同一个明文数据(比如“ABC”),其加密后的密文却可能是相同的,也可能是不相同的呢?下面我们分别讲述 AES 的这5种工作模式。
一、ECB 模式
ECB 模式(Electronic Codebook,电码本模式)是 AES 工作模式中最简单的一种工作模式。下面我们分别介绍 ECB 的加密和解密过程。
1.1 ECB 加密模式
ECB 加密模式,如图1所示。
图1 ECB 加密模式示意
通过图1可以看到,ECB 加密模式的算法分为如下两点。
1)将明文(含补齐数据)分割为 n 个数据块(每块16个字节/128比特),即图1中的 P1、P2 ... Pn
2)针对每一块,都进行相同的加密算法。图1中的 K 代表原始密钥(每一块的密钥都相同),图1中的“加密”,就是 AES 的基本加密算法
既然每一块的加密都相同(算法一致,密钥相同),那么显然,如果 Pi 和 Pj 包含某些相同的明文数据(比如“ABC”),那么对应的密文 Ci 和 Cj 中也会包含相同的密文数据(比如“ABC”被加密成“&*y”)。
从密码学的角度来讲,这种加密效果是非常糟糕的。二战时,日本虽然使用的加密算法不是 AES,但是其 JN25b 算法,却与 AES-ECB 模式有着一样的缺点。也正是这个缺点,使得日本把“中途岛”总是加密成“AF”,结果造成了日军在中途岛战役的惨败。(本文只谈密码学本身,不谈政治)
体现 AES-ECB 这种糟糕加密效果的,还有一张被经常应用的著名的图,如图2所示。
图2 AES-ECB 加密效果
图2-A 是原图,图2-B 是 AES-ECB 加密后的图。由于 ECB 的特征,我们看到其加密结果暴露了很多信息——这些暴露信息严重影响了加密安全,极端情况下,甚至都不需要解密就已经将关键信息泄露(比如图2)。
当然,也不能说 ECB 工作模式一无是处,它的好处是可以并行计算。通过图1可以看到,P1、P2 ... Pn 的加密过程完全是独立的,因而可以并行计算。
不过,鉴于 ECB 的极度不安全性,虽然它可以并行计算,现在各个相关密码算法都已经不推荐采用 ECB 模式。
1.2 ECB 解密模式
ECB 解密模式,如图3所示。
图3 ECB 解密模式示意
图3中的“解密”,就是《AES(10):AES 基本算法》中所描述的 AES 基本解密算法。图3中的其他内容,对照图1,就比较明了,这里不再赘述。
二、CBC 模式
为了解决 ECB 模式的问题,CBC(Cipher Block Chaining,密文分组链接模式)应该是最直接、最简单的 AES 工作模式。当然,CBC 模式也分为加密和解密两种算法,下面我们分别讲述。
2.1 CBC 加密模式
CBC 加密模式,如图4所示。
图4 CBC 加密模式示意
图4与图1最大的区别,也是唯一的区别,就是:上一块数据加密后输出的密文,同时也是下一块加密的输入。如果用公式表示,那就是:
C1 = E(K, P1)
Cj = E(K, [Cj-1 xor Pj]), j = 2,3 ...n
其中 E(encrypt)代表加密算法,就是 AES 基本加密算法。
通过这些加密公式可以看到,对于任意一块明文 Pj(j > 1),它的密文 Cj,不仅与 Pj 和密钥 K 有关,还与前一块的密文 Cj-1 相关