流密码-密码术的奥秘

时间:2024-07-01 20:08:01

流密码

不同的作者在使用流密码这个术语时含义略有不同。很多人谈论的是以词或以符号为基础的流密码。此时的信息是逐词(或逐符号)进行加密的,其中每个词(或符号)的加密规则由它在信息中的位置决定。第三章讨论的维热纳尔密码和一次填充密码都符合这个定义。也许历史上最有名的例子是著名的谜密码。但是在现代,人们通常使用流密码这个术语来指对明文逐比特进行加密的密码,本文也采用这一说法。很明显,对任一特定的比特来说可能发生的情况只有两种,或者是它的值变为另一个值,或者是它的值保持不变。因为一个比特只能取两个值中的一个,改变一个比特就意味着用另一个值替换它原来的值。进而,当一个比特改变两次时,它就变回了原来的值。

流密码-密码术的奥秘

如果一个攻击者知道通信者使用的是流密码,那么他们的任务就是努力鉴别出哪些位置上的比特改变了,并将它改回原来的值。如果存在易被察觉的、可用来鉴别出那些变化了的比特的模式,那么攻击者的任务就变得简单了。所以,变化了的比特的位置不能让攻击者预测出来,但又必须能让真正的接收者容易识别。

对于流密码,我们可以将它的加密过程看作是两种运算——即变化和保持不变——构成的序列。这个序列由加密密钥决定,通常称为密钥流序列。为简明起见,我们可以认为写0意味着“保持不变”,而1意味着“变化”。现在我们处于这样的环境之下:明文、密文和密钥流全是二进制序列。

为了澄清我们的描述,假定明文是1100101,密钥流为1000110。那么,因为密钥流中的1意味着改变相应位置上明文的比特,所以我们知道明文最左边位置上的1必须改变,而下一个比特则保持不变。重复这种论证,我们便得到密文为0100011。前文中我们已经提到,一个比特改变两次的效果是变回原来的值。这就是说,解密过程与加密过程是一样的,所以密钥流也决定了解密过程。

上面我们所讨论的过程无非是将两个二进制序列“结合”生成第三个二进制序列,在我们这个特定的例子中,它所依据的结合规则即为:“如果第二个序列在某个位置是1,则改变第一个序列在该位置上的比特”。这恰恰是我们在上一节定义的XOR或⊕运算。因此,设Pi、Ki和Ci分别代表明文、密钥流和密文中第i个位置上的比特,则密文中的比特Ci可由公式Ci=Pi⊕Ki得出。注意,解密由Pi=Ci⊕Ki所定义。

本质上,流密码就是小密钥的维南密码的一个实用的改写版本。一次填充密码存在的问题是,因为密钥流是随机生成的,发送方与接收方不可能同时生成同样的密钥流。于是需要第二条安全通道来配送这个随机密钥,这条通道与通信通道一样繁忙。流密码同样要求一个安全的密钥通道,但其通信量比一次填充密码小很多。

流密码可以用一个短密钥来生成一个长密钥流。这是利用二进制序列的生成程序实现的。注意,在第三章讨论维热纳尔密码时,我们介绍了利用生成程序从一个短字母密钥产生一个长字母密钥流的概念。但在那个例子中,生成过程很粗糙,因为它只取一个密钥词并加以重复。在实用的流密码中,密钥流的生成程序要复杂得多。上面我们之所以关注密钥流中处于位置i上的比特,是因为Ki=Pi⊕Ci可以由明文与密文中处于位置i上的比特经XOR运算来确定。它突显了流密码的一个潜在弱点:任何有能力进行已知明文攻击的人,都能够从明文与密文相对应的比特中推论出部分密钥流。于是,流密码使用者必须防止攻击者能推论出部分密钥流的攻击。换句话说,密钥流序列必须在下述意义下是无法预测的:攻击者不能根据已知的部分密钥流推论出该密钥流的其余部分。例如,一个密钥长度仅为4的维热纳尔密码,通过每隔4个字母重复而产生一个密钥流。然而,在设计密钥流的生成程序时,对于一个适当选取的4比特的密钥而言,可以使其每15个比特重复一次。为了做到这一点,我们从任一长度为4的密钥开始,但0000除外。那么,一个生成过程是这样的:序列中的每个比特由它前面的4个比特中的第一个与最后一个作XOR运算而得。如果我们从1111开始,这个序列便是111101011001000,然后再不断地重复这个序列。事实上,可以直接从一个长度为n的密钥产生出一个直到第2n-1个比特才开始重复的密钥流。

设计一个出色的密钥流生成程序是很困难的,要求用到一些高等数学知识。此外,需要严密的统计检验,以确保生成程序导出的结果尽可能地像一个真的随机序列。尽管如此,流密码在若干应用领域中仍是最适用的密码类型。一个理由是,若接收的密文错了一个比特,则解密时也只有一个比特是错的,因为每个明文比特仅由一个密文比特确定。对于分组密码,情况就不同了,如果接收的密文错了一个比特,则会导致整个区组的解密失真。当密文在一个嘈杂的信道中传送时,解密算法必须能消除这类“出错传播”;因此,人们用流密码对数字化语音进行加密,诸如在GSM移动电话网络中那样。流密码优于分组密码的另一些特点是操作速度快而且简单。