chenpengcong / blog

14 stars 3 forks source link

异或密码的破译 #8

Open chenpengcong opened 6 years ago

chenpengcong commented 6 years ago

A XOR B的结果再与B进行XOR运算,结果会变回A,与加解密的步骤非常相似

异或密码是密码学中一种简单的加密算法,对于其本身来说,如果使用不断重复的密钥,容易被破解

根据这篇文章的讲解,自己用一个例子尝试了一下

假设有以下4长度为20个字符的明文

unsigned char str_arr[4][21] = {
    "daso gfi haoigha hgu", 
    "ad sgfjag ijagihjg i", 
    "asdfj ia gpj iapghpg", 
    "i rjegpha egr eahgup"
};

使用如下密钥进行异或加密

unsigned char key[20] = {0x01, 0x02, 0x03, 0x15, 0xAB, 0xcc, 0x11, 0x66, 0x84, 0xcd, 0xc1, 0x22, 0xd3, 0xef, 0xA1, 0x9c, 0x1a, 0x96, 0x85, 0xee};

4个明文经异或加密结果如下

0x65,0x63,0x70,0x7a,0x8b,0xab,0x77,0x0f,0xa4,0xa5,0xa0,0x4d,0xba,0x88,0xc9,0xfd,0x3a,0xfe,0xe2,0x9b
0x60,0x66,0x23,0x66,0xcc,0xaa,0x7b,0x07,0xe3,0xed,0xa8,0x48,0xb2,0x88,0xc8,0xf4,0x70,0xf1,0xa5,0x87
0x60,0x71,0x67,0x73,0xc1,0xec,0x78,0x07,0xa4,0xaa,0xb1,0x48,0xf3,0x86,0xc0,0xec,0x7d,0xfe,0xf5,0x89
0x68,0x22,0x71,0x7f,0xce,0xab,0x61,0x0e,0xe5,0xed,0xa4,0x45,0xa1,0xcf,0xc4,0xfd,0x72,0xf1,0xf0,0x9e

根据文章中提到,空格的ASCII码为32,与字母X进行异或的结果依旧是字母(可能由小写变成大写或者由大写变成小写),同时,密文C1和密文C2的异或结果 = 明文P1和明文P2的异或结果,因此将密文C_i的一个字符X与剩余的密文的相同位置字符进行异或运算,如果这个字符X能够使得这些位置的字符的异或结果都是字母,那么即可以判断这个字符X是空格

我们发现密文的第5个字符0x8b与其他密文的第5个字符进行异或结果都是字母

0x8b ^ 0xcc = 0x47('G')
0x8b ^ 0xc1 = 0x4A('J')
0x8b ^ 0xce = 0x45('E')

因此我们可以认为第一个明文的第5个字符为空格,知道了明文0x20和密文0x8b,异或即可得到密钥0xab,因此每确定一个明文某个位置是空格,即可推断该位置的密钥值,密文范本越多,每个位置出现的空格的几率越大,越容易解析出密钥