Python Unicode字符串上的XOR加密

Python Unicode字符串上的XOR加密,python,python-3.x,encryption,xor,Python,Python 3.x,Encryption,Xor,我目前正在尝试对一些纯文本进行一些基本的XOR加密,但似乎无法使其工作。我已经在网上找到了典型的解决方案,但它们都会出错,不幸的是,我还不太熟悉所有字节/编码的内容 以下是我在网上找到的最常见的解决方案: def xor_crypt_string(data, key, encode = False, decode = False): if decode: data = base64.decodestring(data) xored = ''.join(chr(or

我目前正在尝试对一些纯文本进行一些基本的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:应为类似对象的字节,而不是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”对象不能解释为整数
我似乎无法让这些解决方案对我有效,我想知道是什么情况。有关详细信息,我的
数据
仅为纯文本

这是一个完全的猜测,但可能是因为我的
数据可能被格式化或编码得很奇怪?我的
数据
有时会是空白的,有时会包括emojis(我想是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'
第二次更新:

我用这个版本的函数得到了它:

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

我猜是某些字符在破坏它-看起来非标准的引号把事情搞砸了。

编码之前,请使用类似于
data.encode('utf-8')的东西将字符串转换为字节。
。还原过程时,使用
decode
从utf-8字节中获取unicode字符串。@PauloScardine不幸也尝试过,将用这种情况更新原始帖子您可能希望使用
bytes(…)
而不是
“”。join(…)
。我认为该错误在
xored.encode中再次将cyphertext编码为utf-8('utf-8')
-cyphertext应该已经是utf-8字节。编码之前,请将字符串转换为类似于
数据的字节。encode('utf-8'))
。还原过程时,请使用
解码
从utf-8字节中获取unicode字符串。@PauloScardine不幸也尝试过,将用这种情况更新原始帖子您可能希望使用
字节(…)
而不是
“”。join(…)
。我认为该错误在
xored中再次将cyphertext编码为utf-8。encode('utf-8')
-cyphertext应该已经是utf-8字节了。
// 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