【问题标题】:How to XOR a hex string with a literal string in Python?如何在 Python 中将十六进制字符串与文字字符串进行异或?
【发布时间】:2017-05-21 14:34:15
【问题描述】:

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

我有一个“键”列表,我想用一个字符串进行异或。例如,键列表是['0x92', '0xe3', 0x18'...],我想与键进行异或的字符串是'apple'。键列表的长度与字符串的长度相同。

我希望能够产生像"\xF3\x93\x68..." 这样的结果。

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

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

【问题讨论】:

  • “转成二进制”是什么意思?

标签: python encryption unicode hex encode


【解决方案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'a'。通过在这些元素上调用ord(..),我们获得了 ASCII 码。接下来,我们对这些 ASCII 码执行 XOR (^) 操作,并将其转换回对应的char(..)。我们使用''.join(..) 将所有这些字符连接在一起形成结果字符串,即:

result == 'ó\x93h'

【讨论】:

    【解决方案2】:

    使用ordchr

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

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2012-06-05
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      相关资源
      最近更新 更多