9.1 电子密码本模式
电子密码本(ECB)模式是使用分组密码算法的最明显方式:一个明文分组加密成一个密文分组。因为相同的明文分组永远被加密成相同的密文分组,所以在理论上制作一个包含明文和其相对应的密文的密码本是可能的。然而,如果分组的大小是64比特,那么密码本就有264项——对预计算和储存来说太大了。记住,每一个密钥有一个不同的密码本。
这是最容易的运行模式。每个明文分组可被独立地进行加密。你不必按次序进行,你可以先加密中间10分组,然后是尾部分组,最后加密最开始的分组。这对加密随机存取的文件,如数据库,是非常重要的。如果一个数据库用ECB模式进行加密的,那么任意一个记录都可以独立于其他记录被添加、删除、或者解密——假定记录是由离散数量的加密分组组成。如果你有多重加密处理器,当然处理是并行的,那么它们就可以独立地对不同的分组进行加解密而不用相互干涉。
ECB模式所带来的问题是:如果密码分析者有很多消息的明密文,那他就可在不知道密钥的情况下编辑密码本。在许多实际情形中,消息格式趋于重复,不同的消息可能会有一些比特序列是相同的。计算机产生的消息,如电子邮件,可能有固定的结构。这些消息在很大程度上是冗余的或者有一个很长的0和空格组成的字符串。
如果密码分析者知道了明文“5e081bc5”被加密成密文“7ea593a4”,那么无论它在什么时候出现在另一段消息中,他就能立即将其解密。如果加密的消息具有一些冗余信息,那么这些信息趋向于在不同消息的同一位置出现,密码分析者可获得很多信息。然后他就可以对明文发动统计学攻击,而不去考虑密文分组的长度。
消息的开头和结尾是致命之处,因为那儿规定了消息头和消息尾,其中包含了关于发送者、接收者、日期等的信息。这个问题有时叫做格式化报头和格式化结尾。
该模式好的一面就是用同一个密钥加密多个消息时不会有危险。实际上,每一个分组可被看作是用同一个密钥加密的单独消息。密文中数据出了错,解密时,会使得相对应的整个明文分组解密错误,但它不会影响其它明文。然而,如果密文中偶尔丢失或添加一些数据位,那么整个密文序列将不能正确的解密,除非有某中帧结构能够重新排列分组的边界。
填充
大多数消息并不是刚好分成64-比特(或者任意分组长)的加密分组,它们通常在尾部有一个短分组。ECB要求是64-比特分组。处理该问题的一个方法是填充。
用一些规则的模式——0、1或者0、1交替一——把最后的分组填充成一个完整的分组。如果你想在解密后将填充位去掉,在最后一分组的最后一字节中加上填充字节的数目。例如,假定分组的大小是64比特,且最后一个分组含有3字节(24比特)。也就是说,需要填充5字节以使最后一分组达到64比特,这时就要添加4个字节的0然后再用5填充最后一个字节。解密后删除最后分组的后面5个字节就是了。因为该方法能正确工作,所以每一个消息都必须填充。即使明文以分组的边界结束,也必须添加一个整分组。然而,你可以用一个文件结束字符表示明文的最后一个字节,然后在该字符后面进行填充。
图9.1是一个可供选择的方案,称为密文挪用[402]。Pn-1是最后一个完整的明文分组,P n是最后一个短的明文分组。Cn-1是最后一个完整的密文分组,C n是最后一个短的密文分组。C′仅作为一个中间结果,并不是传输密文的一部分。
图 9.1 ECB模式中的密文挪用