密码算法可以分为分组密码和流密码两种。

术语说明
分组密码每次只能处理特定长度的一块数据的一类密码算法。
分组每次处理的数据。
分组长度每次处理的数据分组的比特数。
流密码对数据流进行连续处理的一类密码算法。一般以1比特、8比特或32比特等为单位进行加解密。

DES、三重DES以及AES(Rijndael)等大多数对称密码算法都属于分组密码。

模式与分组

模式

分组密码算法只能加密固定长度的分组,但是需要加密的明文可能会超过分组密码的分组长度,此时就需要对分组密码算法进行迭代,以便将整个明文全部加密。

迭代的方法就称为分组密码的模式

模式说明
ECBElectronic CodeBook mode(电子密码本模式)
CBCCipher Block Chaining mode(密码分组链接模式)
CFBCipher FeedBack mode(密码反馈模式)
OFBOutput FeedBack mode(输出反馈模式)
CTRCounTeR mode(计数器模式)

分组

术语说明
明文分组分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
密文分组使用分组密码算法将明文分组加密之后所生成的密文。

ECB模式

在ECB模式中,将明文分组加密之后的结果将直接成为密文分组。

使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组。当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充。

如果存在多个相同的明文分组,则这些明文分组会被转换为相同的密文分组,会作为破译线索。

ECB模式中,只要对任意密文分组进行替换,相应的明文分组也会被替换。

CBC模式

全称Cipher Block Chaining模式,密文分组链接模式。

在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。

和ECB模式相比,CBC模式在加密之前和上个密文分组进行了一次XOR。

加密第一个明文分组时,由于不存在上一个密文分组,因此需要准备一个长度等于分组长度的比特序列来代替上一个密文分组,这个比特序列称为初始化向量IV

一般来说,每次加密时都会随机生成一个不同的比特序列作为初始化向量。

特点

在密文分组长度不变但值变化时,解密时最多只会有2个分组受到数据损坏的影响。(当前明文分组和下一个明文分组用到该密文分组,其他不受影响)

密文分组比特缺失会导致之后的密文分组全部无法解密。(因为之后的解密需要用到密文分组进行XOR)

应用

SSL/TLS就是使用CBC模式来确保通信的机密性的。

CFB模式

全称Cipher FeedBack模式,密文反馈模式。

在CFB模式中,前一个密文分组会被送回到密码算法的输入端。 反馈指的就是返回输入端。

与ECB和CBC模式不同的是,在CFB模式中,明文分组没有经过加密,而是将上一密文分组加密之后和当前明文分组进行XOR。

OFB模式

全称Output-Feedback模式,输出反馈模式。

在OFB模式中,密码算法的输出会反馈到密码算法的输入中。

OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密文算法的输出”进行XOR来产生“密文分组的”,这一点和CFB类似。

OFB模式和CFB模式的区别仅在于密码算法的输入

CFB模式中,密码算法的输入为前一个密文分组,即将密文分组反馈到密码算法中,称为“密文反馈模式”。

OFB模式中,密码算法的输入为密码算法的前一个输出,即将输出反馈给密码算法,称为“输出反馈模式”。

CFB模式中是对密文分组进行反馈的,因此必须从第一个明文分组开始按顺序进行加密;OFB模式中,XOR所需要的比特序列可以事先通过密码算法生成,和明文分组无关。

CTR模式

全称CounTeR模式,计数器模式。

CTR模式是一种通过将逐次累加的计数器进行加密生成密钥流的流密码。

CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。最终的密文分组是通过将计数器加密得到的比特序列明文分组进行XOR的结果。

计数器的生成方法

每次加密时都会生成一个不同的值(nonce)作为计数器的初始值。

当分组长度为128比特(16字节)时,计数器的初始值可能时如下形式:

这种方法可以保证计数器的值每次都不同。从而每个分组中将计数器进行加密得到的密钥流也是不同的。

OFB模式是将加密的输出反馈到输入,CTR模式则是将计数器的值用作输入。

特点

  1. 加解密使用完全相同的结构,便于实现。
  2. CTR模式中可以以任意顺序对分组进行加解密。加解密需要用到的计数器的值可以有nonce和分组序号计算出来。
  3. 能够以任意顺序处理分组,则可以实现并行运算。

总结与比较