一次填充密码
从我们对完全保密的讨论,可以得出一个重要结论:完全保密是可以实现的,但对于存在大量潜在信息的系统,我们需要付出很高的代价对潜在的大量密钥进行管理。一次填充密码是完全保密的密码系统的经典例子。假设信息是一段舍去了所有标点与空格的英文文本,它包含n个字母,那么密钥就是从字母表中随机生成的n个字母的序列,每个密钥仅使用一次以保护单个信息。加密规则就是在维热纳尔密码中使用的那种,但要用密钥替代后者的密钥词。如果我们按惯例将A到Z的字母依次和0到25的数字相联系,信息记为m1、m2、……、mn,密钥记为k1、k2、……、kn,则密文中第i个分量记为:
ci=(mi+ki)mod 26
注意,此时密钥与信息具有相同的长度,这保证了在加密过程中我们不需要重复密钥。
这个算法有另一种很常见的版本,常被称为维南密码,其中所用的字母表是二元的,即只有0和1,密文是信息与密钥两者相加模2所得。毫无疑问,维南密码是一次填充密码在数字通信中使用的版本。
由于完全保密是可实现的,谁都不免要问:为什么它没有得到广泛的应用,为什么人们要用那些可能被破译的密码系统。在提示这类问题该如何回答之前,很重要的一点是要记住储存数据的加密与保护通讯的加密并不是一回事。同样重要的是,我们通常集中关注通讯方面,因为其中会涉及更多管理方面的问题。
在定义一次填充密码时,我们只列出了加密算法和加密密钥。解密密钥与加密密钥相同,但解密算法要求从密文中减去密钥字母从而得到明文。通讯系统的工程师们现在面临着一个可能很困难的问题。如何让对方得到这个随机序列?因为这个序列是随机生成的,发信人与收信人“不可能”同时生成同样的密钥。于是他们中的一方必须首先生成一个密钥,然后将其(秘密地)发送给另一方。这时,想要保证密钥的秘密不被泄露,在发送时需要对它加以保护。如果通信者之间只有一条通信链路可用,那他们就需要再使用一个一次填充随机序列去保护这第一个序列。很清楚,这种推理将导致一个不可企及的要求,即要有无穷多的随机序列,其中每一个都用来保护前一个序列从发送方到接收方之间通信的安全。于是,使用一次填充密码的条件是通信者必须有第二种交流信息的安全手段。读者一定记得,完全保密系统的例子中所讲到的X先生和他的经纪人之间就有这样一条信道。一般认为,一次填充密码只用于最高层次的安全链路,例如莫斯科–华盛顿热线。在这种情形下,所生成并储存起来的随机序列是通过安全信使送达另一方的。然后随机序列能被储存在受到高度保护的地方,需要时产生,用完后立即销毁。必须认识到,这第二条安全信道既缓慢又昂贵,它不可能用于发送信息,因为此时人们可能需要对方立刻作出回答和反应。
我们已经提到过,在一个安全网络中,密钥配送是个疑难问题,它不仅限于一次填充密码。对第二条安全信道的要求也是很常见的。区别在于,一次填充密码的第二条信道所承载的传输量与信息传输量是相当的,但通常情况下第二信道承载的传输量要少得多。即使有第二条安全链路,一次填充密码仍然不适合包含很多网点的系统,因为每个网点都需要有与其他所有网点关联的安全链路。此时的疑难之点似乎在于掌握已使用过的密钥的信息,也许还涉及对大量密钥资料的管理。完全保密依赖于每个密钥只使用一次。对于一个庞大而频繁使用的网络而言,要管理好它所需要的全部密钥资源几乎是不可能的。
毫不奇怪,虽然一次填充密码展示了一种终极的安全水平,但几乎没有实际的通信网络系统使用。当然,如果有人只因私人之需加密文件并储存起来,那么他们不需要配送任何密钥。在很多储存方案中,唯一的难点就是密钥的存储,因此对于其中的某些方案来说,一次填充密码像其他任何密码一样可行。