分组加密工作模式

由于分组密码被各种硬件所优化支持,因此其使用非常广泛。但由于分组密码要求固定长度的输入(明文需要固定长度),因此如何对过长或过短的明文进行处理,是分组加密的第一步。

填充

通常,对于最后一个分组不足的部分,填充为任意字符,并在其后增加一个分组记录填充长度

电子密码本模式(ECB)

电子密码本模式(ECB)电子密码本模式(ECB)

对于多个分组,完全不做任何处理,将明文正常分组后直接送入分组加密算法进行加密。

这是最直观的解决方案,但是存在一个很严重的问题:相同的明文会输出相同的密文,也即只能完成内容的加密,但是无法加密结构。
对于下面这种图片的加密,结果可能就是尽管无法获取正确的颜色,但是完全可以看出内容

ECB 的缺陷ECB 的缺陷

密文连接模式(CBC)

密文连接模式(CBC)密文连接模式(CBC)

与 ECB 相比,添加了一个随机的初始向量(IV)作为扰动,每次明文都需要和初始向量(或上一组密文)进行异或,而后再送入分组加密算法。

{c[i]=E(c[i1]p[i],k)p[i]=D(c[i],k)c[i1]\begin{cases} c[i] &= E(c[i-1] \oplus p[i], k)\\ p[i] &= D(c[i], k) \oplus c[i-1] \end{cases}

通过将上次的密文分组与新的明文分组异或作为加密输入从而实现了相同的明文也会得出不同的结果。
但是可以看出由于每个分组都需要用到上个分组的加密结果,因此无法并行处理。而绝大部分情况下,由于分组加密的分组大小很小,需要分成大量的分组进行加密,因此这种串行的加密方式效率极低。会导致一核工作多核围观,无法充分利用设备性能。

密文填充模式(PCBC)

填充密码块连接(PCBC)填充密码块连接(PCBC)

在 CBC 的基础上,将上一组的明文也用于异或,也即每一组的分组加密算法输入为上一组明文、上一组密文、本组明文。

看上去多了一个输入使得整个流程更为复杂,但是实际上可能会引入一些其他问题:

在解密时,如果两个相邻的密文分组交换,并不会影响结果
{c[i]=E(c[i1]p[i1]p[i],k)p[i]=D(c[i],k)p[i1]c[i1]=D(c[i],k)D(c[i1],k)p[i2]c[i2]c[i1]\begin{cases} c[i] = E(c[i-1] \oplus p[i-1] \oplus p[i], k) \\ \begin{aligned} p[i] &= D(c[i], k) \oplus p[i-1] \oplus c[i-1] \\ &= D(c[i], k) \oplus D(c[i-1], k) \oplus p[i-2] \oplus c[i-2] \oplus c[i-1] \end{aligned} \end{cases}

同时,相同的密文分组可能会导致 c[i]=E(c[i1],k)c[i] = E(c[i-1],k)

尽管在大部分情况下,可能这些问题都不会造成后果,但是在某些特殊情况下,他们可能可以为密码分析提供基础。

密文反馈模式(CFB)

密文反馈模式(CFB)密文反馈模式(CFB)

反馈模式的分组加密算法输入与本次的明文分组无关,通过加密上个分组的结果,以类似流密码的形式对当前分组明文进行加密。
其中上个分组的结果为一个移位寄存器,每次将新的结果推入寄存器,并从中取出特定的长度作为新的分组密码。
对于输入和输出长度相同的分组加密算法,则相当于直接使用上一次的结果。

在密文反馈模式中,将上一组的密文分组(或初始向量)作为分组加密算法的输入
{c[i]=p[i]E(c[i1],k)p[i]=c[i]D(c[i1],k)\begin{cases} c[i] &= p[i] \oplus E(c[i-1], k) \\ p[i] &= c[i] \oplus D(c[i-1], k) \end{cases}

输出反馈模式(OFB)

输出反馈模式(OFB)输出反馈模式(OFB)

与 CFB 类似,不同的是,采用的是上个加密算法的输出,而非上个分组密文。

计数器模式(CTR)

计数器模式(CTR)计数器模式(CTR)

通过一个伪随机数生成器作为加密算法输入。由于伪随机数与明密文分组无关,因此可以任意选择单个分组直接进行加解密,可以进行完全的并行化处理。