二 分组密码模式

分组密码的模式

简介

前面介绍的DES和AES都属于分组密码,它们只能加密固定长度的明文,如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码进行迭代,而分组密码的迭代方法就被称为分组密码的“模式”。
分组密码有很多种模式,如果模式的选择不恰当,就无法充分保证机密性。
主要介绍分组密码与流密码,然后逐一介绍主要的分组密码的模式,最后再来考察一下到底应该使用哪种模式。

分组密码与流密码

分组密码: 是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组 。此外,一个分组的比特数就称为分组长度 。
例如:

  • DES和三重DES的分组长度都是64比特。这些密码算法一次只能加密64比特的明文,并生成64比特的密文。
  • AES的分组长度为128比特,因此AES一次可加密128比特的明文,并生成128比特的密文。

流密码 :是对数据流进行连续处理的一类密码算法。流密码汇总各一般以1比特、8比特或32比特等为单位进行加密和解密。

分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据流进行连续处理,因此需要保持内部状态,例如,一次性密码本就属于流密码。

模式

分组密码主要分组模式主要有以下5种:

  • ECB 模式:Electronic CodeBook mode(电子密码本模式)
  • CBC 模式:Cipher Block Chaining mode(密码分组链接模式)
  • CFB 模式: Cipher FeedBack mode(密文反馈模式)
  • OFB 模式: Output FeedBack mode (输出反馈模式)
  • CTR 模式: CounTeR mode(计算器模式)

术语

明文分组 是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
密文分组 是指使用分组密码算法将明文分组加密之后生成的密文。

ECB模式

简介

ECB模式的全称是Electronic CodeBook模式。在ECB模式中,将明文分组加密之后的结果将直接成为密码分组

使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组->密文分组”的对应表,因此ECB模式也称为电子密码本模式
当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充

ECB模式的特点

ECB模式是所有模式中最简单的一种,ECB模式中,明文分组与密文分组是一一对应的关系,因此如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组。这样一来,只要观察一下密文,就可以知道明文存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在一定风险的。

对ECB模式的攻击

ECB模式中,每个明文分组都各自独立地进行加密和解密,但这其实是一个很大的弱点。
假如存在主动攻击者Mallory,他能够改变密文分组的顺序。当接收者对密文解密时,由于密文分组的顺序被改变了,因此相应的明文分组的顺序也会被改变。也就是说,攻击者Mallory无需破译密文就能够操作明文。

CBC模式

CBC模式是指将前一个密文分组与当前明文分组的内容混合起来进行加密,这样就可以避免ECB模式的弱点。
CBC模式的全称Cipher Block Chaining 模式(密文分组组链接模式),之所以叫这个名字是因为密文分组是像链条一样相互连接在一起。
在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。

加密

解密

ECB和CBC对比

如果将–个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式
的区别)。ECB模式只进行了加密,而CBC模式则在加密之前进行了- -次XOR。

初始化向量

当加密第一个明文分组是,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来替代“前一个密文分组”,这个比特序列称为初始化向量 ,通常缩写为IV。每次加密时都会随机产生一个不同的比特序列来作为初始化向量。

CBC模式的特点

明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即便明文分组1和2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。
假设CBC模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生编号,则解密时,最多只会影响2个分组受到数据损坏的影响。

假设CBC模式的密文分组中有一些比特缺失了,那么此时即便只缺失了1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密了。

对CBC模式的攻击

假设主动攻击者Mallory的目的是通过修改密文来操纵解密后的明文。如果Mallory能够对初始化向量中的任意比特进行反转,则明文分组中相应的比特也会被反转。这是因为在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。

填充提示攻击

填充提示攻击(Padding Oracle Attack)是一种利用分组密码中的填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组填充一些数据使其凑满一个分组的长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充的数据进行少许改变。由于接收者在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击方式并不仅限于CBC模式,而是适用于所有需要进行分组填充的模式。2014年对SSL3.0造成重大影响的POODLE攻击实际上就是一种填充攻击。要防御这种攻击,需要对密文进行认证,确保这段密文的确是由合法的发送者在制定明文内容的前提下生成的。

对初始化向量进行攻击

初始化向量( IV )必须使用不可预测的随机数。然而在SSL/TLS的TLsS 1.0版本协议中,
IV并没有使用不可预测的随机数,而是使用了上一次CBC模式加密时的最后一个分组。为了防
御攻击者对此进行攻击,TLS 1.1以上的版本中改为了必须显式地传送IV ( RFC5246 6.2.3.2 )。

CFB模式

CFB模式的全称是Cipher FeedBack (密文反馈模式)。在CFB模式中,前一个密文分组会被送回密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。

CFB和CBC对比

初始化向量

