分组加密算法把数据分成固定长度的分组处理,算法的输入长度为一个分组的长度。为了改善安全性,适应不同的应用环境,分组加密有多种不同的工作模式。最常见的四种工作模式是:ECB,CBC,CFB,OFB。
ECB模式是最简单的基本模式。在密钥的控制下,把一个分组长度的输入,转换为一个分组长度的输出。一个分组算法设计出来就是ECB模式的。这一模式用于实际应用加密的问题是,容易遭受字典攻击。ECB模式下,只要密钥确定了,相同明文一定输出相同密文。这一特性如同谍战片里的替换密码本,一字对一字。这就是ECB模式这一名称的来源,Electronic Code Book,一个电子密码本。每一种一种明文密文的对应关系,也唯一确定了密钥。由于明文往往存在固定的格式部分,这些固定输入对应的输出的变化仅为密钥的变化所导致。这大大降低了敌方分析密钥的难度,敌方可以预先把这些固定输入以不同密钥加密的密文制成字典,通过查阅字典,使得逆推密钥成为可能。传统的替换密码本会被词频统计方式攻击,ECB模式同样易于被类似的方式攻击。即使不知道密钥,在输入变化种类较少时,敌方只需一次获取这些明文与密文的对应关系,只要密钥未更换,敌方就能够在后续的通信中,持续获得密文对应的明文。
ECB模式加密是很直接的,将明文按照算法规定的分组长度分组并填充(padding),逐个分组分别加密即可。
ECB模式示意图
图片来自http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
为了阻止相同的用户明文在密钥不变时输出不变的密文,我们使用一个随机组成的分组作为扰码与第一个明文分组异或,扰乱明文的内在的一些固定结构和冗余,再加密这样扰乱过的分组,分组加密的输出密文分组既是加密结果的一部分,又是下一个分组加密的扰码。最初的那个随机数组成的分组称为初始向量,一般用符号IV表示。前一分组输出与下一个分组输入之间的链接关系使得IV的随机性扩散到整个输出密文之中。IV一般会随着密文一同保存和发送。解密时,逆向使用IV,即可恢复所有明文分组。随机IV的存在,使得相同明文相同密钥在不会输出相同的密文,增加了根据密文分析推测密钥和明文的难度。CBC模式的缺点之一是分组的前后链接关系使得加密难以实现并行处理。
CBC模式示意图
图片来自http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
ECB和CBC模式下,分组密码会把任意长度明文填充到分组长度的整数倍,然后这个分组处理。在流媒体的加密处理中,这是一个问题,信道往往不会去适应分组处理带来的长度变化。CFB和OFB模式可以用来把分组密码转换成一个流密码,加密可以做到不改变数据的长度。CFB使用密文反馈,能够支持任意长度数据的等长加密。但是密文反馈使得密文的误码会扩散。
CFB模式示意图
图片来自http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
OFB模式看起来像一个真正的流密码。OFB的输出反馈机制使得主要的密码运算只需密钥确定了就可以进行,发方无需等待明文就绪,收方也无需等待密文收到。OFB模式下,分组密码具备流密码的使用特性,明密文长度一致,传输误码不会扩散。与真正的流密码算法对比,分组密码的OFB模式及CFB模式存在着运算效率降低,输出流周期难以确定的问题。
OFB模式示意图
图片来自http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
以上是几种最常见的分组加密工作模式,ECB是一个分组算法的基本模式,其他模式都是在ECB的基础上,引入各种链接、反馈等扩展处理流程所得。通过这些流程的不同组合,当然还能形成更多的工作模式。这些不同的工作模式,有些是为了增强安全性,有些是为了适应不同的加密应用环境。成熟的加密软件包均会支持这几种常用模式。作为加密应用开发者,如果基于这些加密软件包开发,需要关注的只是结合应用需要,选择合适的工作模式。一些加密硬件逻辑往往只会提供基本的ECB模式分组加密。这时,开发者需要按照应用的选择,将ECB模式的基本组件包装成需要的其他工作模式。