Попытка расшифровать и распечатать текстовый файл, который я зашифровал в той же программе - PullRequest
1 голос
/ 05 апреля 2020

Итак, я наконец понял, как читать и шифровать текстовый файл. Теперь мне нужно создать вторую программу, которая открывает зашифрованный файл, а затем отображает его расшифрованное содержимое на экране. Я был хорош, пока мне не пришлось повернуть вспять и выяснить, как распечатать ключ в словаре. Любая помощь велика, TIA!

вот мой код:

    dictionary = {'A':'D', 'B':'E', 'C':'F', 'D':'G', 'E':'H', 
            'F':'I', 'G':'J', 'H':'K','I':'L',\
            'J':'M', 'K':'N', 'L':'O', 'M':'P', 'N':'Q', 'O':'R', 
            'P':'S', 'Q':'T', 'R':'U',\
            'V':'Y', 'W':'Z', 'X':'A', 'Y':'B', 'Z':'C'}
    def encrypt_file():
        file = open('texttoencrypt.txt', 'r')
        new_file = open('encrypted_text.txt', 'w')

        while True:
            char = file.read(1)
             if not char:
                break
            char = char.upper()
            if char in dictionary.keys():
                 new_char = dictionary[char]
                 new_file.write(new_char)
            else:
                 new_file.write(char)

         file.close()
         new_file.close()

    encrypt_file()

    def decrypt_file():
        encrypted = open('encrypted_text.txt', 'r')
        decrypt = ''
        while True:
            char = encrypted.read(1)
            if not char:
                break
            for key, values in dictionary.items():
                 if char in values:
                     decrypt+= key
                 else:
                     decrypt += char
         print(decrypt)
         encrypted.close()

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Обратите внимание, что используемый в настоящее время словарь не обратимый. Поскольку буквы «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 / преобразовать решение:)

0 голосов
/ 05 апреля 2020

Изменение словаря может быть выполнено с использованием понимания списка, например: reversed_dictionary = {(v,k) for k,v in dictionary.items()}. Это предполагает, что у вас нет повторяющихся значений в оригинале, чего у вас не должно быть в первую очередь. Не уверен, что вы подразумеваете под «распечатать ключ в словаре», хотя.

Обратите внимание, что вам, вероятно, будет лучше использовать уже выходящее решение, которое будет методом «перевода». Вот пример этого, который также обнаруживает проблему с вашей таблицей перевода:

plain =     'ABCDEFGHIJKLMNOPQRVWXYZ'
scrambled = 'DEFGHIJKLMNOPQRSTUYZABC'

scramble = str.maketrans(plain, scrambled)
descramble = str.maketrans(scrambled, plain)

s1 = "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"
s2 = s1.translate(scramble)
s3 = s2.translate(descramble)

print("Original:    %s" % s1)
print("Scrambled:   %s" % s2)
print("Descrambled: %s" % s3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...