10.8 密文中隐藏密文

    在过去几年里,Alice和Bob一直是互相用密文发送消息。Eve将所有的这些消息全部收集起来,但对它们无可奈何。最后,秘密警察为这些不可读的密文烦透了,于是就把他俩抓了起来,“把密钥交出来!”,他们命令道。Alice和Bob拒绝了,但随后他们就找到了办法。他们怎样去做呢?

    加密一个文件而有两种解密方法,每一种用各自不同的密钥,这不是很好。Alice可以用他们的共享密钥加密发给Bob的真正消息,再用别的密钥加密一些无关紧要的消息。如果Alice被捕,她可以供出加密无关紧要消息的密钥,而对真正的密钥守口如瓶。

    做到这点最简单的方法是使用一次一密乱码本。假设P是明文,D是虚假明文,C是密文,K是真正的密钥,K是虚假密钥。Alice加密P:

P⊕K=C

    Alice和Bob共享密钥K,所以Bob可以解密C:

C⊕K=P

    如果秘密警察强迫他们供出密钥,他们并不会供出密钥K,而是:

K=C⊕D

    秘密警察就用它恢复出了明文——虚假明文:

C⊕K=D

    因为使用的是一次一密乱码本,且K是完全随机的,所以没有任何方法证实K不是真正密钥。为了使情况更有信服力,Alice和Bob可以编造一些轻度不犯法的虚假消息代替根本没有犯法的真正消息。一对以色列间谍曾经这样做过。

    Alice可以用她喜爱的算法和密钥K 加密P得到C。然后将C跟一些世俗的明文——譬如《傲慢与偏见》来得到K。她将C和这些异或运算储藏在她的硬盘上。现在,当安全局审讯她时,她可以解释她是一个业余的密码爱好者,K只不过是C的一次一密乱码本。安全局可能要怀疑某些东西,但除非他们已知密钥K,否则他们无法证实Alice的解释不合理。

    另一个方法是用对称算法的密钥K 对P加密,用密钥K对D进行加密。打乱密文的比特(或字节)产生最后的密文。如果安全局需要密钥,Alice就将K交出并说了打乱的比特(或字节)是为挫败密码分析而设计的随机的噪音。麻烦就出在她的解释太令人相信了,以至于安全局很可能不信她(仔细考虑一下,本书的建议)。

    对Alice来说一个更好的方法是生成一个虚假消息D,将明文P和D级联,然后压缩后使大小如同D一般。令级联为P。Alice接着用她跟Bob共享的算法加密P得到C,并将它传给Bob,Bob解密得到P,P,D。然后两人同时计算C⊕D= K。  当安全局叩开他们的门时K就变成了虚假一次一密乱码本。Alice必须把D传送出去,这样两人就伪造了现场。

    对Alice来说其它方法是利用无关紧要的消息,并通过某些纠错编码运作它。然后引入一些与秘密的加密消息有关的错误。在接收端,Bob析取出错误,恢复秘密消息并解密。Alice和Bob或许被强迫去解释为什么在无噪声的计算机网络上怎会一直有30%的错码率,但在别的环境中该方案可以实施。

    最后,Alice和Bob可以在他们的数字签名算法中使用阈下信道(参见4.2和23.3节)。该方法是检测不到的,可以很好的使用,但它有一个缺点是每个签名的无关紧要的消息只允许20左右的阈下文本字符。它并不适合传送密钥。