这是关于密码学笔记的第四篇专栏文章。在本文中,我们将首先区分分组密码与流密码,然后重点讲解分组密码的五种主要模式。
跟诸位大牛相比,笔者阅历尚浅、经验不足,笔记中若有错误,还需继续修正与增删。欢迎大家的批评与指正。
查看上一篇请点击以下链接:【密码学笔记】第3部分 对称密码
文章目录
1. 分组密码与流密码的区别
2. 分组密码的主要模式
2.1 ECB模式(Electronic CodeBook)
2.2 CBC模式(Cipher Block Chaining)
2.3 CFB模式(Cipher FeedBack)
2.4 OFB模式(Output-FeedBack)
2.5 CTR模式(CounTeR)
3. 模式的选择
参考书目
1. 分组密码与流密码的区别
流密码是对数据流进行连续处理的一类密码算法。密钥长度与明文长度一致,加密的效率低。
分组密码是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组。分组密码解决了密钥长度与明文一致的问题。分组密码只能加密固定长度的分组,但是我们需要加密的明文长度可能超过分组密码的分组长度,此时就需要对分组密码进行迭代,以便将长明文进行加密。迭代的方法就称为分组密码的模式(mode)。
2. 分组密码的主要模式
2.1 ECB模式(Electronic CodeBook)
定义:在ECB模式中,将明文分组加密之后的结果将直接成为密文分组。
特点:使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组(一一对应),因此ECB模式也称为电子密码本模式。
攻击:攻击者只要对任意密文分组进行替换、删除或复制,相应的明文分组也会被替换、删除或复制,即攻击者无需破译密码就能够操纵明文。
2.2 CBC模式(Cipher Block Chaining)
定义:在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。
与ECB模式比较:ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(IV)。一般来说,每次加密时都会随机产生一个不同的比特序列作为初始化向量。
特点:
a. 明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即使明文分组1和2的值是相等的,密文分组的值也不一定是相等的。
b. 在加密过程中,我们无法单独对一个中间的明文分组进行加密。
c. 在解密过程中,假设有一个密文分组损坏了,只要密文分组的长度没有变化,则解密时最多只会有2个分组受到数据损坏的影响。
d. 假设密文分组中有一些比特缺失了,那么会导致密文分组的长度发生变化,此后的分组发生错位,则缺失比特的位置之后的密文分组就全部无法解密了。
攻击:如果攻击者能够对初始化向量中的任意比特进行反转,则明文分组中相应的比特也会被反转,即通过修改密文来操纵解密后的明文。但是,对密文分组也进行同样的攻击是非常困难的。
填充提示攻击是一种利用分组密码中的填充部分来进行攻击的方法,适用于所有需要进行分组填充的模式。(在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。)攻击者会反复发送一段密文,每次发送时都对填充的数据进行少许改变。由于接收者在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。防御这种攻击的方法是对密文进行认证,以确保密文是由合法的发送者在知道明文内容的前提下生成的。
应用实例:确保互联网安全的通信协议之一SSL/TLS,就是使用CBC模式来确保通信的机密性的。
CTS模式(Cipher Text Stealing)是使用最后一个分组的前一个密文分组数据进行填充的,它通常和ECB模式以及CBC模式配合使用。
2.3 CFB模式(Cipher FeedBack)
定义:在CFB模式中,前一个密文分组会被送回到密码算法的输入端(即所谓的“反馈”)。
与CBC模式比较:在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤;而在CFB模式中,明文分组和密文分组之间只有XOR。
CFB模式与CBC模式一样,也需要使用初始化向量(IV)。
与流密码比较:CFB模式的结构与一次性密码本非常相似。一次性密码本是通过将“明文”与“随机比特序列”进行XOR运算来生成“密文”的;而CFB模式则是通过将“明文分组”与“密码算法的输出”进行XOR运算来生成“密文分组”的。即CFB模式中密码算法的输出相当于一次性密码本中的随机比特序列。
CFB模式中由密码算法所生成的比特序列称为密钥流(key stream)。在CFB模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量就相当于伪随机数生成器的“种子”。
在CFB模式中,明文数据可以被逐比特加密,因此我们可以将CFB模式看作是一种使用分组密码来实现流密码的方式。
CFB模式解密时,分组密码算法依然执行加密操作,因为密钥流是通过加密操作生成的。
攻击:对CFB模式可以实施重放攻击(replay attack)。
2.4 OFB模式(Output-FeedBack)
定义:在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。在这一点上OFB模式和CFB模式非常相似。
和CBC模式、CFB模式一样,OFB模式中也需要使用初始化向量(IV)。
与CFB模式比较:
a. OFB模式和CFB模式的区别仅仅在于密码算法的输入。CFB模式中,密码算法的输入是前一个密文分组(密文反馈模式);OFB模式中,密码算法的输入则是密码算法的前一个输出(输出反馈模式)。
b. CFB模式是对密文分组进行反馈的,因此无法跳过明文分组1而先对明文分组2进行加密;OFB模式中,XOR所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,则在实际加密的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行XOR即可。因此,生成密钥流的操作和进行XOR运算的操作是可以并行的。此外,和AES等密码算法相比,XOR运算的速度是非常快的。
2.5 CTR模式(CounTeR)
定义:CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
计数器的生成方法:每次加密时都会生成一个不同的值来作为计数器的初始值。其中前8个字节为nonce,这个值在每次加密时必须都是不同的。后8个字节为分组序号,这个部分是会逐次累加的。
与OFB模式比较:CTR模式和OFB模式一样,都属于流密码。OFB模式是将加密的输出反馈到输入;而CTR模式则是将计数器的值用作输入。
特点:
a. CTR模式的加密和解密使用了完全相同的结构,因此在程序实现上比较容易。(和OFB模式一样)
b. CTR模式可以以任意顺序对分组进行加密和解密,因为计数器的值可以由nonce和分组序号直接计算出来。(OFB模式不具备)
c. 能够以任意顺序处理分组,就意味着能够实现并行计算。在支持并行计算的系统中,CTR模式的速度是非常快的。
攻击:在CTR模式中,攻击者可以通过反转密文分组中的某些比特,引起解密后明文中的相应比特也发生反转。(这一弱点和OFB模式相同)
不过CTR模式具备一个比OFB模式要好的性质。在OFB模式中,如果对密钥流的一个分组进行加密后其结果碰巧和加密前是相同的,那么这一分组之后的密钥流就会变成同一值的不断反复。在CTR模式中不存在这一问题。
GCM模式(Galois/Counter Mode)是在CTR模式的基础上增加“认证”功能的模式。这一模式能够在CTR模式生成密文的同时生成用于认证的信息,从而判断“密文是否通过合法的加密过程生成”。
3. 模式的选择
分组密码算法的选择固然很重要,但模式的选择也很重要。
参考书目
[1] 《图解密码技术》(第3版),[日]结城浩著,周自恒译,人民邮电出版社,2014年。
衷心感谢您的阅读。
查看下一篇请点击以下链接:【密码学笔记】第5部分 公钥密码