Я пытаюсь зашифровать текст, а затем расшифровать его с помощью XOR. Он меняет большинство букв, но пропускает некоторые. Когда я меняю «ключ», он пропускает те же буквы. Если я пробую другой текст, он также пропускает некоторые буквы, но в разных местах.
Пробовал заменить букву в тексте:
"что-то не так с моим кодом"
"îòere ós sõmeîòóng wrõng wóîò mã ùõþe"
Таким образом, он не будет шифровать букву «е», но когда я меняю одну «е» на «Х», он работает и шифрует букву «е».
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" не меняются.
Обратите внимание, что символы, которые не изменяются при запуске цикла, — это символы, встречающиеся в строке четное количество раз. Одна и та же операция XOR используется как для шифрования, так и для расшифровки символов, потому что операция XOR числа с другим числом дважды дает одно и то же число. Чего вам не хватает, так это того факта, что Python str.replace()
заменяет вхождения все первой строки второй строкой. Когда вы встречаете первую букву «е», все буквы «е» в строке заменяются на key ^ ord('e')
, а не только ту, с которой вы только что столкнулись. Другие символы, такие как 't', также подвергаются операции XOR более одного раза, но вы этого не замечаете, потому что операция XOR с числом 3 раза аналогична операции XOR 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"))
Совет по отладке: печатайте
text
на каждой итерации цикла for. Должно быть довольно ясно, что происходит не так