单字节 XOR 密码 (python)

新手上路,请多包涵

这是我目前正在学习的现代密码学课程。

挑战是 cryptopals challenge 3: Single-Byte XOR Cipher,我正在尝试使用 python 3 来帮助完成它。

我知道我应该对字符串进行异或并转换为英语。 The hex string is “1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736” which converts to “806748453371902409051174291875458592743800337585421566549206796642836053682239286” in decimal form.

我对多个十六进制字节组合(2 个十六进制数字)进行了异或运算,但我不知道如何将其转换为英文。在这一点上,这只是蛮力和有根据的猜测吗?

我知道 ETAOIN SHRDLU,但这并没有真正帮助。

感谢您的时间和帮助。


添加:此外,我尝试了挑战 #4,但这段代码似乎不起作用。但它确实适用于挑战#3,所以我很困惑。

挑战 #3 挑战 #4

原文由 Phillip Sloan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 681
2 个回答

基于@falsetru 的回答,但仅显示具有最多空格字符的解码字符串:

 >>> encoded = '1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736'
>>> import binascii
>>> nums = binascii.unhexlify(encoded)
>>> strings = (''.join(chr(num ^ key) for num in nums) for key in range(256))
>>> max(strings, key=lambda s: s.count(' '))
"Cooking MC's like a pound of bacon"

除了计算空格,您还可以使用 ETAOIN SHRDLU (“英语中 12 个最常用字母的近似频率顺序”)来计算权重,但此处没有必要。

顺便说一句,我认为如果你能 与挑战 联系起来就好了。


编辑: 或者,您可以尝试找到密钥(或一些最有希望的密钥),然后仅使用该密钥(或那几个密钥)进行解码。例如,假设计算空格数将决定获胜者:

 >>> encoded = '1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736'
>>> import binascii
>>> nums = binascii.unhexlify(encoded)
>>> key = max(nums, key=nums.count) ^ ord(' ')
>>> ''.join(chr(num ^ key) for num in nums)
"Cooking MC's like a pound of bacon"

这甚至可以很容易地手工完成(尽管挑战告诉你不要那样做)。

原文由 Stefan Pochmann 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 binascii.hexlify , binascii.unhexlify 将字节字符串转换为十六进制,反之亦然:

 >>> import binascii
>>> binascii.hexlify(b'HELLO')  # to Hex
b'48454c4c4f'
>>> binascii.unhexlify('48454c4c4f')  # from Hex
b'HELLO'


使用 str.isprintable ,您可以过滤掉不可打印的候选人:

 >>> 'abcd'.isprintable()
True
>>> '\x00'.isprintable()
False
>>> '\x7f'.isprintable()
False


 import binascii

encoded = binascii.unhexlify('1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736')
for xor_key in range(256):
    decoded = ''.join(chr(b ^ xor_key) for b in encoded)
    if decoded.isprintable():
        print(xor_key, decoded)

原文由 falsetru 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题