Я пытаюсь внедрить шифр Вигенара. Я хочу, чтобы иметь возможность обфускации каждого отдельного символа в файле, а не только буквенных символов.Vigenere Cipher в ошибке Python
Я думаю, что я пропускаю что-то с различными типами кодирования. Я сделал несколько тестовых примеров, и некоторые символы плохо заменяются в конечном результате.
Это один тест:
, .-'`1234678abcde^* {} "?! ¿" · $% &/\ º
конец
И это результат я получаю:
) .- 4`1234678abcde^* {} "??!" 7 $% & /:
конец
Как вы можете видеть, «» заменяется плохо с „)“, а также некоторые другие символы.
Я полагаю, что другие (например, '¿' заменены на??) Исходят из исходного символа, который не находится в диапазоне [0, 127], поэтому его нормальные изменения изменены. Но я не понимаю, почему «,» терпит неудачу.
Мое намерение состоит в том, чтобы обфускать файлы CSV, поэтому проблема «,» - это проблема, о которой я беспокоюсь в основном.
В приведенном ниже коде я использую модуль 128, но я не уверен, что это правильно. Чтобы выполнить его, поместите файл с именем «OriginalFile.txt» в ту же папку с содержимым для шифрования и запуска скрипта. Будут созданы два файла, Ciphered.txt и Deciphered.txt.
"""
Attempt to implement Vigenere cipher in Python.
"""
import os
key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
fileOriginal = "OriginalFile.txt"
fileCiphered = "Ciphered.txt"
fileDeciphered = "Deciphered.txt"
# CIPHER PHASE
if os.path.isfile(fileCiphered):
os.remove(fileCiphered)
keyToUse = 0
with open(fileOriginal, "r") as original:
with open(fileCiphered, "a") as ciphered:
while True:
c = original.read(1) # read char
if not c:
break
k = key[keyToUse]
protected = chr((ord(c) + ord(k))%128)
ciphered.write(protected)
keyToUse = (keyToUse + 1)%len(key)
print("Cipher successful")
# DECIPHER PHASE
if os.path.isfile(fileDeciphered):
os.remove(fileDeciphered)
keyToUse = 0
with open(fileCiphered, "r") as ciphered:
with open(fileDeciphered, "a") as deciphered:
while True:
c = ciphered.read(1) # read char
if not c:
break
k = key[keyToUse]
unprotected = chr((128 + ord(c) - ord(k))%128) # +128 so that we don't get into negative numbers
deciphered.write(unprotected)
keyToUse = (keyToUse + 1)%len(key)
print("Decipher successful")
(Какой ключ дал вам образец вывода?) Даже с диапазоном, ограниченным 128, вы сталкиваетесь с проблемами, потому что символы «до» пространства являются особенными. Лучшая петля вокруг «простой» части ASCII: только ординалы от 32 до 126. – usr2564301
Для запятой: вы хотите * игнорировать * его и кодировать, как обычно, или вы хотите * поддерживать * их и просто кодировать правильно CSV-записи?(В этом случае вам следует позаботиться ** не ** закодировать что-либо в запятую!) – usr2564301
@RadLexus Я тоже хотел бы закодировать запятую. Я не хочу, чтобы злоумышленник знал свой CSV-файл. Может быть, мне нужно немного обдумать то, что вы говорите [32, 126]. Я попробую и скоро обновится. – Guimo