分组密码的模式
密码算法分为分组密码和流密码两种。
- 分组密码
分组密码是每次只能处理特定长度的一块数据的一类密码算法,“一块”指的就是分组,一个数组的比特数就称为分组长度。
例如:DES和三重DES的分组长度都是64比特,这些密码算法一次只能加密64比特的铭文,并生成64比特的密文。 - 分组密码的类型
ECB模式:Electronic CodeBook mode(电子密码本模式)
CBC模式:Cipher Block Chaining mode(密码分组链接模式)
CFB模式:Cipher FeedBack mode(密文反馈模式)
OFB模式:Output FeedBack mode(输出反馈模式)
CTR模式:CountTeR mode(计数器模式) - 流密码
流密码是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、8比特或32比特等为单位进行加密和解密。
分组密码处理完一个分组就结束了,因此不需要通过内部状态阿里记录加密的进度;相对的,流密码是对遗传数据流进行连续处理,因此需要保持内部状态。 - 模式
分局密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的铭文全部加密。而迭代的方法就称为分组密码的模式 - 明文分组
明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的 - 密文分组
密文分组是指使用分组密码算法将明文分组加密之后所产生的密文
ECB模式
- 什么是ECB模式
ECB模式的全称是Electronic CodeBook。在ECB模式中,将明文分组加密之后的结果将直接成为密文分组。在使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,可以理解为一个巨大的“明文分组->密文分组”的对应表,因此ECB模式也成为电子密码本模式。当最后一个明文分组的内容小于分组长度是,需要用一些特定的数据进行填充。 - ECB模式特点
在ECB模式中,明文分组与密文分组是一一对应的关系,因此通过观察相同的明文分组就能破译。 - 对ECB模式的攻击
有两种攻击方法。其一通过大量观察相同的密文分组即可推断出对应的明文;其二交换密文分组顺序,再传递到收信人手中,这样收信人会得到错误的信息,对交易造成破坏。
CBC模式
- 什么是CBC模式
CBC模式的全称是Cipher Block Chaining模式,因为密文分组是像链条一样相互连接到一起。在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。 - CBC和ECB的区别
ECB模式之进行了加密,儿CBC模式则在加密之前进行了一次XOR - 初始化向量
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来替代“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector)s缩写为IV - CBC模式的特点
CBC的加密过程是按顺序的,无法单独对中间的一个分组进行加密;再看解密过程,假设某个分组损坏,这时若密文分组的长度没有发生变化,则解密时最多会有2个分组受到数据损坏的影响。这将导致缺失的比特位置之后的密文分组都将无法解密。 - 对CBC模式的攻击
假设主动攻击者的目的是通过修改密文来操作解密后的明文。如果攻击者能够对初始化向量中的任意比特进行反转(1,0互换),则明文分组(解密后得到的明文分组)中相应的比特也会背反转。因为在CBC模式的解密过程中,第一个明文分组回合初始化向量进行XOR运算。 - 填充提示攻击
填充提示攻击是一种利用分组密码中的填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充的数据进行少许改变,由于接收者(服务器)在无法正确解密时会返回一个错误信息,攻击者通过这一错误信息就可以获得一部分与明文相关的信息。
这一攻击不仅限于CBC模式,而是适用于所有需要进行分组填充的模式。防御这种攻击,需要对密文进行认证,确保这段密文的却是由合法的发送者在知道明文内容的前提下生成的。 - 对初始化向量(IV)进行攻击
初始化向量必须使用不可预测的随机数,不够安全的随机源生成容易被碰撞。
CTS模式
- CTS模式
在分组密码中,当明文长度不能被分组长度整除时,最后一个分组就需要进行填充。CTS模式是使用最后一个分组的前一个密文分组整除时,最后一个分组的前一个密文分组数据来进行填充的,它通常和ECB模式以及CBC模式配合使用。根据最后一个分组的发顺序不同,CTS模式有几种不同的变体(CBC-CS1、CBC-CS2、CBC-CS3)
CFB模式
- 什么是CFB模式
CFB模式的全称是Cipher FeedBack模式(密文反馈模式)。在CBF模式中,前一个密文分组会被送回到密码算法的输入端,反馈即指返回输入端。
在ECB模式和CBC模式中,明文分组都是通过密码算法进行加密的,然而在CFB模式中,明文分组并没有通过密码算法来进行加密。
将CBC模式与CFB模式相对比,就能看出。在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间则只有XOR。 - 初始化向量
在生成第一个密文分组时,由于不存在前一个输出的数据,因此需要使用初始化向量(IV)来替代,这一点和CBC模式是相同的。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量 - CFB模式与流密码
在CFB模式中,密码算法的输出相当于一次性密码本中的随机比特序列。由于密码算法的输出是通过计算得到的,并不是真正的随机数,因此CFB模式不可能像一次性密码本那样具备理论上不可破译的性质。
CFB模式中由密码算法所生成的比特序列称为密钥流。在CFB模式中,密码算法就相当于用来生成密钥流的为随机数生成器,而初始化向量就相当于伪随机数生成器的“种子”。
在CFB模式中,明文数据可以被逐比特加密,因此可以将CFB模式看作是一种使用分组密码来实现流密码的方式。 - 对CFB模式的攻击
可以采用重放攻击,即将以传输过的信息放入到新的传输过程中,这样接收者收到的信息就会出现错误,导致该次通信失败。
OFB模式
- 什么事OFB模式
OFB模式的全称是Output-Feedback模式*输出反馈模式)。在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
OFB模式并不是通过密码算法对明文进行直接加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的,在这一点上OFB模式和CFB模式相似 - 初始化向量
heCBC模式、CFB模式一样,OFB模式中也需要使用初始化向量(IV)。一般来说,需要在每次加密时生成一个不同的随机比特序列用作初始化向量 - CFB模式与OFB模式比较
OFB模式和CFB模式的区别仅仅在于密码算法的输入中。CFB模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,故得名密文反馈模式。
相对的,OFB模式中,密码算法的输入则是密码算法的前一个输出,也就是将输出反馈给密码算法,故得名输出反馈模式。
CFB无法跳过明文分组1而先对明文分组2进行加密;而OFB模式则可以生成密钥流和XOR运算并行操作。
CTR模式
- 什么是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模式的密文分组中有一个比特被反转,则解密后明文分组中仅有与之对应的比特会被反转,这一错误不会放大。但是在OFB模式中,如果对密钥流的一个分组进行加密后其结果碰巧和加密前是相同的,那么这一分组之后的密钥流就会变成同一值的不断反复。在CTR模式中就不存在这一问题。 - GMC模式
在CTR模式的基础上增加“模式”称为GMC模式这一模式能够在CTR模式生成密文的同时生成用于认证的信息,从而判断“密文是否通过合法的加密过程生成”。通过这一机制,即便主动攻击者发送伪造的密文,我们也能够识别出这段秘闻的伪造的。