凯撒密码验证

时间:2015-11-15 13:24:59

标签: python

我制作凯撒密码,一切都是我想要的,但是当我进入验证时,如果我进入' 123'它输出'您的翻译文本是:123' 当我希望它返回到getMessage()并告诉用户输入无效时。非常感谢帮助,因为我几天都在苦苦挣扎。

提前致谢。

            def getMode():
                 while True:
                     mode = input('Do you wish to encrypt(e) or decrypt(d) a message: ').lower()
                     if mode in 'encrypt e decrypt d'.split():
                         return mode
                     else:
                         print('Enter either "encrypt" or "e" or "decrypt" or "d".')

            def getMessage():
                 message = input('Enter your message: ')
                 return message

            def getKey():
                 key = 0
                 while True:
                     key = 5
                     return key

            def getTranslatedMessage(mode, message, key):
                 if mode[0] == 'd':
                     key = -key
                 translated = ''

                 for symbol in message:
                     if symbol.isalpha():
                         num = ord(symbol)
                         num += key

                         if symbol.isupper():
                             if num > ord('Z'):
                                 num -= 26
                             elif num < ord('A'):
                                 num += 26
                         elif symbol.islower():
                             if num > ord('z'):
                                 num -= 26
                             elif num < ord('a'):
                                 num += 26

                         translated += chr(num)
                     else:
                         translated += symbol
                 return translated



            mode = getMode()
            message = getMessage()
            key = getKey()

            print('Your translated text is: ', getTranslatedMessage(mode, message, key))

2 个答案:

答案 0 :(得分:3)

如果您只想允许字母字符:

def getMessage():
    while True:
        message = input('Enter your message: ')
        if message.isalpha():
            return message
        print("Invalid input, text must contain alphabetic characters only.")

允许空格和字母:

 if all(ch.isalpha() or ch.isspace() for ch in message):
            return message

dict和使用modulo将是一个更简洁的方法:

def get_mode():
    while True:
        mode = input('Do you wish to encrypt(e) or decrypt(d) a message: ').lower()
        if mode.lower() in {"e","d"}:
            return mode
        print('Enter either "encrypt" or "e" or "decrypt" or "d".')

def get_message():
    while True:
        message = input('Enter your message: ')
        if all(ch.isalpha() or ch.isspace() for ch in message):
            return message
        print("Invalid input, text must contain alphabetic characters only.")

def get_key():
    return 5

from string import ascii_letters

d = {k: i for i, k in enumerate(ascii_letters)}

enc = ascii_letters

def get_translated_message(mode, message, key):
    if mode == "e":
        return "".join([enc[(d[ch] + key) % 52] if not ch.isspace() else ch for ch in message])
    return "".join([enc[(d[ch] - key) % 52] if not ch.isspace() else ch for ch in message])

以同样的方式运行它:

mode = get_mode()
message = get_message()
key = get_key()

print('Your translated text is: ', get_translated_message(mode, message, key))

答案 1 :(得分:2)

您提到如果用户输入类似&#39; 123&#39;之类的内容,您希望返回错误。根据该要求,您的代码中的问题就在这里:

你正在做这个检查:

if symbol.isalpha():

将检查某些内容是否为alpha:A-Z

因此,在您的其他地方,您希望在alpha检查失败时返回错误:

所以当你这样做时:

else:
    translated += symbol

你想要这个:

else:
    return "input invalid"

然而,再一次,专注于您的代码,这带来了另一个问题。您需要更改处理方法返回的方式,因此输出更有意义。你可能想要考虑这样的事情:

mode = getMode()
message = getMessage()
key = getKey()

result = getTranslatedMessage(mode, message, key)
if not result:
    print("invalid")
else:
    print('Your translated text is: ', result)

根据最近的更新,您希望保留空白。因此,您应该考虑更改代码以处理空白,只需添加elif条件即可检查空格并将' '添加到translated变量中。因此,for循环中的代码将如下所示:

 for symbol in message:
         if symbol.isalpha():
             num = ord(symbol)
             num += key

             if symbol.isupper():
                 if num > ord('Z'):
                     num -= 26
                 elif num < ord('A'):
                     num += 26
             elif symbol.islower():
                 if num > ord('z'):
                     num -= 26
                 elif num < ord('a'):
                     num += 26

             translated += chr(num)
         elif symbol.isspace():
             translated += ' '
         else:
            return False

但是Padraic的方法非常好,绝对值得考虑重构。