修改程序使用以前加密的字母在Python中解密消息
我需要帮助来写这个程序的第二部分,基本上已经快完成了。我已经写好了加密字母的部分,但现在我卡住了,想用新的加密方式作为解码器,来解密别人输入的随机混乱信息。
为了让这个更容易理解,假设这个程序的加密部分给你输出了: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!'