9.7 同步序列密码
在同步序列密码中密钥流是独立于消息流而产生的。军方称之为密钥自动密钥(KAK)。加密端密钥流发生器一位接一位地“吐出”密钥,在解密端另一个发生器产生出完全相同的密钥。两个密钥发生器同步以后,这种一致就开始了。如果其中一个发生器跳过一个周期或者一个密文位在传输过程中丢失了,那么错误后面的每一个密文字符都不能正确解密。
如果错误不幸发生了,发方和收方就必须在继续进行之前使两个密钥发生器重新同步。他们必须这样做,以保证密钥流的任意部分不会重复,重新设置发生器回到前一个状态,这个简单的法子是不行的。
好的一面,同步密码并不扩散传输错误。如果有一位在传输中改变了,比丢失一位可能性大的多,那么只有该位不能正确解密。所有进程和结果都不会受影响。
由于在加解密两端密钥流发生器必须产生同样的输出,所以它必须是确定的。因为它是用限状态机器实现的(如计算机),密钥序列终会重复。这些密钥流发生器被称为周期性的。除一次一密乱码本外,所有密钥流发生器都是周期性的。
发生器的周期必须非常长,要比密钥更换之前发生器所能输出的位的长度还要长得多。如果其周期比明文还要短,那么明文的不同部分将用同样的加密——这是一个严重的弱点。如果密码分析者熟悉这样的一批明文,他就可以恢复出密钥流,然后恢复出更多的明文。即使分析者仅有密文,他也可以用同一密钥流加密的不同部分密文相异或得到明文跟明文的异或。这只是一个有非常长密钥的单一异或运算罢了。
周期需要多长取决于应用。用于加密连续T-1连接通信的密钥发生器每天加密237比特。那么它的周期应该比这个数大几个数量级,尽管密钥每天都要更换。如果周期足够长,你仅仅需要每周甚至每月才更换密钥。
同步序列密码同样可防止密文中的插入和删除,因为它们会使系统失去同步而立即被发现。然而,却不能避免单个位被窜改。就象CFB模式下的分组密码算法,Mallory更换数据流中的某个比特,如果他熟悉明文,他就可以使那些比特被解密成他想要的。后面的比特仍被正确的解密,所以在很多应用中Mallory仍可进行某些毁坏。
插入攻击
同步序列密码对插入攻击非常敏感[93]。Mallory作了一些密文记录,但他并不知道明文或用来加密明文的密钥流。
源明文: p1 p2 p3 p4。。。。。。
源密钥流: k1 k2 k3 k4。。。。。。
源密文: c1 c2 c3 c4。。。。。。
Mallory在明文p1后面插入一个单独的已知位p‘,他能够使修改后的明文被相同的密钥流加密。他记录下新的密文:
新明文: p1 p‘ p2 p3 p4。。。。。。
源密钥流: k1 k2 k3 k4 k5。。。。。。
更新的密文: c1 c2‘ c3’ c4‘ c5’。。。。。。
假定他知道p‘的值,他可以根据原始密文和新的密文确定整个明文:
由k2= c2‘⊕p‘得到p2= c2⊕k2
由k3= c3‘⊕p2得到p3= c3⊕k3
由k4= c4‘⊕p3得到p4= c4⊕k4
Mallory并不需要知道插入位的确切位置,他只用比较一下原始密文和更新后的密文从哪个地方不同就是了。为了防止这种攻击,永远不要使用同一个密钥流加密两个不同的消息。