学习《图解密码技术》补充密码学相关基础知识过程中所做的简单学习笔记,只记录要点,所用图例的来源均为《图解密码技术》一书。
本篇主要参考本书第四章——分组密码的模式
基础概念
对称密码
对称密码是指加密和解密时使用同一个密钥的密码算法,比如一次性密码本(异或加密)、DES、3DES、AES等,而这几种算法都属于分组密码、即明文的长度都是固定的,每次只能处理特定长度,所以实际使用时需要对消息进行分组。
分组密码与流密码
密码算法分为分组密码和流密码两种。
- 分组密码是每次只能处理特定长度地一串数据,DES和三重DES的分组长度是64比特,AES的分组长度是128比特
- 流密码是对数据流进行连续处理的一类密码算法,一般以1比特,8比特或32比特等为单位进行加密和解密。一次性密码本就属于流密码。
除了一次性密码本之外,大部分对称密码算法都属于分组密码(DES、3DES、AES…)
什么是模式
分组密码只能加密固定长度的分组,要将很长一段明文都加密的话,需要对分组密码算法进行迭代,迭代的方法就称为分组密码的“模式”。
将明文分割成多个分组并逐个加密的方法成为ECB模式,这种模式具有很大的弱点。对密码不是很了解的程序员在编写加密软件时经常会使用ECB模式,这样做会不经意间产生安全漏洞!
- ECB模式:Electronic CodeBook mode (电子密码本模式)
- CBC模式:Cipher Block Chaining mode (密文分组链接模式)
- CFB模式:Cipher FeedBack mode (密文反馈模式)
- OFB模式:Output FeedBack mode (输出反馈模式)
- CTR模式:CounTeR mode (计数器模式)
密文分组与明文分组
明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。
ECB模式
ECB模式中,明文分组与密文分组是一一对应的关系。如果明文中存在多个相同的明文分组,则这些明文分组最终都会转换成相同的密文分组,攻击者可以用这个作为线索来破译密码,存在一定的风险。
另外,如果存在主动攻击者,能够改变密文分组的顺序,也会存在一些攻击场景,在这些场景中,主动攻击者不需要破译密码,也能够操纵明文,他只要知道哪个分组记录了什么样的数据(即电文的格式)就可以了。
例如下面的例子,攻击者不需要破译密码,只需要将密文分组2和密文分组1对调顺序,银行转账系统对密文信息解密后,就会将付款人和收款人的银行账号对调,转账结果也会完全相反!
又例如下面的例子
攻击者只需要将口令文件中的密文分组2、4、6,用密文分组1、3、5去替换掉,就可以将所有用户的密码都篡改成用户名称了。而一般来说,用户名远比密码要用意猜测,这样看来,这个系统的安全性是极低的。
CBC模式
在CBC模式中,首先将明文分组和前一个密文分组进行XOR运算,然后再进行加密,就像链条一样,所以叫密文链接模式。
CBC模式与ECB模式的差异:
CFB模式
CFB模式(密文反馈模式)中,先将前一个密文分组加密,然后再与明文分组XOR运算,得到密文分组。意思是说,前一个密文分组会被送到密码算法的输入端,所谓“反馈”,这里指的就是返回输加密算法入端的意思。
CFB模式与CBC模式的差异:
OFB模式
在OFB模式(输出反馈模式)中,密码算法的输出会反馈到密码算法的输入中,由此得名“输出反馈模式”。
和CFB模式非常相似,OFB模式并没有直接用加密算法对明文加密,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的,在这一点上OFB模式和CFB模式非常相似。
OFB模式与CFB模式的区别仅仅在于密码算法的输入。
CFB模式中,密码算法的输入是前一个密文分组;而OFB模式中,密码算法的输入则是密码算法的前一个输出。
OFB模式与CFB模式的差异如下图所示
CTR模式
CTR模式全称为CounTeR mode(计数器模式)它的结构和OFB模式非常相似,区别在于加密算法的输入。
CTF模式中,每个分组对应一个逐次累加的计数器,并通过将此计数器输入加密算法,得到一个比特流,明文分组与此比特流进行XOR运算得到密文分组:
每次加密时都会产生一个不同的值(nonce)来作为计数器的初始值。当分组长度为128比特(16字节)时,计数器的初始值可能像下面这样:
其中,前面的nonce就是每次加密时都必须不同的值。而后面的分组序号会逐次累加,如下:
由于计数器的值对于每个分组来说都是不同的,因此加密运算后得出的用于XOR运算的密钥流也是不同的,相当于是用分组密码来模拟生成随机的比特序列。
CTR模式和OFB模式一样,都属于流密码(明文分组通过XOR运算得到密文分组)。OFB模式是将加密的输出反馈到输入,而CTR模式则是将计数器的值用作输入。
不过CTR模式也具备一个比OFB模式要好的性质。在OFB模式中,如果对密钥流的一个分组进行加密后其结果碰巧和加密前一样,那么这一分组之后产生的密钥流就会变成同一值的不断反复。在CTR模式中就不存在这一问题。
初始化向量
在CBC、CFB、OFB模式中存在一个初始化向量,这个初始化向量每次加密时必须使用一个随机的值。
这是因为如果使用固定的初始化向量的话,每次加密中相同的明文分组会对应相同的密文分组。
例如在CBC模式中,假设永远使用相同的初始化向量,密码破译者一周内收到了两份相同的密文。于是,密码破译者无需破译密码,就可以判断出:这份密文和上周的密文一样,因此两份密文解密所得的明文也是一样的。
如果在每次加密时都改变初始化向量的值,那么即便是使用同一密钥对同一明文进行加密,也可以确保每次所得到的密文都不同。