Python 3 XOR字节数组

5

在Python 3中是否有内置函数可以对字节进行按位异或操作?例如,如果我有两个bytearray:

one = oE1ltQSsoEqRC4j1EMz1ORU1dyucIcI4WstKz-uhuKA=
two = Rffs1PW5zA1h5RFVh5MkLw5R7a2QVHY7cwnjuSPktwc=

one XOR two = 5bqJYfEVbEfw7pmgl1_RFhtkmoYMdbQDKcKpdshFD6c=

3
这些看起来像是Base64编码的字符串(但实际上不是,因为它们没有正确的填充)。 - AKX
@AKX 我相信它们是32字节的字符串。 - user1045890
实际上每个都有44字节。 - freakish
如果这是常识,请容忍我。不,那将是在提问之前没有自己进行研究的相反情况。 - Mad Physicist
即使我在第一个字符串中添加另一个填充符“=”,我仍然只得到31个字节。 - AKX
4
那些不是字符串或字节,它们是语法错误。请显示有效的初始化,以便清楚地了解您实际需要处理的内容。 - Mad Physicist
1个回答

13

通常情况下,如果您有两个 bytes,您可以执行以下操作:

one_xor_two = bytes(a ^ b for (a, b) in zip(one, two))

逐个对它们执行异或操作。

在您的情况下,您需要首先对字符串进行base64解码,然后执行XOR操作,最后进行base64编码... 然而,由于Python不喜欢其中的错误填充,所以示例字符串将无法正常工作。

import base64

one = base64.b64decode('oE1ltQSsoEqRC4j1EMz1ORU1dyucIcI4WstKz-uhuKA=')
two = base64.b64decode('Rffs1PW5zA1h5RFVh5MkLw5R7a2QVHY7cwnjuSPktwc=')

one_xor_two = bytes(a ^ b for (a, b) in zip(one, two))

print(base64.b64encode(one_xor_two))

1
除了两个字符串都不是base64之外。 - freakish
如答案中所述,是的。 - AKX
即使它们是base64编码(通过人为添加缺失的填充),结果也与OP所述不符。在我看来,这个问题是无效的。 - freakish
1
问题要求如何将两个字节数组进行逐元素异或。我确实同意示例数据是可疑的,因为它与正确值相差甚远,但至少按照提问者的问题得到了回答。 - AKX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接