首页 > 解决方案 > 对 Unicode 字符串进行 XOR 加密

问题描述

我目前正在尝试对一些纯文本进行一些基本的 XOR 加密,但似乎无法使其正常工作。我在网上找到了典型的解决方案,但它们都倾向于抛出错误,不幸的是我还不太熟悉所有字节/编码的东西。

这是我在网上找到的最常见的解决方案:

def xor_crypt_string(data, key, encode = False, decode = False):
    if decode:
        data = base64.decodestring(data)
    xored = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in zip(data, cycle(key)))
    if encode:
        return base64.encodestring(xored).strip()
    return xored

但是,当我运行它时,我得到

TypeError: expected bytes-like object, not str

我也试过:

key = "mykey"
msg = "this is an example msg"
encrypted = [ chr(ord(a) ^ ord(b)) for (a, b) in zip(msg, cycle(key)) ]
decrypted = [ a ^ b for (a,b) in zip(bytes(encrypted)) ]

加密阶段似乎效果很好,但是在解密时我遇到了

TypeError: 'str' object cannot be interpreted as an integer

我似乎无法让这些解决方案为我工作,我想知道是什么情况。有关更多信息,我的datakey只是纯文本。

这是一个完整的猜测,但可能是因为我data的格式或编码很奇怪?我的data有时会是空白的,有时会包含表情符号(我认为是 Unicode?),如果这很重要的话。我的加密输入基本上是你能想到的任何字符/格式。

为了澄清,我使用的是 Python 3。

更新:

其他尝试:

在加密之前对字符串进行编码时,例如

xor_crypt_string(data.encode('utf-8'), key, encode=True)

然后它抱怨ord选角。然后我尝试删除铸件,但意识到密钥仍然是一个字符串,并且无法解决如何处理这种差异。即当,

''.join(chr(x ^ ord(y)) for (x,y) in zip(data, cycle(key)))

Error:
unsupported operand type(s) for ^: 'int' and 'str'
''.join(chr(x ^ y) for (x,y) in zip(data, cycle(key)))

Error:
expected bytes-like object, not str

第二次更新:

我有点使用这个版本的功能:

def xor_crypt_string(data, key, encode = False, decode = False):
    if decode:
        data = base64.decodestring(data)
    xored = ''.join(chr(x ^ y) for (x,y) in zip(data, cycle(key)))
    if encode:
        # return base64.encodestring(xored).strip()
        return base64.encodestring(xored.encode('utf-8')).decode('utf-8').replace('\n', '').strip()
    return xored

但是,它不能始终如一地工作。举个例子,

// Works great!
before: sounds like ur suppressing ur own creativity
encrypted: EhwRCAASUwgPChZEExNTFxMUEQEBFRIaCgFBBhZGCxYdRAUTFgUSCAUNEh0=
after: sounds like ur suppressing ur own creativity

// Breaks...
before: disliked “wasn’t trolling!!! just agreeing that kaf’s buns can’t compare!!!”
encrypted: BRoXCg0KFgBGwoPDs8O4EQAACsKEw6TDuAdEEhMcCAoIHQNHRUBTDhMSB0QHBgEBAw0PFEQSCRIQRgoSAsKEw6TDuABEBBQdF0YCEgrChMOkw7gHRAUOHhQHExZFR0XCg8Ozw7k=
after: disliked £ð§Õ¢Ëufdk±à¥Å°Üa%awzlk{ye&6$5o`va fuegb~kr%amtt'yvd£÷§Â¢Ëd"`uns can¤å°À¥Üf7ahgcuw6##¦â°×¥Ø

before: lol i didn’t post it, waiting for the right context
encrypted: DRwIRg1BFw0CD8KRw6TDvxVTFAkXFVMNEk1TEwcIBw0IA0EVCxRBBwwDQQENAQwVUwcJDwcBHhU=
after: lol i didn±õ¥Å°Ûs7uzss2~v+2`cncl{g'txp'fg'elrhs2tmifrzs

我猜某些字符正在破坏它 - 看起来非标准引用正在搞砸事情。

标签: pythonpython-3.xencryptionxor

解决方案


推荐阅读