修改程序使用以前加密的字母在Python中解密消息

0 投票
2 回答
1186 浏览
提问于 2025-04-17 08:31

我需要帮助来写这个程序的第二部分,基本上已经快完成了。我已经写好了加密字母的部分,但现在我卡住了,想用新的加密方式作为解码器,来解密别人输入的随机混乱信息。

为了让这个更容易理解,假设这个程序的加密部分给你输出了:NHPWJXEYOZMAFUSCIGLVTDBKRQ

现在有人会输入一些用新的混乱字母加密的随机信息。比如说,有人输入了:VYOL OL FR 1LV LJPGJV FJLLNEJ!

我需要写的程序将使用这个混乱的字母表来解码这个信息,并输出:THIS IS MY 1ST SECRET MESSAGE!

如果有人能帮忙,我会很感激。如果还有什么不明白的地方,随时问我。下面是我现在的程序:

           # 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 个回答

1

你把事情想得太复杂了。直接用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'
2

在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!'

撰写回答