python - 对 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
我似乎无法让这些解决方案为我工作,我想知道是什么情况。有关更多信息,我的data
和key
只是纯文本。
这是一个完整的猜测,但可能是因为我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
我猜某些字符正在破坏它 - 看起来非标准引用正在搞砸事情。
解决方案
推荐阅读
- python - 使用 argparse 在控制台中运行脚本时出错
- ansible - 如何使用用户提示跳过播放?
- javascript - beforeunload 替代 iPhone 和 iPad
- python - Windows:[WinError 126] 找不到指定的模块
- sql - SQL:LEFT JOIN 基于另一个表的生效日期
- python - python中有.=运算符吗?如果没有,我该怎么做?
- javascript - 使用正确的编码从 REST API 下载 pdf
- hadoop - 如何获取hadoop文件系统的当前时区
- algorithm - 特殊图中的简单路径数
- reactjs - react-modal 动态添加模态