在生成第一个密文分组时,由于不存在前一个输出的数据,因此需要使用初始化向量来替代,这一个点和CBC模式相同的。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。

CFB模式与流密码

其实CFB模式模式的结构与我们前面介绍的一次性密码本非常相似的。一次性密码本是通过将“明文”与“随机比特序列”进行XOR运算生成“密文”的。而CFB模式则是通过将“明文分组”与“密码算法的输出”进行XOR运算来生成“密文分组”的。在通过XOR来进行加密这一点,两者是非常相似的。
在CFB模式中,密码算法的输出相当于一次性密码本中的随机比特序列。由于密码算法的输出是通过计算得到的,并不是真正的随机数,因此CFB模式不可能像一次性密码本那样具备理论上不可破译的性质。

CFB模式模式中由密码算法所生产的比特序列称为密钥流 。在CFB模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量就相当于随机数生成器的“种子”。

在CFB模式中,明文数据可以被逐比特加密,因此我们可以将CFB模式看作是一种使用分组密码来实现流密码的方式

对CFB模式的攻击

对CFB模式可以实施重放攻击。其实,对ECB、CBC模式也可以实施重放攻击

有一天,Alice向Bob发送了一条消息,这两条消息是由4个密文分组组成的。主动攻击者Mallory将该消息中额后3个密文分组保存了下来。转天,Alice又向Bob发送了内容不同的4个密文分组(我们假设使用了相同的密钥)。Mallory用昨天保存下来的3个密文分组将今天发送的后3个密文分组进行了替换。

于是,在Bob解密时,4个分组中就只有第1个可以解密成正确的明文,第2个会出错,,而第3和第4个则变成了Mallory替换的内容(也就是昨天发送的明文的内容)。Mallory没有破解密码,就成功地将以前的的电文混入了新的电文中。而第2个分组出错到底是通信错误,还是被人攻击所造成?Bob是无法做出判断的。

OFB模式

OFB模式的全称(Output-Feedback)(输出反馈模式)。在OFB模式中,密码算法的输出会反馈到密码算法的输入中。

OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。在这一点上OFB模式和CFB模式非常相似。

初始化向量

OFB模式中也需要使用初始化向量。一般来说,我们需要每次加密时。生成一个不同的随机比特序列作用作为初始化向量。

CFB和OFB模式对比

CFB模式中,密码算法的输入时前一个密文分组。OFB模式中,密码算法的输入是密码算法的前一个输出。
如下图:

对于CFB模式来说,必须从第一个明文分组开始按顺序进行加密,也就是说无法跳过明文分组1而先对明文分组2进行加密。
相对地,OFB模式中,XOR所需要的比特序列可以事先通过密码算法生成,和明文无关。
只要提前准备好所需的密钥流,则在实际聪明文生成密文的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行XOR就可以了。和AES等密码算法相比,XOR运算的速度是非常快的。这样可以进行快速加密,而且生成密钥流和进行XOR运算的操作可以并行。

CTR模式

CTR模式的全称 CountTeR模式(计数器模式)。CTR模式是一种通过将逐此累加的计数器进行加密来生成密钥流的流密码

CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也就是说,最终的密文分组是通过将计数器得到的比特序列,与明文分组进行XOR而得到的。

计数器生成方法

每次加密时都会生成一个不同值(nonce)来作为计数器的初始值。当分组长度为128比特(16字节)时,计数器的初始值可能像下面这样的形式:

其中前8个字节为nonce,这个值在每次加密必须都是不同的。后8个字节为分组序号,这个部分会逐次累加的。在加密过程中,计数器的值会产生如下变化。

上述方法可以保证计数器的值每次都不同。因此每个分组生成的密钥流也不同。这种方法就是用分组密码来模拟生成随机的比特序列。

OFB和CTR模式对比

CTR和OFB模式都属于流密码。OFB模式是将加密的输出反馈到输入,而CTR模式则是将计数器的值用作输入。

在OFB模式中如果一个分组在通过加密后结果碰巧和加密前相同,那么这一分组之后的密钥流就会变成同一个值的不断反复。在CTR模式中因为计数器每次都不同,不存在这一问题。

CTR模式的特点

CTR模式的加密和解密使用完全相同的结构,这个与OFB模式一样,在程序实现上比较容易。
在CTR模式中,可以以任意顺序对分组进行加密和解密,在加密和解密是用到的“计数器”的值可以由nonce和分组序号直接计算出来。这一点在OFB模式中每次计算依赖于上一次密码算法的输出。
能够以任意顺序处理分组,意味着可以实现并行计算。在支持并行计算的系统中,CTR模式的速度是非常快的。

不同分组模式的对比

参考资料

该系列的主要内容来自《图解密码技术第三版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章