【问题标题】:XoR two Hexadecimal异或两个十六进制
【发布时间】:2026-01-23 00:05:01
【问题描述】:

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

这个想法是,当你对一个带有空格的字符进行异或运算时,该字符变为大写或小写,而当你对 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 函数可以正常工作,但当键是奇数时,它不会返回相同的大写或小写字符。

我做错了什么?

【问题讨论】:

  • 如果你有十个密文使用同一个一密,那它就不是一密,而是十密。如果它是一个真正的 One Time Pad,那么你找不到关键,你所能做的就是找到所有可能的关键,给出一个可理解的输出。
  • 它们都用相同的密钥加密,练习的黄金是找到密钥
  • 十个时间垫是可以解决的。只需为每个位置尝试不同的关键字母,直到所有十个文本都有意义。

标签: python python-2.7 cryptography xor bitwise-xor


【解决方案1】:

关于如何解决这个问题的一般想法,忽略 python:

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

如果您从第一个密文中查看第一个字符,您可能会注意到它超出了纯文本的 ascii 值,可以说是 a-z 0x61-0x7a A-Z 0x41-0x5a

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

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

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

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

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

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

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

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

现在如何处理结果:

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

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

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

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

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

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

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

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

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

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

【讨论】:

    最近更新 更多