AES的六种模式详解
分组密码算法是用于加密或解密的方案,其中明文块被视为单个块,并用于获得具有相同大小的密文块,AES(Advanced Encryption Standard)是分组密码算法中最常用的算法之一。2001年,NIST(美国国家标准与技术研究所)对其进行了标准化,以取代当时用于加密的DES和3DES。AES块的大小为128 bits,而加密密钥的大小可以是128 bits、192bits或256bits(密钥有三个长度可选择,但加密块的大小始终是128位)。分组密码算法允许对数据长度不同于块定义大小(128 bits)的明文(len(Plaintext) % 128 != 0
)进行加密,我们可以使用一些算法填充明文使得满足长度要求(len(Plaintext) % 128 == 0
),如PKCS5或PKCS7。
下面将会介绍六种AES的模式.
- ECB mode: Electronic Code Book mode
- CBC mode: Cipher Block Chaining mode
- CFB mode: Cipher FeedBack mode
- OFB mode: Output FeedBack mode
- CTR mode: Counter mode
- GCM mode: Galois/Counter mode
ECB Mode
ECB模式是所有模式中最简单的,由于存在明显的缺点,一般不推荐使用,该模式的分块方案如下图所示
从图中可以看出,明文被分成若干块,每块都是128bits的长度,因此,ECB模式需要对Plaintext
填充数据,直到它能被128bits的块刚好整分,每个区块都将使用相同的密钥和相同的算法进行加密,如果我们加密相同的明文,我们将得到相同的密文,明文和密文块是一一对应的,这种模式有很高的风险。
又由于加密/解密是独立的,所以我们可以并行地
加密/解密数据,如果一个明文或密文块被破解,它不会影响到其他块。
CBC Mode
CBC模式中使用了初始化向量IV
,IV具有与加密块相同的大小(128bits),一般来说,IV是一个随机数,而不是一个只使用一次的数nonce(Number used ONCE)
由图中可以看到,明文被分成许多块,每块都占128bits,因此对于明文长度无法整分的成块的需要填充数据。
首先使用第一个明文块P1与IV异或,然后将结果加密到密文块C1,在下一个块中,使用上一次的密文块C1与明文块异或…,按照相同的步骤直到最后一个块。在这种模式下,即使加密相同的明文块也会得到不同的密文块。
在CBC模式中,可以并行的解密数据,但无法并行加密数据,如果一个明文块或密文块被破坏,那么将会影响到后面的所有块。
CFB Mode
CFB模式允许流模式(stream)的加解密方式,同样也需要一个IV
首先将IV进行加密,然后将密文与第一个明文块P1进行异或的到密文C1,再对C1进行加密…,这样操作直到最后一个块。由于这种模式不会直接对明文Plaintext
进行加密,它只是使用密文与明文异或来获得密文,因此不需要对明文进行填充数据。
CFB模式可以并行解密数据,但不能并行加密,类似于CBC模式,如果有一个块坏了,将会影响到后面所有块。
OFB Mode
OFB和CFB类似,分块方案如下图所示
在OFB模式里,在第一次运算中加密IV,并在后续过程中不停的对结果进行加密,然后将加密结果与明文进行异或得到密文,与CFB不同的是,OFB总是对IV进行加密(无法并行),明文/密文块中如果有损坏的话,并不会对后续的块产生影响。
CTR Mode
CTR模式很像OFB模式,加密和解密都是最后通过异或实现的,只不过OFB使用的是IV及其每次的加密结果,而CTR使用的是counter,counter+1…的加密结果,这样有什么好处呢?只要知道counter的值,就可以快速算得后续某个块对应的counter是多少,而在OFB中,却得不停地从初始IV算过去。可以认为CTR模式中,加密和解密是并行的。
GCM Mode
- 加密
- 解密
GCM模式除了有CTR模式的优点外,还可对数据的完整性做校验,也就是说,密文一旦被攻击者做了修改,那么便会被发现,图中的具体实现细节可以参考NIST GCM
总结
Mode | 优点 | 缺点 |
---|---|---|
Electronic CodeBook (ECB) | - 简单 - 快 - 支持并行地加密/解密 | - 明文中的重复数据将在密文中反映出来 - 可以通过对密文的删除/替换达到操作明文的目的 - 不能抵御重放攻击 - 不应该被使用 |
Cipher Block Chaining (CBC) | - 支持并行地解密 - 明文中的重复数据不会在密文中反映出来 | - 不支持并行加密 - 错误的块会影响到后续所有的块 |
Cipher-Feedback (CFB) | - 不用填充 - 支持并行地解密 | - 不支持并行地加密 - 错误的块会影响到后续所有的块 |
Out-FeedBack (OFB) | - 不用填充 - 可以提前准备加密和解密 - 加密和解密采用相同的结构 - 坏块只影响当前的块 | - 不支持并行计算 - 攻击者可以改变密文实现破坏明文 |
Counter (CTR) | - 不用填充 - 支持并行地加密和解密 - 加密和解密使用相同的结构 - 坏块只影响当前的块 | - 攻击者可以改变密文实现破坏明文 |
Galois/Counter Mode (GCM) | - 除了CTR模式的优点外,还具备检查数据完整性的功能 |