如何对 Python 中的十六进制字符串与文字字符串进行异或?
How to XOR a hex string with a literal string in Python?
我的最终目标是 encrypt/decrypt 使用线性同余生成器的十六进制字符串。
我有一个 'keys' 的列表,我想用一个字符串进行异或运算。例如,键列表是 ['0x92', '0xe3', 0x18'...]
,我想与键进行异或的字符串是 'apple'
。键列表的长度与字符串的长度相同。
我希望能够产生 "\xF3\x93\x68..."
这样的结果。
我不确定如何开始这种方法。我是否应该将字符串中的每个字符都转换为二进制并将每个十六进制字符串转换为二进制并将它们异或在一起?
我正在寻找的结果 (xF3..),是 unicode 吗?
鉴于 keys
的长度等于 text
的长度,可以简单地使用 zip
并使用 join
生成字符串:
keys = ['\x92', '\xe3', '\x18']
text = 'app'
result = ''.join(chr(ord(key)^ord(tex)) for key,tex in zip(keys,text))
代码的工作原理如下:zip
发出 keys
和 text
中元素的元组:因此 zip(keys,text)
的结果大致为:
list(zip(keys,text)) == [('\x92', 'a'), ('ã', 'p'), ('\x18', 'p')]
现在我们将 key
和 tex
与这些元组中的每一个统一起来,所以在第一次迭代中 key
是 '\x92'
并且 tex
是 'a'
。通过对这些元素调用 ord(..)
,我们获得了 ASCII 码。接下来我们对这些ASCII码进行异或(^
)运算,将其转换回对应的char(..)
。我们使用 ''.join(..)
将所有这些字符连接在一起成为结果字符串,即:
result == 'ó\x93h'
使用ord
和chr
>>> a = 0x22
>>> a
34
>>> b = ord('Z')
>>> b
90
>>> a^b
120
>>> chr(a^b)
'x'
我的最终目标是 encrypt/decrypt 使用线性同余生成器的十六进制字符串。
我有一个 'keys' 的列表,我想用一个字符串进行异或运算。例如,键列表是 ['0x92', '0xe3', 0x18'...]
,我想与键进行异或的字符串是 'apple'
。键列表的长度与字符串的长度相同。
我希望能够产生 "\xF3\x93\x68..."
这样的结果。
我不确定如何开始这种方法。我是否应该将字符串中的每个字符都转换为二进制并将每个十六进制字符串转换为二进制并将它们异或在一起?
我正在寻找的结果 (xF3..),是 unicode 吗?
鉴于 keys
的长度等于 text
的长度,可以简单地使用 zip
并使用 join
生成字符串:
keys = ['\x92', '\xe3', '\x18']
text = 'app'
result = ''.join(chr(ord(key)^ord(tex)) for key,tex in zip(keys,text))
代码的工作原理如下:zip
发出 keys
和 text
中元素的元组:因此 zip(keys,text)
的结果大致为:
list(zip(keys,text)) == [('\x92', 'a'), ('ã', 'p'), ('\x18', 'p')]
现在我们将 key
和 tex
与这些元组中的每一个统一起来,所以在第一次迭代中 key
是 '\x92'
并且 tex
是 'a'
。通过对这些元素调用 ord(..)
,我们获得了 ASCII 码。接下来我们对这些ASCII码进行异或(^
)运算,将其转换回对应的char(..)
。我们使用 ''.join(..)
将所有这些字符连接在一起成为结果字符串,即:
result == 'ó\x93h'
使用ord
和chr
>>> a = 0x22
>>> a
34
>>> b = ord('Z')
>>> b
90
>>> a^b
120
>>> chr(a^b)
'x'