在他的“应用密码学”一书中,Bruce Schneier为简单的XOR加密方法提供了以下加密/解密程序:
/* Usage: crypto key input_file output_file */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
FILE *fi, *fo;
char *cp;
int c;
if ( ( cp = argv[1] ) && *cp!='\0') {
if ((fi = fopen(argv[2], "rb")) != NULL ) {
if ((fo = fopen(argv[3], "wb")) != NULL ) {
while ((c = getc(fi)) != EOF ) {
if ( !*cp ) cp = argv[1];
c ^= *(cp++);
putc(c, fo);
}
fclose(fo);
}
fclose(fi);
}
}
return 0;
}
他还提到:
这里没有真正的安全。这种加密是微不足道的 即使没有电脑也可以休息[587,1475]。它只需要几个 用电脑秒。假设明文是英文的。此外, 假设密钥长度是任何少量的字节。这是如何做到的 打破它:
- 通过计算重合[577]的过程发现密钥的长度。 XOR密文反对自身移位各种各样 字节数,并计算相等的字节数。如果 位移是密钥长度的倍数,然后超过6 字节的百分比将相等。如果不是,那么小于0.4 百分比将相等(假设随机密钥加密普通ASCII 文本;其他明文将有不同的数字)。这被称为 巧合指数。表示a的最小位移 密钥长度的倍数是密钥的长度。
- 将密文移动该长度并将其与自身进行异或。这将删除密钥,并使用明文与明文进行异或 移动了钥匙的长度。由于英语有1.3位真实 每字节信息(见第11.1节),有很多冗余 用于确定唯一的解密。
醇>
你们能提供这次攻击的真实实施吗?或者是一个实际的例子。
我尝试过提供的程序:
./simple_xor HELLO INPUT OUTPUT
INPUT文件内容为:THISISASIMPLEENGLISHTEST
OUTPUT是:
hexdump OUTPUT
0000000 1c 0d 05 1f 06 1b 04 1f 05 02 18 09 09 09 01 0f
0000010 09 05 1f 07 1c 00 1f 18 45
0000019
对密文的副本执行转换并对其进行异或运行:
./ break_key OUTPUT
Displacement[1] %=13.33 8/21
Displacement[2] %=7.14 6/21
Displacement[3] %=4.76 5/21
Displacement[4] %=2.86 4/21
Displacement[5] %=13.33 8/21
Displacement[6] %=2.86 4/21
Displacement[7] %=2.86 4/21
Displacement[8] %=10.00 7/21
Displacement[9] %=2.86 4/21
Displacement[10] %=13.33 8/21
Displacement[11] %=10.00 7/21
Displacement[12] %=4.76 5/21
Displacement[13] %=0.00 1/21
Displacement[14] %=2.86 4/21
Displacement[15] %=1.43 3/21
Displacement[16] %=0.00 1/21
Displacement[17] %=0.00 1/21
Displacement[18] %=0.00 0/21
Displacement[19] %=0.00 1/21
Displacement[20] %=0.00 0/21
请注意,密钥大小为5.但是我没有接近6%,如文中所述。