我们在上文中简单介绍了序列密码(不了解的同学,可以去看看笔者上一篇对序列密码的介绍),知道其最大的缺点是密钥长度与明文长度一致,如果加密80M的明文,就需要80M的密钥,这样在传输与保存上都极为不便。这里,向大家介绍另外一种加密方式,分组加密。
分组密码很好的解决了序列密码的缺点。分组密码是将明文消息编码表示后的数字(简称明文数字)序列, 划分成长度为n个组,每个组有m个字节。每组分别在密钥的控制下变换成等长的输出数字(简称密文数字)序列。
分组密码加密固定长度的分组,需要加密的明文长度可能超过了分组密码的分组长度,此时就需要对分组密码算法进行迭代,以便将长明文进行加密,迭代的方法不同,就造成了分组密码的多种模式。
这里介绍分组密码的几个模式:
一、ECB模式(电子密码本模式)
ECB模式是将明文消息分成固定大小的分组,当最后一个分组的内容小于分组长度时,需要特定的数据进行填充以至于长度等于分组长度,每个分组的加密和解密都是独立的,可以进行并行操作。
使用ECB模式加密时,相同的明文分组会转换为相同的密文分组,也就时说,我们可以将其理解为是一个巨大的“明文>密文分组”的对应表,因此ECB模式也称为电子密码本模式,但是安全性较低。
具体的加解密流程如下图:
二、CBC模式(密码分组链接模式)
CBC模式中的第一个分组需要用初始化向量IV(一个随机且长度为一个分组长度单位的比特序列)进行异或操作再进行加密,而后面的每一个分组都要先和前一个分组加密后的密文分组进行异或操作,然后进行加密。加密是连续的,不能进行并行操作。无法对单独一个中间的明文分组加密;对初始化向量没有加密。当CBC模式中的密文分组有一个分组损坏,只要密文分组的长度没有发生变化,解密时最多会有两个分组受到数据损坏的影响。当CBC的密文分组中有一些比特缺失了,导致密码分组的长度发生变化,此分组发生错位,在缺失比特位置之后的密文分组也就无法全部解密了。
具体的加解密流程图如下:
三、CFB模式(密文反馈模式)
CFB模式是将前一个分组的密文加密后和当前分组的明文进行异或操作生成当前分组的密文,第一个明文分组通过初始化向量IV进行加密,再与之进行异或操作得到第一个密文分组。CFB模式中有密码算法产生的比特序列成为密钥流(在CFB中密码算法相当于伪随机数生成器),在CFB中分组密码算法在解密时仍执行加密操作(因为密钥流通过加密产生密钥)对CFB模式可实施重放攻击。
具体加解密流程如下图:
四、OFB模式
OFB模式是通过将明文分组和密码算法的输出进行异或操作来产生密文分组的,也需要使用初始化向量IV。密码算法的输出会反馈到密码算法的输入中,并非通过密码算法加密明文分组的,而通过将明文分组和密码算法的输出进行XOR来产生密文分组。与CFB的区别在于密码算法的输入,CFB是对密文分组进行反馈,必须按顺序进行加密;OFB是对密钥流进行加密,生成密钥流与XOR可以并行。
加解密流程如下图:
五、CTR模式(计数器模式)
在CRT模式中,每次加密时都会生成一个不同的值作为计数器的初始值,每个分组对应一个逐次累加的计数器,通过对计数器进行加密来生成密钥流,再将密钥流与明文分组进行异或操作得到密文分组。
具体加解密流程如下图:
总结,我将这五种加密模式总结如下表:
模式 | 优点 | 缺点 | 备注 |
ECB模式 | 简单、快速、支持并行运算 | 明文中的重复排列反映在密文中 通过删除、替换密文分组可以对明文进行操作 对包含某些比特错误的密文进行解密时对应的分组会出错 不能抵御重放攻击 |
不应使用 |
CBC模式 | 明文的排列顺序,不会反映在密文中 支持并行运算(仅解密) 能够解密任意密文分组 |
对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错 加密不支持并行运算 |
CRYPRTREC推荐 《应用密码学》推荐 |
CFB模式 | 不需要填充 支持并行运算(仅解密) 能够解密任意密文分组 |
加密不支持并行运算 对包含错误比特的密文进行机密时,第一个分组的全部比特以及后一个分组的相应比特会出错 不能抵御重放攻击 |
CRYPRTREC推荐 |
OFB模式 | 不需要填充 可事先进行加密、解密的准备 加密、机密使用相同结构 对包含某些错误比特的密文时进行解密时,只有明文中相应的比特会出错 |
主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转 | CRYPRTREC推荐 |
CTR模式 | 不需要填充 可事先进行加密、解密的准备 加密、解密使用相同结构 对包含某些错误比特密文进行解密时,只有明文中相对应的比特会出错 支持并行运算(加密及解密) |
主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转 | CRYPRTREC推荐 《应用密码学》推荐 |