问题是这样的:
给定一定数目的密文段,让你利用这些密文段来解出目标密文的原文,这里给定的密文段是满足以下条件的:
(1)原文是一段有意义的英文段落,大部分包含‘A’~'Z','a'~'z',和空格,当然还有一些标点符号;
(2)密钥是随机产生的,并且长于任一给出的密文段,而且加密方式只是简单密钥异或原文;
(3)密文和密钥的每个字符都用两个16进制的数表示,所以还是先要转化一下。
思路:
利用“空格”!,首先我们可以试验:空格 XOR 'A' = 'a',空格 XOR 'a' = 'A',所以空格 XOR 小写字母 = 大写字母,空格 XOR 大写字母 = 小写字母。然而只有这个点还不够,我们还需要一个条件:密文 XOR 密文 = 原文 XOR 原文,即:
C1 = P1 XOR K
C2 = P2 XOR K
C1 XOR C2 = (P1 XOR K) XOR (P2 XOR K) = P1 XOR P2
由于原文是一段有意义的英文文段,并且大部分由’a’~’z’,’A’~’Z’和空格组成,所以我们可以假设当密文段足够多的时候,每个位置在不同的密文段会出现对应的空格,我把密文段两两在对应的位置异或,得到原文中空格的位置,这里我的判断是否为空格的标准是:如果结果为