解密输入?

时间:2013-08-16 04:06:08

标签: python input decode encode

这是我的任务:

编写一个DECRYPTS秘密消息的程序。

首先应该提示用户输入乱码字母。然后它应该要求秘密消息。最后,它输出未加扰的版本。

请注意,拼音字母输入正好为26个字符。所有字母字符都被翻译成它们的解码等价物(将采用WHILE循环),而所有其他非字母字符应该完全按原样输出而不进行翻译。

到目前为止,这是我的代码:

decrypt = ["*"] * 26

scram_alphabet = input("Please input the scrambled alphabet in order: ")

while len(scram_alphabet) != 26:
    scram_alphabet = input("Please input the scrambled alphabet in order. The alphabet must have 26 characters: ")

num = 0

for each_letter in scram_alphabet:
    decrypt[num] = ord(each_letter)
    num = num + 1

print()

print("Your scrambled alphabet is: ", end = "")

for num in range (26):
    print(chr(decrypt[num]), end = "")

print()
print()

msg = input("Now input your scrambled message: ")

print()
print()

alphabet = 65

for s in range (26):
    decrypt[s] = (alphabet)
    alphabet = alphabet + 1

print("The unscrambled alphabet is: ", end = "")


for num in range (26):
    print(chr(decrypt[num]), end = "")

print()
print()

print("Your unscrambled message reads: ")

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

Ex:Scrambled Alphabet = XQHAJDENKLTCBZGUYFWVMIPSOR,乱序消息= VNKW KW BO 1WV WJHFJV BJWWXEJ!

一切正常,直到我到达最后一个打印语句,其中说明未加扰的消息与加扰的消息相同。我知道这些指令需要一个while循环,但我无法弄清楚如何使用一个来解码字母表。

任何助手?

2 个答案:

答案 0 :(得分:2)

好吧,正如已经注意到的那样,你正在破坏你的decrypt变量。 但是,您也没有正确构建从“乱码”字母到正常字母的映射。

在不使用基本迭代而不是列表和简单列表函数(index())的情况下解密可能看起来像这样:

cleartext = ""
for c in msg:
    if c in alphabet:
        pos = alphabet.index(c)
        cleartext += string.ascii_uppercase[pos]
    else:
        cleartext += c

它不仅可以修补您的代码,还可以从一些改进中获益。我认为这可能是家庭作业,你可能不会想到这么远,但IMO无论如何学习它都没有错。

  • 您没有检查输入字母表是否仅包含您认为合法值的任何内容(例如,在这种情况下可能是A-Z),也不检查重复项。用户可以输入任何旧垃圾,否则会破坏您的程序。
  • 您的打印和循环不是很idiomatic
  • 函数有助于将代码分解为更易于阅读和维护的部分。
  • 这可能是老派或迂腐,但不推荐使用超过80个字符的行。相邻的字符串文字(例如“一”“两个”)将被连接(甚至跨越换行符)。

如果我必须在没有translate的情况下做你正在做的事情(见下文),我可能会做这样的事情(只是一个简单的例子,可能会通过一些工作得到改善):

import string

def validate(alpha):
    # Is it exactly 26 characters long?
    if len(alpha) != 26: return False
    for c in alpha:
        # Is every character in [A-Z]?
        if c not in string.ascii_uppercase: return False
        # Is this character duplicated?
        if alpha.count(c) > 1: return False
    return True


alphabet = ""
while not validate(alphabet):
    alphabet = input("Please input the encryption alphabet in order (only A-Z"
                     " allowed, with no duplicates): ")

msg = input("Now input your encrypted message: ")

print("Your encrypted alphabet is:", alphabet)
print("Your encrypted message is:", msg)

# Create a mapping from one alphabet to the other using a dictionary
table = dict(zip(alphabet, string.ascii_uppercase))
cleartext = "".join([table[c] if c in table else c for c in msg])

print("Your decrypted message reads:", cleartext)

最后,您也可以使用Python的内置字符串翻译来完成此操作,如下所示:

import string
# read and validate alphabet
# read message
print(str.translate(message, str.maketrans(alphabet, string.ascii_uppercase)))

答案 1 :(得分:1)

在你把所有乱码信写入其中后,你正在破解解密:

crypt = ["*"] * 26
for s in range (26):
    val = decrypt[s] - 65
    crypt[val] = (s + 65)