【问题标题】:Python - Tried to write a vigenere cipher that doesn't ignore spacesPython - 试图编写一个不忽略空格的 vigenere 密码
【发布时间】:2018-07-29 22:11:20
【问题描述】:

我尝试更改我的 Vigenere 程序,使其输出带有空格的消息。 它应该这样做: translateMessage('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

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

【问题讨论】:

  • 请注意:您可以使用 string.ascii_uppercase 而不是 alphabet
  • 问题是什么?您是否尝试过在循环中打印以查看可能发生的情况?

标签: python python-3.x encryption vigenere


【解决方案1】:

您的代码看起来基本没问题,但您会注意到,无论您选择何种模式,您总是加密。

这是你造成的

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

线。因为oroperator precedence== 低,所以解析为:

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

因为mode 是'd',所以(mode == 'encrypt')False。但由于'e' 是一个非空字符串,它在布尔上下文中计算为True。 所以,(mode == 'encrypt') or 'e' 始终是 True,无论您选择哪种模式。

你需要的是:

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

【讨论】:

  • mode.lower() in ('encrypt', 'e') 可能更简单、更高效。无论如何 +1。
  • {'encrypt', 'e'} 会更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多