找到密钥长度

时间:2015-05-12 02:36:05

标签: c xor

简单XOR解密:

为了打破这种加密,我们必须做出一些假设:

1)密钥相当短(在我们的例子中,我们假设它小于30个字节但更大 超过3个字节)

2)文本是纯ASCII

3)文字写成简单的英文

4)文本比密钥长得多(或者有多个文本段落都使用相同的密钥加密)

密钥长度说明:

如果文字是英文,我们知道最流行的字符是e,t,a,o,n,r,i,s,h,d,(...)。更具体地说,如果我们从任何文本中随机选取2个字符,我们就知道我们有超过6%的可能性它们具有相同的值。密钥长度小于30个字节。

为了确定给定的密钥长度是否正确,我们使用这些假设并将加密的文本细分为与密钥长度相同的段。然后,将每个部分与前面的部分进行异或,并计算相等值的数量。数学向我们展示了如果Ti == Tj,那么

Bi^Bj = (Ti^Kn)^(Tj^Kn)
      = (Ti^Tj)^(Kn^Kn)
      = (0)^(0)
      = 0

然后我应该有密钥长度。但是我怎么能得到它?到目前为止,我只读取二进制文件并打开二进制文件。

代码:

int main(int argc, char* argv[]){
    if (argc != 2) {
        exit(EXIT_FAILURE);
    }
    FILE* fp = fopen(argv[1], "rb");

    printf("File Opened: %s\n", argv[1]);               
    fclose(fp);
    return EXIT_SUCCESS;
}

二进制文件:

http://i.stack.imgur.com/0DNTo.png

出于某种原因,我无法发布文件或发布链接,否则你们可能没有想法。

1 个答案:

答案 0 :(得分:0)

我假设您有一些针对某些密钥的数据。密钥具有固定的大小,并且一遍又一遍地重复到数据的长度。

设K为长度为k的密钥,让P为带纯文本的数组,E为带有密文的数组,然后

P[0: k-1] xor K = E[0: k-1]
P[k:2l-1] xor K = E[k:2k-1]

所以E[0: k-1] xor E[k:2k-1]P[0: k-1] xor P[k:2k-1]相同,也就是说,它是两个纯文本字符串的xor。您可以根据您希望在纯文本中出现某些字母的频率来计算这些值的频率,并根据这些频率对替换进行猜测。

构建对P[0: k-1]的纯文本值的猜测,然后根据E[0: k-1]对此猜测进行测量将猜测K.尝试使用密钥并进行迭代,从而提高您的猜测。因为这是英语,一旦你有元音,它应该很容易猜到。

要获得密钥长度,只需尝试所有可能的密钥长度k,将密文分成大小为k和xor对的范围。查看同意的角色位置数量。一个好的启发式方法是,最可能的密钥长度对应于对之间最广泛的一致性。

这有一个handy tool