XOR

时间:2018-03-16 12:32:55

标签: python string hex ascii xor

我是Python&我正在努力学习如何将XOR十六进制编码的密文相互映射。然后导出这个的ASCII值。

我已经尝试了之前关于这个主题的帖子中提到的一些功能 - 例如bytearray.fromhex,binascii.unhexlify,decode(“hex”),它们都产生了不同的错误(显然是由于我缺乏理解)。其中一些错误是由于我的python版本(python 3)。

让我举一个简单的例子,假设我有一个十六进制编码的字符串ciphertext_1(“4A17”)和一个十六进制编码的字符串ciphertext_2。我想对这两个字符串进行XOR并得出它们的ASCII值。我最接近解决方案的是使用以下代码:

result=hex(int(ciphertext_1, 16) ^ int(ciphertext_2, 16))
print(result)

这打印出一个结果:0xd07 (这是一个十六进制字符串是我的理解??)

然后我尝试将其转换为ASCII值。目前,我正在努力:

binascii.unhexliy(result)

然而这给了我一个错误:“binascii.Error:Odd-length string” 我已经尝试了上面概述的不同功能,以及尝试解决这个特定的错误(条带函数给出了另一个错误) - 但是我没有成功。我意识到我对这个主题的知识和理解是缺乏的,所以我希望有人可以建议我?

完整示例:

#!/usr/bin/env python
import binascii

ciphertext_1="4A17"
ciphertext_2="4710"

result=hex(int(ciphertext_1, 16) ^ int(ciphertext_2, 16))
print(result)
print(binascii.unhexliy(result))

2 个答案:

答案 0 :(得分:1)

from binascii import unhexlify

ciphertext_1 = "4A17"
ciphertext_2 = "4710"
xored = (int(ciphertext_1, 16) ^ int(ciphertext_2, 16))
# We format this integer: hex, no leading 0x, uppercase
string = format(xored, 'X')
# We pad it with an initial 0 if the length of the string is odd
if len(string) % 2:
    string = '0' + string
# unexlify returns a bytes object, we decode it to obtain a string
print(unhexlify(string).decode())
#
# Not much appears, just a CR followed by a BELL

或者,如果您更喜欢字符串的repr

print(repr(unhexlify(string).decode()))
# '\r\x07'

答案 1 :(得分:0)

在执行像XOR这样的字节操作时,使用bytes对象通常更容易(因为各个字节被视为整数)。从this question开始,我们得到:

ciphertext_1 = bytes.fromhex("4A17")
ciphertext_2 = bytes.fromhex("4710")

然后可以在this question中完成对字节的异或,并具有理解力。然后你可以将它转换为字符串:

result = [c1 ^ c2 for (c1, c2) in zip(ciphertext_1, ciphertext_2)]
result = ''.join(chr(c) for c in result)

我可能会采用稍微不同的角度并创建一个bytes对象而不是列表,可以将其解码为您的字符串:

result = bytes(b1 ^ b2 for (b1, b2) in zip(ciphertext_1, ciphertext_2)).decode()