考虑以下用于强制加密系统的C实现的片段,其中最值得注意的是密文的前四个字节(包含在value
中)与明文.png文件的前四个字节进行异或:
void brute_force_png()
{
FILE *file = NULL;
unsigned int value = 0;
unsigned int key = 0;
file = fopen("output", "r");
if(file == NULL)
{
printf("File cannot be opened\n");
return;
}
fread(&value, 4, 1, file);
fread(&value, 4, 1, file);
fclose(file);
key = value ^ 0x474E5089;
printf("key = 0x%x\n", key);
decrypt(key, 0);
}
我特别感兴趣的是:
key = value ^ 0x474E5089;
在强制加密的密码系统中,我们知道用明文的前四个字节(在这种情况下明文是.png文件)对密钥进行异或运算给出了密文的前四个字节。现在,根据几个在线资源,任何.png文件的“幻数”(即前四个字节)是(十六进制)0x89504E47。那么,为什么上述行不应该被替换为:
key = value ^ 0x89504E47;
这与读取文件的方式有关吗?