如何在Python中对带有文字字符串的十六进制字符串进行异或?

时间:2017-01-06 18:50:11

标签: python encryption unicode hex encode

我的最终目标是使用线性同余生成器使用十六进制字符串加密/解密字符串。

我有一个'键'列表,我希望用字符串进行异或。例如,密钥列表为['0x92', '0xe3', 0x18'...],我想要与密钥进行异或的字符串为'apple'。键列表的长度与字符串的长度相同。

我希望能够生成"\xF3\x93\x68..."等结果。

我不确定如何开始这种方法。我应该将字符串中的每个字符都转换为二进制,并将每个十六进制字符串转换为二进制并将它们一起进行异或运算吗?

我正在寻找的结果(xF3 ..),是unicode?

2 个答案:

答案 0 :(得分:1)

假设keys的长度等于text的长度,只需使用zip并使用join生成字符串:

keys = ['\x92', '\xe3', '\x18']
text = 'app'
result = ''.join(chr(ord(key)^ord(tex)) for key,tex in zip(keys,text))

代码的工作方式如下:zipkeystext中发出元素元组:因此zip(keys,text)的结果大致为:

list(zip(keys,text)) == [('\x92', 'a'), ('ã', 'p'), ('\x18', 'p')]

现在我们将keytex与每个元组统一起来,因此在第一次迭代key'\x92'tex为{{1} }。通过在这些元素上调用'a',我们获得了ASCII代码。接下来,我们对这些ASCII代码执行XOR(ord(..))操作,并将其转换回相应的^。我们使用char(..)将所有这些字符连接成结果字符串,即:

''.join(..)

答案 1 :(得分:0)

使用ordchr

>>> a = 0x22
>>> a
34
>>> b = ord('Z')
>>> b
90
>>> a^b
120
>>> chr(a^b)
'x'