8.2 非线性密钥空间

    假设你是一个军事密码组织,为你的手下制造了一批加密设备。你想使用一个安全的算法,但又怕这些设备落入敌手。最后你想做的就是你的敌人能够用这些设备保护他们的秘密。

    如果你能将你的算法加入到一个防窜改模块中,下面就是你能做的。你可以要求有特殊保密形式的密钥,而其它的密钥都会引起模块用非常弱的算法加解密。你这样做可以使那些不知道这个特殊形式的人偶然碰到正确密钥的机会几乎为零。

    这就是所谓的非线性密钥空间,因为所有密钥的强壮程度并不相等。(与之相对应的是线性或平坦密钥空间。)一个很简单的方法可以做到非线性密钥空间,就是按照两部分来生成密钥:密钥本身和用该密钥加密的某个固定字符串。模块用这个密钥对字符串进行解密;如果它收到那个固定的字符串它就很正常地解密,否则就用另一个非常弱的算法进行。如果该算法有一个128-比特的密钥和一个64-比特的字符块,也就是总密钥长度为192比特,那么共有有效密钥2128个,但是随机选择一个好密钥的机会却成了1/264

    你甚至更巧妙,可以设计一种算法使某些密钥比别的密钥更好。一个没有弱密钥,至少是没有很明显弱密钥的算法仍然可以有非线性密钥空间。

    使用非线性密钥空间仅当在算法是安全的,并且敌人不能对其进行反控制,或者密钥强度的差异是足够细微,以至于敌人不能计算出来时才可行。美国国家安全局对Overtake模块中的安全算法进行非线性密钥空间的使用(参见25.1节)。他们会不会对Skipjack 算法(见13.12节)做同样的事情呢?没人知道。