0

所以我试图找到一个时间垫的密钥,我有 10 个密文。(明文字母编码为 8 位 ASCII,给定的密文用十六进制编写;我使用的是 python 2.7)

这个想法是,当您对带有空格的字符进行异或运算时,该字符将变为大写或小写,而当您将 x 与 x 异或时,它返回零,因此当我对密文的两个字符异或时,我将密钥与密钥和消息字符异或消息字符。所以我写了这段代码来异或两个十六进制。

 def hex_to_text(s):
     string=binascii.unhexlify(s)
     return string

def XoR (a,b):
    a="0x"+a
    b="0x"+b
    xor=chr(int(a,16) ^ int(b,16))
    return hex_to_text(xor[2:])

当键是偶数时,xor 函数可以正常工作,但是当键是奇数时,它不会返回相同的大写或小写字符。

我究竟做错了什么?

4

1 回答 1

0

关于如何解决这个问题的一般想法,不考虑 python:

让我们先说一个 char 是 8 位 ascii

如果您查看第一个密文形式的第一个字符,您可能会注意到它在纯文本的 ascii 值之外,可以说是 az 0x61-0x7a AZ 0x41-0x5a

很有可能您只需要考虑与此字符异或的值,使其在指定值范围内

其他 9 个文本及其各自的第一个字符也是如此

而且,有趣的是,这个字符的可能键值列表必须为每个具有相同密钥的密文保留,因此我们查看的每一个密文都进一步缩小了范围

现在,你可以用这种方法做什么?

编写一个接受 2 个参数(字节)的函数,并测试 xor 的结果是否在指定范围内,如果是,则返回 1,如果不是,则返回 0

现在做 3 个嵌套循环来调用这个函数

外循环 (X) 遍历密文中的字符位置 中间循环 (Y) 从 0 到 255 内循环 (Z) 遍历密文

在内部循环中调用您的函数,参数 1 是 Z 密文的 X 字符,参数 2 是 Y

现在如何处理结果:

你想要一个字典/查找表,每个位置 X 包含 255 个元素的数组

这些元素的索引将是 Y 这些元素的值将是所有 Z 的函数结果的总和

最后,对于密文中的每个位置,您将拥有一个数组,该数组告诉您每个密钥字节它是密钥的可能性……值越高,成为密钥字节的概率就越高

然后对于密文中的每个位置,按概率对可能的密钥字节进行排序,并按概率对它们进行分区

然后取一大块所有密文,假设前 8 到 16 个字符,并计算最高概率组中所有密钥的明文

将密钥块和明文块一起存储在列表中

现在根据普通字典测试您可能的明文列表,如果它们包含可以在字典中找到的单词,则再次为它们评分 1,否则为 0...总结所有不同的密文...(或使用另一个指标来评分钥匙有多好)

按最高值对密钥块排序(阅读:可能解决所有密文中最多块的密钥首先出现,产生垃圾的密钥最后)并继续下一个块......

用更大的块重复此操作,不选择密钥字节,而是选择下一个较小大小的密钥块,直到您的块大小达到密文大小......

当然,这是一种查找可能密钥的自动化方法,在您获得完全自动化的解决方案之前,还有一些实施工作。如果您只想解决这 10 个密文,您可以在可能的密钥字节或第一个块之后中止该方法,并手动完成其余的...

于 2016-11-09T15:57:35.247 回答