Обратите внимание, что используемый в настоящее время словарь не обратимый. Поскольку буквы «S», «T» и «U» отсутствуют, они будут неявно отображены на них самих. Таким образом, «S» неявно отображается на «S». Однако 'P' также сопоставляется с 'S' вашим словарем.
Если эта проблема устранена, ключевым моментом для изменения вашего шифрования, конечно же, является обращение словаря, как указал @Boris Lipschitz.
Тем не менее, ваш код не легко поддерживает это. Почему? Потому что ваш метод encrypt_file делает многое. Он открывает файл, шифрует и сохраняет файл. Перебор! Метод должен делать одну вещь только. Рассмотрим такой подход:
def encrypt(content, mapping):
result = ""
for char in content:
char = char.upper()
if char in mapping.keys():
new_char = mapping[char]
result += new_char
else:
result += char
return result
with open('texttoencrypt.txt', 'r') as f:
content = f.read()
print(content)
encrypted = encrypt(content, dictionary)
print(encrypted)
reversed_mapping = {v: k for k, v in dictionary.items()}
decrypted = encrypt(encrypted, reversed_mapping)
print(decrypted)
Это почти точно ваш код, но я переместил все, что не связано с алгоритмом шифрования, из метода шифрования. Теперь его можно легко использовать для расшифровки! (Вы могли бы улучшить это, просто написав result += mapping.get(char, char)
, но я хотел остаться близким к вашему исходному коду.
Аргумент Бориса Липшица совершенно справедлив, однако: не изобретайте колесо. Просто используйте maketrans / преобразовать решение:)