大多数密码算法都是将明文切成固定长度的多个块,以块为单位进行加密,而不是逐个字节地加密数据。不管什么样的密码算法,任何时候当同样的明文块从算法前端输入,同样的密文块就从后端输出。入侵者可以充分发掘这种特性来协助攻破密码系统。下面举个例子来说明。<?XML:NAMESPACE PREFIX = O />
下面这个表描述的是三个人的年终奖金额度。
<?XML:NAMESPACE PREFIX = ST1 />Alice | 8000 |
Bob | 12000 |
Trudy | 3000 |
老板授权秘书MM整理好这张表后,秘书MM将其加密,然后提交给财务部门。为了清楚地描述问题,这里假设这张表的每个字段都是64位,而且刚好秘书MM用的加密算法的加密块长度也是64位,那么加密结果可能就是像下面这个样子:
As9d8912h3a98q 9SDJKVNI | 9d89821as89982mHSLkp[anm |
09djhASDFQWER78sdfHD,zx | 0812UtWEQ23][;[]X/;;\DSKg5p |
78723G/CC;D;LFSDF/;LXPASh | /.,;ISOFIWERIIOC7kjJKJDFNSAn |
假设在秘书MM发送这段密文之前,不巧让Trudy看到了。尽管Trudy看不懂这个表的内容,但是当秘书MM抱怨就两个字段的表为什么么要定死每个字段长度为64位的时候,Trudy获得了足够的信息。她知道由于自己刚和老板吵过嘴,奖金肯定没有其它人高,于是她尝试将这些密文块的顺序调整了一下,变成下面这个样子:
As9d8912h3a98q 9SDJKVNI | 0812UtWEQ23][;[]X/;;\DSKg5p |
09djhASDFQWER78sdfHD,zx | /.,;ISOFIWERIIOC7kjJKJDFNSAn |
78723G/CC;D;LFSDF/;LXPASh | 9d89821as89982mHSLkp[anm |
仅仅是调整一下密文块的顺序,财务部解密消息的时候完全察觉不到有任何异常。尽管Trudy还是不知道奖金是多少,但是可以很有把握地相信自己的奖金会比原来高。
为了对抗这种问题,需要采取某种加密模式,需要把各个密文块关联起来,使得密文任何一处有异常更改,都会导致整个密文作废。常见的加密模式有以下这。
1) 电子密码本模式。这个不用再介绍了,就上面讲的有问题的这种模式,每块明文都对应自己的密文块,互不相干。虽然有问题,但它也是一种模式,呵呵。
2) 密码块链模式。每个纯文本块在加密前,通过按位“异或”操作与前一个块的密码文本结合。这样确保了即使纯文本包含许多相同的块,这些块中的每一个也会加密为不同的密码文本块。在加密块之前,初始化向量通过按位“异或”操作与第一个纯文本块结合。如果密码文本块中有一个位出错,相应的纯文本块也将出错。此外,后面的块中与原出错位的位置相同的位也将出错。下图是CBC加密模式示意图。
3) 密码反馈模式。将少量递增的纯文本处理成密码文本,而不是一次处理整个块。该模式使用在长度上为一个块且被分为几部分的移位寄存器。例如,如果块大小为 8 个字节,并且每次处理一个字节,则移位寄存器被分为 8 个部分。如果密码文本中有一个位出错,则一个纯文本位出错,并且移位寄存器损坏。这将导致接下来若干次递增的纯文本出错,直到出错位从移位寄存器中移出为止。CFB加密模式示意图如下。
4) 输出反馈模式。将少量递增的纯文本处理成密码文本,而不是一次处理整个块。此模式与 CFB 相似;这两种模式的唯一差别是移位寄存器的填充方式不同。如果密码文本中有一个位出错,纯文本中相应的位也将出错。但是,如果密码文本中有多余或者缺少的位,则那个位之后的纯文本都将出错。
5) 流密码模式。用一个密钥加密一个初始向量生成一个输出块,然后用同样的密钥对这个输出块进行加密以得到第二个输出块,再用同样的密钥对这个输出块进行加密得到第三个输出块,以此类推。所有这些块的序列叫做密钥流。逐块输出密钥流时,就逐块与明文异或,输出的就是密文。
6) 计数器模式。用一个密钥加密一个初始向量生成输出块,然后将初始向量加1再用同样的密钥加密输出第二个输出块,以此类推。输出的块序列也是密钥流,逐块输出密钥流时,就逐块与明文异或,输出的就是密文。
7) CTS(密码文本窃用模式)。处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。除了最后两个纯文本块外,对于所有其他块,此模式与 CBC 模式的行为相同。
文章评论(0条评论)
登录后参与讨论