目录
1. 概述
密码算法可以分为分组算法和流密码两种。
-
分组密码(block cipher),是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组(block)。一个分组的比特数就称为分组长度(block length)。
-
流密码(stream cipher),是对数据流进行连续处理的一类密码算法。
DES、3DES、AES等大多数对称密码算法都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码的迭代方法就称为分组密码的“模式”。
-
DES和3DES的分组长度都是64bit(8byte),一次只能加密64bit的明文,并生成64bit的密文。
-
AES的分组长度为128bit(16byte),因此AES一次可加密128bit的明文,并生成128bit的密文。
2. ECB模式
2.1 概述
ECB模式全称Electronic CodeBook mode,电子密码本模式。
使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组→密文分组”的对应表,因此ECB模式也称为电子密码本模式。
当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充(padding)。
2.2 ECB模式的加密
2.3 ECB模式的解密
2.4 优点
- 一个分组损坏不影响其它分组。
- 可以并行加解密。
2.5 缺点
- 相同的明文分组会转换为相同的密文分组。
- 无需破译密码就能操纵明文(每个分组独立且前后文无关,直接增加或删除一个分组不影响其它分组解密过程的正确性)。
3. CBC模式【推荐】
3.1 概述
CBC 模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组是像链条一样相互连接在一起的。
在CBC模式中,将明文分组与前一个密文分组进行XOR运算,然后再进行加密。每个分组的加解密都依赖于前一个分组。而第一个分组没有前一个分组,因此需要一个初始化向量(initialization vector),通常缩写为IV。
3.2 CBC模式的加密
3.3 CBC模式的解密
3.4 优点
- 加密结果与前文相关,有利于提高加密结果的随机性。
- 可并行解密。
3.5 缺点
- 无法并行加密。
- 一个分组损坏,如果密文长度不变,则两个分组受影响。
- 一个分组损坏,如果密文长度改变,则后面所有分组受影响。
4. CFB模式
4.1 概述
CFB模式的全称Cipher FeedBack mode,密文反馈模式。
在CBC模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。
在CBC和EBC模式中,明文分组都是通过密码算法进行加密的。而在CFB模式中,明文分组并没有通过加密算法直接进行加密,明文分组和密文分组之间只有一个XOR。
CFB模式是通过将“明文分组”与“密码算法的输出”进行XOR运行生成“密文分组”。CFB模式中由密码算法生成的比特序列称为密钥流(key stream)。密码算法相当于密钥流的伪随机数生成器,而初始化向量相当于伪随机数生成器的种子。(CFB模式有点类似一次性密码本)
4.2 CFB模式的加密
4.3 CFB模式的解密
4.4 优点
- 支持并行解密。
- 不需要填充(padding)。
4.5 缺点
- 不能抵御重放攻击(replay attack)。
- 不支持并行加密。
5. OFB模式
5.1 概述
OFB 模式的全称是Output-Feedback模式(输出反馈模式)。在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的,在这一点上OFB模式和CFB模式非常相似。
5.2 OFB模式的加密
5.3 OFB模式的解密
5.4 CFB模式与OFB模式的对比
OFB模式和CFB模式的区别仅仅在于密码算法的输入。
CFB模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此就有了“密文反馈模式”这个名字。
相对地,OFB模式中,密码算法的输入则是密码算法的前一个输出,也就是将输出反馈给密码算法,因此就有了“输出反馈模式”这个名字。
由于CFB模式中是对密文分组进行反馈的,因此必须从第一个明文分组开始按顺序进行加密,也就是说无法跳过明文分组1而先对明文分组2进行加密。
相对地,在OFB模式中,XOR所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行xoR就可以了。和AES等密码算法相比,XOR 运算的速度是非常快的。这就意味着只要提前准备好密钥流就可以快速完成加密。换个角度来看,生成密钥流的操作和进行XOR运算的操作是可以并行的。
6. 参考
图解密码技术(第3版) (日)结城浩 著;周自恒 译; 人民邮电出版社;2016-06-01