Open chenpengcong opened 6 years ago
A XOR B的结果再与B进行XOR运算,结果会变回A,与加解密的步骤非常相似
A XOR B
异或密码是密码学中一种简单的加密算法,对于其本身来说,如果使用不断重复的密钥,容易被破解
根据这篇文章的讲解,自己用一个例子尝试了一下
假设有以下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是空格
空格
32
我们发现密文的第5个字符0x8b与其他密文的第5个字符进行异或结果都是字母
0x8b
0x8b ^ 0xcc = 0x47('G') 0x8b ^ 0xc1 = 0x4A('J') 0x8b ^ 0xce = 0x45('E')
因此我们可以认为第一个明文的第5个字符为空格,知道了明文0x20和密文0x8b,异或即可得到密钥0xab,因此每确定一个明文某个位置是空格,即可推断该位置的密钥值,密文范本越多,每个位置出现的空格的几率越大,越容易解析出密钥
0x20
0xab
A XOR B
的结果再与B进行XOR运算,结果会变回A,与加解密的步骤非常相似A XOR B
A XOR B
用密钥B进行解密,得到明文A异或密码是密码学中一种简单的加密算法,对于其本身来说,如果使用不断重复的密钥,容易被破解
根据这篇文章的讲解,自己用一个例子尝试了一下
假设有以下4长度为20个字符的明文
使用如下密钥进行异或加密
4个明文经异或加密结果如下
根据文章中提到,
空格
的ASCII码为32
,与字母X进行异或的结果依旧是字母(可能由小写变成大写或者由大写变成小写),同时,密文C1和密文C2的异或结果 = 明文P1和明文P2的异或结果,因此将密文C_i的一个字符X与剩余的密文的相同位置字符进行异或运算,如果这个字符X能够使得这些位置的字符的异或结果都是字母,那么即可以判断这个字符X是空格我们发现密文的第5个字符
0x8b
与其他密文的第5个字符进行异或结果都是字母因此我们可以认为第一个明文的第5个字符为空格,知道了明文
0x20
和密文0x8b
,异或即可得到密钥0xab
,因此每确定一个明文某个位置是空格,即可推断该位置的密钥值,密文范本越多,每个位置出现的空格的几率越大,越容易解析出密钥