分组密码的模式-分组密码是如何迭代的
主要内容:分组密码模式ECB、CBC、CFB、OFB、CTR
上一篇文章简要记录了对称密码以及它们的python实现,细心的同学可能已经发现了一些模式的运用。在代码中,我们创建一个新的实例的时候,要指定要使用的模式,这个模式是分组密码特有的,这里说一下分组密码的定义:分组密码是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组,一个分组的比特数就称为分组长度。上文中的DES、3DES和AES都属于分组密码。流密码:对数据进行连续处理的一类密码算法,因为要对数据进行连续处理,所以要保持内部状态。密码算法分为分组密码和流密码两种。
什么是模式?分组密码算法只能加密固定长度的分组,理想的情况是明文长度刚好是密码算法分组要求的长度,直接加密就可以了,如果都是这种情况,也就不需要什么模式了。现实的情况是往往是要加密的明文长度超过分组密码的分组长度,这种情况就需要对分组密码算法进行迭代。如果明文过长,我们要对明文进行分割。最容易想到的模式就是分割成若干个分组,逐一对分组进行加密,这种模式就是ECB模式,但是ECB模式有很大的弱点。下面我们来逐一学习分组模式。
ECB模式
ECB模式全称是Electronic CodeBook mode(电子密码本模式),它是将明文分组加密后的结果直接成为密文分组,如下图

这样会形成一个明文-密文的对应表,因此ECB模式被称为电子密码本模式,这种模式简单易懂。
ECB模式特点
在所有的模式中属于最简单的一种,明文分组和密文分组一一对照。观察密文特点,就能够知道明文中存在怎么样的重复组合,并能以此为线索进行破译密码;可以对密文进行调换、删除等密文攻击,从而操纵明文。虽然可以通过其他的手段来增加安全性,但不推荐使用ECB模式。
CBC模式
CBC模式全称为Cipher Block Chaining模式(密码分组链接模式),这个模式密文分组像链条一样相互链接在一起。CBC模式会将明文分组与前一个密文分组进行XOR运算,然后再进行加密,加密过程如下图

解密过程和加密过程相反。
初始化向量:当加密第一个明文分组时,由于不存在前一个密文分组,因此需要准备一个长度为一个分组的比特序列来代替前一个密文分组,这个比特序列称为初始化向量(通常缩写为IV),一般都会随机生成一个比特序列作为初始化向量。
CBC模式特点
明文分组在加密之前一定会与前一个密文分组进行XOR运算,因此即便明文分组1和2内容相同,密文分组1和2也不一定相等,这样ECB模式缺陷就不存在了。CBC模式中,无法单独对一个中间的明文分组进行加密,加密必须满足条件:前一组密文,当前组明文,而要满足前一组密文存在这个条件,必须前面所有明文分组进行逐一加密,例如生成密文分组3,则必须凑齐明文分组1、2、3才可以。
安全通信协议之一的SSL/TLS,就是使用CBC模式来确保通讯的机密性。
CFB模式
CFB模式全称Cipher FeedBack模式(密文反馈模式),在CFB模式中,前一个密文分组会被送回到密码算法的输入端,加密流程图如下

值得注意的是,明文分组和密文分组之间没有经过“加密”这一步骤,只有一个XOR运算,所以在解密的时候,从初始化向量IV开始,执行的也是加密操作,然后与密文做一个XOR运算,得到明文。CFB模式中的初始化向量IV和CBC模式一样,也是一个随机生成的比特序列。解密过程如下图:

CFB模式特点
密文分组和明文分组之间没有“加密”过程,只有一个XOR过程,其实这也是一种加密,XOR充当了这个角色,这个过程的两个对象,一个是明文分组,一个是前一个密文分组经过加密后的比特序列,密文反馈模式的反馈,指的就是密文返回输入端。
OFB模式
OFB模式的全称是Output-Feedback模式(输出反馈模式),在该模式中,密码算法的输出会反馈到密码算法的输入中。OFB模式并不是通过密码算法对明文直接进行加密,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组,和CFB模式非常相似。加密过程如下图:

解密的过程也是对初始化向量进行加密生成密钥流,然后用密钥流和密文做XOR即可得到明文。
OFB模式特点
OFB模式和CFB模式相同的是不直接对明文分组进行“加密”,而是使用初始化向量IV通过加密算法生成密钥流,用加密算法生成的比特序列和明文分组做XOR运算,产生的结果就是密文分组。加密算法产生的输出反馈到加密算法的输入,所以叫做输出反馈模式。
CTR模式
CTR模式的全称是CounTeR模式(计数器模式),该模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。CTR模式中,每个分组对应一个逐次累加的计数器,并通过计数器进行加密来生成密钥流,最终的密文分组是通过将计数器加密的比特序列,与明文分组进行XOR而得到的,和CFB模式、OFB模式类似,不直接对明文分组进行“加密”。下图为加密过程:

解密过程是将计数器加密产生比特序列和密文分组进行XOR得到明文分组。
计数器生成
每次加密都会生成一个不同的值(nonce)来作为计数器的初始值,当分组长度为128比特(16字节)时,计数器初始值用前八个字节为nonce,这个值每次加密都必须是不同的,后八个字节为分组序号,这个部分会逐次累加,例如:
33 2D 4F CD 52 8B 5A 67 00 00 00 00 00 00 00 01
前八个字节33 2D 4F CD 52 8B 5A 67为nonce主体,后八位为累加计数部分,加密过程中,会产生如下变化:
33 2D 4F CD 52 8B 5A 67 00 00 00 00 00 00 00 01 明文分组1的计数器(初始值)33 2D 4F CD 52 8B 5A 67 00 00 00 00 00 00 00 02 明文分组2的计数器33 2D 4F CD 52 8B 5A 67 00 00 00 00 00 00 00 03 明文分组3的计数器33 2D 4F CD 52 8B 5A 67 00 00 00 00 00 00 00 04 明文分组4的计数器33 2D 4F CD 52 8B 5A 67 00 00 00 00 00 00 00 05 明文分组5的计数器……
CTR模式特点
CTR模式和OFB模式一样,都属于流密码。CTR模式中可以以任意的顺序对分组进行加密和解密,因为加密和解密需要用到的计数器的值可以由nonce和分组序号直接计算出来,能够实现并行计算。
分组密码模式比较表(来源《图解密码技术》)





