分组密码模式
分组密码与流密码
分组密码:每次只能处理特定长度的一块数据的一类算法,“一块”就称为分组(block )。一个分组的比特数就称为分组长度(block length)。
流密码: 对数据流进行连续的处理的一类密码。
只有一次性密码本属于流密码,而DES 、三重
DES 、AES 等大多数对称密码算法都属千分组密码。
模式
分组密码算法只能加密固定产固定的分组,若加密的铭文的长度超过分组密码的长度,需要对分组密码算法进行迭代,以便将所有的密码全部加密。
明文分组和密文分组
主动攻击者Mallory
窃听者Eve 只能被动地进行窃听,而主动攻击者则可以主动介入发送者和接收者之间的通信过程,进行阻碍通信或者是篡改密文等活动。这样的攻击者一般称为Mallory 。
ECB模式
使用ECB 模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组一密文分组”的对应表,因此ECB 模式也称为电子密码本模式。
当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充( padding )。
CBC 模式
在CBC 模式中,首先将明文分组与前一个密文分组进行XOR 运算,然后再进行加密。
ECB 和 CBC 的区别
初始化向量
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector) ,通常缩写为IV 。
一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
CBC模式的特点
明文分组在加密之前一定会与“前一个密文分组”进行XOR 运算,因此即便明文分组 1和 2 的值是相等的,密文分组1 和 2 的值也不一定是相等的。这样一来,ECB 模式的缺陷在CBC模式中就不存在了。
在CBC 模式中,我们无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3, 则至少需要凑齐明文分组 1、2 、3 才行。
假设CBC 模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只会有2 个分组受到数据损坏的影响。
对CBC 模式的攻击
假设主动攻击者Mallory 的目的是通过修改密文来操纵解密后的明文。如果Mallory 能够对初始化向量中的任意比特进行反转(即将1 变为0, 将0变为1),则明文分组(解密后得到的明文分组)中相应的比特也会被反转。
在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。
CBC模式中的密文分组存在缺失的比特时,之后所有的明文分组都会受到影响。
这样,Mallory 就可以对初始化向量进行攻击,但是想要对密文分组也进行同样的攻击就非常困难了。例如,如果Mallory 将密文分组1 中的某个比特进行了反转,则明文分组2 中相应
的比特也会被反转,然而这1 比特的变化却会对解密后的明文分组l 中的多个比特造成影响。
也就是说,只让明文分组 1中Mallory 所期望的特定比特发生变化是很困难的。
### 填充提示攻击
填充提示攻击是一种利用分组密码中的填充部分进行攻击的方法,在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据凑满一个分组长度。
在填充提示攻击中,攻击者会反复发送一段密文,每次发送都对填充数据进行改变。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过错误消息可以获取与明文相关的信息。攻击方式并不仅限于CBC模式,而是适用于所有需要进行分组填充的模式。
对初始化向量进行攻击
初始化向量必须使用不可预测的随机数然而在SSL/TLS 的TLS 1.0 版本协议中,IV 并没有使用不可预测的随机数,而是使用了上一次CBC 模式加密时的最后一个分组。为了防御攻击者对此进行攻击° , TLS1.1 以上的版本中为了必须显式地传送 IV 。
CBC模式的应用
CFB模式
在CFB 模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。
在ECB 模式和CB C 模式中,明文分组都是通过密码算法进行加密的,然而,在CFB 模式中,明文分组并没有通过密码算法来直接进行加密。
从上图中看出,组和密文分组之间并没有经过“加密”这一步骤。在CFB 模式中,明文分组和密文分组之间只有一个XOR。
CBC模式与CFB模式对比
初始化向量
在生成第一个密文分组时,由于不存在前一个输出的数据,因此需要使用初始化向量( I V)来代替,这一点和CBC 模式是相同的。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
CFS 模式与流密码
一次性密码本是通过将“明文”与“随机比特序列”进行XOR 运算来生成 “密文“ 的。而CFB 模式则是通过将 “明文分组” 与 “密码算法的输出“ 进行XOR 运算来生成 “密文分组” 的。
在CFB 模式中,密码算法的输出相当于一次性密码本中的随机比特序列。CFB模式由密码算法所生成的比特序列称为密钥流。 在CFB 模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量就相当于伪随机数生成器的“种子”。
在CFB 模式中,明文数据可以被逐比特加密,因此我们可以将CFB 模式看作是一种使用分组密码来实现流密码的方式。
对CFB 模式的攻击
对CFB 模式可以实施重放攻击(replay attack)。
OFB 模式
OFB 模式的全称是Output-Feedback 模式(输出反馈模式)。在OFB 模式中,密码算法的输出会反馈到密码算法的输入中。
OFB 模式并不是通过密码符法对明文直接进行加密的,而是通过将“明文分组”和“密码符法的输出“进行XOR 来产生“密文分组”的,在这一点上O FB 模式和CFB 模式非常相似。
OFB 模式中也需要使用初始化向量(IV )。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
CFB 模式与OFB 模式的对比
OFB 模式和CFB 模式的区别仅仅在于密码算法的输入。
CFB 模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此就有了“密文反馈模式”这个名字。
相对地,OFB 模式中,密码算法的输入则是密码算法的前一个输出`也就是将输出反馈给密码算法,因此就有了"输出反馈模式”这个名字。
由于CFB 模式中是对密文分组进行反馈的,因此必须从第一个明文分组开始按顺序进行加密,也就是说无法跳过明文分组1而先对明文分组2进行加密。
相对地,在OFB 模式中,X OR 所需要的比特序列(密钥流)可以事先通过密码算法生成和明文分组无关。只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行XOR 就可以了。
和AES 等密码算法相比,XOR 运算的速度是非常快的。这就意味着只要提前准备好密钥流就可以快速完成加密。换个角度来看,生成密钥流的操作和进行XOR 运算的操作是可以并行的。
CTR模式
CTR 模式的全称是CounTeR
模式(计数器模式)。CTR 模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
CTR 模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR 而得到的。
计数器的生成方法
每次加密时都会生成一个不同的值( nonce ) 来作为计数器的初始值。当分组长度为128 比特( 16 字节)时,计数器的初始值可能是像下面这样的形式。
其中前8 个字节为nonce, 这个值在每次加密时必须都是不同的。后8 个字节为分组序号,这个部分是会逐次累加的。在加密的过程中,计数器的值会产生如下变化。
按照上述生成方法,可以保证计数器的值每次都不同。由于计数器的值每次都不同,因此每个分组中将计数器进行加密所得到的密钥流也是不同的。也就是说,这种方法就是用分组密码来模拟生成随机的比特序列。
OFB 模式与CTR 模式的对比
CTR 模式和OFB 模式一样,都属于流密码。
如果我们将单个分组的加密过程拿出来,OFB 模式是将加密的输出反馈到输入,而CTR 模式则是将计数器的值用作输入。
CTR模式的特点
CTR 模式的加密和解密使用了完全相同的结构,此外,CTR 模式中可以以任意顺序对分组进行加密和解密,因此在加密和解密时需要用到的”计数器”的值可以由nonce 和分组序号直接计算出来。这一性质是OFB 模式所不具备的。
能够以任意顺序处理分组,就意味着能够实现并行计算。在支持并行计算的系统中,CTR模式的速度是非常快的。
错误与机密性
错误与机密性方面,CTR 模式也具备和OFB 模式差不多的性质。假设CTR 模式的密文分组中有一个比特被反转了,则解密后明文分组中仅有与之对应的比特会被反转,这一错误不会放大。
换言之,在CTR 模式中,主动攻击者Mallory 可以通过反转密文分组中的某些比特,引起解密后明文中的相应比特也发生反转。这一弱点和OFB 模式是相同的。
不过CTR 模式具备一个比OFB 模式要好的性质。在OFB 模式中,如果对密钥流的一个分组进行加密后其结果碰巧和加密前是相同的,那么这一分组之后的密钥流就会变成同一值的不断反复。在CTR 模式中就不存在这一问题。
应该使用哪种模式呢