大家好~我是贾正经,又到了干货满满的技术分享趴啦~
上期我们讲解了对称加密算法的小知识,并介绍了国密算法中SM4算法的原理。
本期带大家了解一下分组密码的五个模式。
分组密码的模式
首先了解一下,什么是分组密码?
对称加密又分为分组密码和流密码:
流密码(Stream Cyphers),也称序列密码,一次加密明文中的一个位,是将明文按字符(具体是按二进制位)逐位地加密的一种密码学算法。
分组密码,也叫块加密(Block Cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算)还原成明文组。
分组密码只能加密固定长度的分组,实际的明文可能远超过密码分组的长度,因此需要对分组密码算法进行迭代,才能将明文全部加密,而迭代的方法就是分组密码的加密模式。
分组密码的主要模式有以下五种:
ECB模式:Electronic CodeBook mode(电子密码本模式)
CBC模式:Cipher Block Chaining mode(密文分组链接模式)
CFB模式:Cipher FeedBack mode(密文反馈模式)
OFB模式:Output FeedBack mode(输出反馈模式)
CTR模式:CounTeR mode(计数器模式)
其中,CFB、OFB、CTR三种模式属于流密码。
ECB模式
ECB模式是一种基础的加密方式,密文被切割成分组长度相等的块,然后单独一个个加密,一个个输出组成密文。我们可以将其理解为是一个巨大的“明文分组->密文分组”的对应表(如下图所示),因此ECB模式也称为电子密码本模式。
ECB模式的工作原理
当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充。
ECB模式的优点表现为:简单、快速,支持并行计算器(加解密),而且单一密文损坏的话,不会影响到其他块的解密。
同时,ECB模式的缺点也较为明显:因为明文分组与密文分组是一一对应的关系,因此,如果明文中存在多个重复的明文分组,则这些明文分组最终都将被转换成相同的密文分组。
如此一来,攻击者就可以获悉明文存在怎么样的组合,并可以此为线索来破译密码,此外,通过密文还可以操纵明文(进行删除、替换),不能抵御重放攻击。因此ECB模式是存在一定风险的。
CBC模式
CBC模式,是先将明文分组切成若干个组,然后每个组与前一密文(或初始化向量)进行XOR(异或运算)后进行加密,密文分组像链条(Chain)一样互相连接在一起,因此称为密文分组链接模式。
与ECB模式相比,ECB模式只进行了加密,而CBC模式在加密之前先进行了一次异或运算。
因为这个特点,即使明文分组1和明文分组2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了,安全性高了许多。
在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。
CBC模式的加密过程
CBC模式的解密过程
假设CBC模式加密的密文分组中有一个分组损坏了,在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只有2个分组受到数据损坏的影响。见下图:
CBC模式的损坏解密过程
假设CBC模式的密文分组中有一个比特缺失了,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密。见下图:
CBC模式比特缺失解密过程
此外,CBC模式不能并行处理,且同样不能抵御重放攻击。
CFB模式
在CFB模式中,前一个密码分组会被送回到密码算法输入端。在ECB和CBC模式中,明文都是通过密码算法进行加密的,而在CFB模式中,没有通过密码算法直接进行加密。
CFB模式中由密码算法产生的序列成为密钥流,可将CFB看成使用分组密码实现流密码的一种方式。
CFB模式的加密过程
我们将CBC模式和CFB模式对比一下,就可以看出其中的差异了:在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间只有XOR。
CBC模式与CFB模式对比
CFB模式的重放攻击
OFB模式
在OFB模式中,密码算法的输出会反馈到密码算法的输入中。OFB模式不是通过密码算法对明文直接进行加密的,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组,这点与CFB模式非常相似。
OFB模式的加密过程
这个模式优点在于:无需进行填充(因为是流密码),可以抵御重放攻击,而且加解密的结构相同,且可事先生成密钥流。
但如果对密钥流的一个分组加密后,如果其结果和加密前一分组相同,之后的密钥流将变成同一值的不断反复。
CTR模式
CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
CTR模式的加密过程
CTR模式与OFB模式一样,无需填充,可抵御重放攻击。此外,CTR模式的单一密文损坏并不会影响到其他块的解密,且支持并行运算(加解密),不会有密钥流重复循环出现的情况。
缺点则是需要提供初始计数器值。