注意到KEY只有8位的假设,以及p xor c = k。也就是说,比较可能出现的明文和密文XOR得出的KEY,如果相等,我们便找到真正的KEY了。这种方法更加灵活,由于字符始终要被解密出来的,通过人工输入软件中出现的字符,便能解密出其他字符,记录成功解密的字符,完善自动解密的字典。下面是简单的示例代码片段:
char *map[10]= //中文字典
{
"失败",
"恭喜",
"成功",
"授权",
"支持",
"用户",
"注册",
"限制",
"功能",
"联系"
};
/*-----------------------------------------------------------------------
无key还原简单XOR字符示例
Code by 笨笨雄/www.pediy.com
------------------------------------------------------------------------*/
numread = fread (buffer,sizeof(char),150,srcfile);
bingo=false;
for (j = 0; j != numread; j++)
{
for (a = 0; a != 10; a++)
{
Slength = strlen(map[a]);
t_Byte = (*map[a]); //从字典中取字符
tKey = buffer[j] ^ t_Byte; //获得第一个KEY
counter = 1;
for (i = 1; i != Slength ; i++)
{
p_Byte = map[a] + i;
t_Byte = (*p_Byte);
ckey = buffer[j+i] ^ t_Byte;
if (ckey == tKey) //测试其他的KEY是否相同
counter++;
}
if (counter == Slength)
{
bingo=true; //相同的次数等于字符长度
break; //则认为找到KEY
}
}
if (bingo)
break;
}