В настоящее время я пытаюсь выполнить какое-то базовое шифрование 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
Я предполагаю, что некоторые персонажи ломают его - похоже, нестандартные цитаты портят вещи.