Модификация программы для расшифровки сообщения с использованием прошлого зашифрованного алфавита на python - PullRequest
0 голосов
/ 17 декабря 2011

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

Чтобы сделать это проще для понимания, допустим, что шифрование часть этой программы дает вам: NHPWJXEYOZMAFUSCIGLVTDBKRQ

Теперь кто-то может напечатать какое-нибудь случайное сообщение, зашифрованное с использованием нового шифрованного алфавита. Итак, допустим, кто-то печатает: VYOL OL FR 1LV LJPGJV FJLLNEJ!

Теперь программе, которую мне нужно написать, нужно будет использовать закодированный алфавит для декодирования сообщения и напечатать: ЭТО МОЕ 1-Й СЕКРЕТНОЕ СООБЩЕНИЕ!

Если кто-нибудь может помочь, я буду благодарен. Если это все еще звучит странно, просто спросите. Чья у меня программа ниже:

           # ENCODE a secret message
            # Scramble the alphabet, read a secret message, encode it, print scrambled

            import random

            def main():

                encryption()

                decryption()

            def encryption():

                encrypt=["*"]*26   # all letters available
                print(encrypt)

                print("Alphabet:  ", end="")
                for numbah in range(26):
                    #converts numbah into a letter
                    letter = chr(numbah+65) # converts 0-25 --> 'A' = 'Z'

                    print(letter, end="")

                    #Reminder: find an empty position for that letter to be placed

                    notfound = True
                    while notfound:
                        possible_position = random.randint(0,25)
                        if encrypt[possible_position] == "*":
                            notfound = False
                    encrypt[possible_position] = letter

                print("\nScrambled: " , end="")
                for numbah in range(26):
                    print(encrypt[numbah], end="")

                print("\n\n")

                msg=input("Now, please type your secret message to encode: ")
                print("Your secret message:  " + msg)
                print("Your message encoded: ", end="")

                # reminder non alphabetic characters should 'float thru' unchanged!

                for alpha in msg.upper():
                    if alpha < "A" or alpha > "Z":
                        print(alpha, end="")
                    else:
                        print( encrypt[ ord(alpha) - 65], end="")

                print("\n")

            def decryption():

                scram_alph = input("Input the scrambled alphabet from the early prog:  ")

                scram_mess = input("Input the scrambled messgae you want decoded:  ")







            main()

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

В стандартной библиотеке Python есть функции, которые облегчают эту задачу. Посмотрите на str.translate() и string.maketrans():

>>> import string
>>> t = string.maketrans("NHPWJXEYOZMAFUSCIGLVTDBKRQ",
                         string.ascii_uppercase)
>>> "DRSA SA XG 1AD AZCEZD XZAAUJZ!".translate(t)
'THIS IS MY 1ST SECRET MESSAGE!'
1 голос
/ 17 декабря 2011

Ты оооочень усложняешь это.Используйте встроенные инструменты итерации, которые дает вам Python.

>>> alphabet = "NHPWJXEYOZMAFUSCIGLVTDBKRQ".lower()
>>> message = "VYOL OL FR 1LV LJPGJV FJLLNEJ!".lower()
>>>
>>> table = dict(zip(alphabet, string.ascii_lowercase))
>>> "".join(table.get(char, char) for char in message)
'this is my 1st secret message!'

Объяснение

Строка

table = dict(zip(alphabet, string.ascii_lowercase))

делает словарь букв зашифрованного текста открытым текстомбуквы.Зачем?zip из двух строк дает вам список пар: (первая буква, первая буква), (вторая буква, вторая буква) и т. Д. Затем dict из этого составляет словарь.Затем строка

"".join(table.get(char, char) for char in message)

говорит, что нужно искать каждый символ в сообщении в словаре (и если его там нет, например, пробел или!, То не меняйте его) и склеивать их обратно встрока.


Кстати, чтобы сделать зашифрованный алфавит, все что вам нужно сделать, это

>>> alphabet = list(string.ascii_lowercase)
>>> random.shuffle(alphabet)
>>> alphabet = "".join(alphabet)
>>> alphabet
'emxcqgzvkruisjtlydbhafopnw'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...