Запуск шифрования XOR в цикле с str.replace не меняет некоторые символы - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь зашифровать текст, а затем расшифровать его с помощью XOR. Он меняет большинство букв, но пропускает некоторые. Когда я меняю «ключ», он пропускает те же буквы. Если я попробую другой текст, он также пропускает некоторые буквы, но в разных местах.

Я пытался изменить букву в тексте:
«что-то не так с моим кодом»
"Это просто так", 1005 *

Таким образом, он не будет шифровать букву «е», но когда я заменяю одну «е» на «X», он работает и шифрует букву «е».

text = "there is something wrong with my code"
key = 154
print(key)
längd = (len(text))
for a in range(0,längd):
    b = ord(text[a])
    ny = b ^ key
    ny2 = chr(ny)
    text = text.replace(text[a],ny2)

print(text)
for a in range(0,längd):
    b = ord(text[a])
    ny = b ^ key
    ny2 = chr(ny)
    text = text.replace(text[a], ny2)

print(text)

Если я попытаюсь key = 153, я получу "íñere ðs sömeíñðng wröng wðíñ mà úöýe".
Если я попытаюсь key = 154, я получу "îòere ós sõmeîòóng wrõng wóîò mã ùõþe".

Как вы можете видеть, он не меняет буквы "e, r, n, g, w, m".

1 Ответ

1 голос
/ 05 апреля 2019

Обратите внимание, что символы, которые не меняются при запуске цикла, являются символами, которые встречаются в вашей строке четное число раз.Одна и та же операция XOR используется как для шифрования, так и для дешифрования символов, потому что XOR для числа с другим номером дважды дает одно и то же число.Чего вам не хватает, так это того факта, что Python str.replace() заменяет все вхождения первой строки второй строкой.Когда вы сталкиваетесь с первым 'e', ​​все 'e' в строке заменяются на key ^ ord('e'), а не только на то, с которым вы только что столкнулись.Другие символы, такие как 't', также получают XORed более одного раза, но вы их не замечаете, потому что XOR с числом 3 совпадает с XORing 1 раз.

Для более простой итерации и работы с символами, вы должны использовать изменяемый тип последовательности, такой как bytearray:

text = "there is something wrong with my code"
key = 154
print(key)
ba = bytearray(text, "latin_1")

for i in range(0, len(ba)):
    ba[i] = ba[i] ^ key

print(ba.decode("latin_1"))

for i in range(0, len(ba)):
    ba[i] = ba[i] ^ key

print(ba.decode("latin_1"))
...