Python - 尝试编写一个不会忽略空格的vigenere密码

时间:2018-02-19 16:22:23

标签: python python-3.x encryption vigenere

我尝试更改我的Vigenere程序,以便输出带空格的消息。 它应该这样做: translatedMessage(' JPZFR DTZA NKC HFHOUC','多云',' d')=> '来自未来'

 def translateMessage(message, key, mode):
    translated = ''
    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    keyIndex = 0
    message = message.upper()
    key = key.upper()

    for symbol in message:
        xyz = alphabet.find(symbol.upper())
        if xyz != -1:
            if mode == 'encrypt' or 'e':
                xyz += alphabet.find(key[keyIndex]) + 1
            elif mode == 'decrypt' or 'd':
                xyz -= alphabet.find(key[keyIndex]) + 1

            xyz %= len(alphabet)

            if symbol.isupper():
                translated += alphabet[xyz]
            elif symbol.islower():
                translated += alphabet[xyz].lower()

            keyIndex += 1
            if keyIndex == len(key):
                keyIndex = 0
        else : translated += symbol #this will add space as it is

    return translated

相反,它给出了这个: translatedMessage(' JPZFR DTZA NKC HFHOUC','多云',' d')=> ' MBOAV CWLP IOB KRWJYB'

1 个答案:

答案 0 :(得分:2)

您的代码看起来很好,但您可以注意到,无论您选择何种模式,您始终都会加密。

这是由你的

引起的
if mode == 'encrypt' or 'e':

线。由于or的{​​{3}}低于==,因此会将其解析为:

if (mode == 'encrypt') or 'e':

由于mode是' d,(mode == 'encrypt')False。但由于'e'是非空字符串,因此它在布尔上下文中求值为True。 因此,无论您选择何种模式,(mode == 'encrypt') or 'e'始终为True

您需要的是:

  if mode == 'encrypt' or mode =='e':