(Конечный)Простой Расшифровщик/Шифратор


Это моя финальная версия моего симпел Декриптер/шифратор называется Dencryptor. Это один из моих первых проектов на Python и я думаю, получилось довольно хорошо. Я с помощью шифра Цезаря прямо сейчас и я думаю, что это работает, как задумано. Я могу попробовать добавить некоторые другие шифры, но я думаю, что это хорошо работает сейчас. Это был просто проект, чтобы учиться и шифрование не сильный, так что я не рекомендую ни один фактически используя это для чего-нибудь.

Список команд:

  • Help - показать эту страницу.
  • шифрования {текст} - шифровать текст
  • ключ - отображает ваш текущий ключ дешифрования
  • клавиша {ключ} - установить ключ дешифрования
  • расшифровать {текст} - расшифровать текст
  • выход - закрыть приложение

Что вы думаете об этом? Любые изменения требуют?

Особая благодарность: @Coal_ и @henje за помощь!

    import secrets
    import string

    print("""  _____                                   _            
     |  __ \                                 | |           
     | |  | | ___ _ __   ___ _ __ _   _ _ __ | |_ ___ _ __ 
     | |  | |/ _ \ '_ \ / __| '__| | | | '_ \| __/ _ \ '__|
     | |__| |  __/ | | | (__| |  | |_| | |_) | ||  __/ |   
     |_____/ \___|_| |_|\___|_|   \__, | .__/ \__\___|_|   
                                   __/ | |                 
                                  |___/|_|                 """)
    userinput = ''
    exit = False
    key = None
    characters = list(string.printable)[:-5]


    def get_int(prompt):
            try:
                return int(prompt)
            except ValueError:
                print("Input requires a number!")


    def encrypt(args, key):
        text = []
        encryptlist = []
        try:
            for line in args:
                text.extend(line)
            for x in range(len(text)):
                index = characters.index(text[x])
                newindex = (index + key) % len(characters)
                cipher = characters[newindex]
                encryptlist.append(cipher)
                x += 1
            encrypted = ''.join(encryptlist)
            return encrypted
        except ValueError:
            print('Invalid character(s)!')


    def decrypt(args, key):
        text = []
        decryptlist = []
        try:
            for line in args:
                text.extend(line)
            for x in range(len(text)):
                index = characters.index(text[x])
                newindex = (index - key) % len(characters)
                cipher = characters[newindex]
                decryptlist.append(cipher)
                x += 1
            decrypted = ''.join(decryptlist)
            return decrypted
        except ValueError:
            print('Invalid character(s)!')


    while not exit:
        arguments = ''
        userinput = input('> ')
        command = userinput.split(' ', 1)[0]

        if userinput != command:
            arguments = userinput.split(' ', 1)[1]

        if userinput == 'help':
            print('''
    Dencrypter commands
    ------------------------------------------
    help - Show this page.
    encrypt {text} - Encrypt some text
    key - Displays your current decryption key
    key {key} - Set a decryption key
    decrypt {text} - Decrypt some text
    exit - close application
            ''')

        if userinput == 'exit':
            exit = True

        elif command == 'encrypt':
            encryptionkey = secrets.randbits(10)
            encryption = encrypt(arguments, encryptionkey)
            if arguments != '':
                if encryption is not None:
                    print('Encrypted tekst: ' + encryption)
                    print('Encryption key: ' + str(encryptionkey))
            else:
                print('The encrypt command requires an argument. \nUse like this: encrypt {text}')

        elif command == 'key':
            if arguments != '':
                key = get_int(arguments)
                if key is not None:
                    print('Decryption key changed to: ' + str(key))
            else:
                print('Decryption key: ' + str(key))

        elif command == 'decrypt':
            if arguments != '':
                print('Decrypted tekst: ' + decrypt(arguments, key))
                print('Using decryption key: ' + str(key))
            else:
                print('The decrypt command requires an argument. \nUse like this: decrypt {tekst}')


Комментарии
1 ответ

Это хорошая программа, интуитивно доступной и удачной, если у вас нет каких-либо криптографически разбирается злоумышленника.

Когда я попробовал его, моя сессия выглядела так:

> encrypt Hello
Encrypted text: (ELLO
Encryption key: 311
> decrypt (ELLO
Traceback (most recent call last):
File "C:/Users/rillig/git/python-playground/caesar.py", line 105, in <module>
print('Decrypted tekst: ' + decrypt(arguments, key))
File "C:/Users/rillig/git/python-playground/caesar.py", line 52, in decrypt
newindex = (index - key) % len(characters)
TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'

Упс. Но это легко исправить.

Как и в каждом питона комментарий здесь, взгляните на ПЭП 8, питона стиль руководства. Он имеет множество советов о том, как структурировать код и формат это хорошо. Да, это долгий документ, чтобы прочитать его на маленькие шаги, так как у вас есть время.

В строке приветствия, первая линия выглядит странно. При добавлении обратной косой черты сразу после открытия """первые строки игнорируется в строке:

print("""\
_____ _
| __ \ | |
| | | | ___ _ __ ___ _ __ _ _ _ __ | |_ ___ _ __
| | | |/ _ \ '_ \ / __| '__| | | | '_ \| __/ _ \ '__|
| |__| | __/ | | | (__| | | |_| | |_) | || __/ |
|_____/ \___|_| |_|\___|_| \__, | .__/ \__\___|_|
__/ | |
|___/|_| """)

Теперь ваш логотип хорошо выглядит в исходном коде также.

Цитата из вашего кода:

characters = list(string.printable)[:-5]

Будьте осторожны, что зашифрованный текст не заканчивается в пространстве. Что бы не было видно на экране. Представьте себе такой небольшой диалог:


Вопрос: сколько я вам должен?
Ответ: 150

Теперь если что шифруется и окончательную 0 отсутствует, это будет плохо.

Продолжая свой код:

except ValueError:
print('Invalid character(s)!')

Это сообщение об ошибке немного неконкретный. Если ваша программа дружелюбным, он говорит мне, какие из многочисленных символов я напечатал является недействительным, в идеале с некоторого контекста, так что я могу найти его.

        print('''
Dencrypter commands
------------------------------------------
help Show this page
encrypt {text} Encrypt some text
key Display your current decryption key
key {key} Set a decryption key
decrypt {text} Decrypt some text
exit Close application
''')

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

Я также нормализовал точки в конце, верхний/нижний правописание первой буквы и заменил Displays С Displayв соответствии с грамматикой других записях.

Кстати, это здорово, что вы используете актуальные глаголов как команды. Я вижу, что многие другие программы для новичков, которые имеют пронумерованные пункты меню: нажмите 1, чтобы зашифровать текст. Нажмите 2, чтобы ввести ключ дешифрования. И так далее. Ваш вариант является способом пойти.

Вы должны нормализовать tekst для text. :)

Мне очень нравится Use it like this инструкции. Они имеют важное значение для развлечений с программой. "Не говори мне, что я сделал не так, А скажи мне, как сделать это правильно."

Чтобы сделать вашу программу легко проверяемой, она должна делать всю свою работу в функцию main. См. Этот вопрос для получения дополнительной информации.

4
ответ дан 11 марта 2018 в 10:03 Источник Поделиться