【问题标题】:Need fresh eyes on a cipher program需要对密码程序有新的认识
【发布时间】:2017-11-28 19:10:06
【问题描述】:

我已经在 python 中的密码程序上工作了一段时间,用于在线课程。我一直在成功和挫折之间来回走动,最近我以为我已经弄明白了。也就是说,直到我将我得到的输出与课程所说的我实际应该得到的输出进行比较。当我输入“乌鸦在午夜飞!”和“boom”键,我应该回来“Uvs osck rwse bh auebwsih!”但取而代之的是“Tvs dfci tzufg mu auebwsih!”我对我的程序正在做什么感到茫然,并且可以从某人那里再次查看我的程序。不幸的是,我在现实生活中没有一个人可以去哈哈。非常感谢任何帮助。

alphabet = "abcdefghijklmnopqrstuvwxyz"
def alphabet_position(letter):
    lower_letter = letter.lower()   #Makes any input lowercase.
    return alphabet.index(lower_letter) #Returns the position of input as a number.

    def vigenere(text,key):
        m = len(key)
        newList = ""

        for i in range(len(text)):
            if text[i] in alphabet:
                text_position = alphabet_position(text[i])
                key_position =  alphabet_position(key[i % m])
                value = (text_position + key_position) % 26
                newList += alphabet[value]
            else:
                newList += text[i]
        return newList


    print (vigenere("The crow flies at midnight!", "boom"))

    # Should print out Uvs osck rmwse bh auebwsih!
    # Actually prints out Tvs dfci tzufg mu auebwsih!

【问题讨论】:

  • 你真的应该学习如何使用调试器。这是编程的要求,确实如此。
  • 我应该使用哪一个?我在一本启用了开发者模式并安装了 python 的 chrome 书上
  • 我不知道 chrome book 但我使用 pycharm IDE。在此之前,我使用 Eclipse IDE 和 pydev 插件。
  • 谢谢,我会查一下这两个。我正在学习只使用浏览器内置解释器的初学者课程。

标签: python encryption vigenere


【解决方案1】:

在您的 vigenere 函数中,转换 set text = text.lower() 。
要查找此类问题,只需跟随一个字母并查看会发生什么,很容易看出它不起作用,因为“T”不在字母表中,但“t”在字母表中,因此您应该将文本转换为小写。

【讨论】:

  • 这很接近,但由于 'T' 映射到 'U' 而不是 'u' 它有点复杂。
  • 是的,但不是很复杂:) 我们会让他弄清楚。我现在也看到他有上面提到的 Bit 的空间问题。
【解决方案2】:

问题似乎在于您没有提醒处理空格。 “boom”的“m”应该用来加密“crow”的“c”,而不是“The”和“crow”之间的空格

【讨论】:

  • 哦,我该如何让程序注意空格?
  • @Harindu Dilshan 总结得很好,另一方面,您应该考虑研究一下 python 中的内置函数。您可以使用 enumerate() 函数来节省缩进空间
  • 谢谢,我会这样做的。该课程仅教授非常基础的内容,因此尚未对内置插件进行过多解释。
  • 我快速查找了枚举函数。你是说在这种情况下我应该使用它而不是“for i in range(len(text))”?
  • 是的,像 'for i, c in enumerate(text):' 这样的东西有点 Pythonic 并且让你的代码对其他程序员更具可读性(我会更正自己,这与缩进无关本例)
【解决方案3】:

好的。问题是预期的密码跳过了非字母字符并使用相同的密钥继续下一个字母。但是在您的实现中,您也跳过了密钥。

乌鸦

boo mboo // 预期的

boo boom // 你的版本

所以这里是更正的代码:

alphabet = "abcdefghijklmnopqrstuvwxyz"
def alphabet_position(letter):
lower_letter = letter.lower()   #Makes any input lowercase.
return alphabet.index(lower_letter)  #Returns the position of input as a number.

def vigenere(text,key):
    text_lower = text.lower()
    m = len(key)
    newList = ""
    c = 0
    for i in range(len(text)):
        if text_lower[i] in alphabet:
            text_position = alphabet_position(text[i])
            key_position =  alphabet_position(key[c % m])
            value = (text_position + key_position) % 26
            if text[i].isupper():
              newList += alphabet[value].upper()
            else:  
              newList += alphabet[value]
            c += 1
        else:
            newList += text[i]
            
    return newList


 print (vigenere("The crow flies at midnight!", "boom"))
 # Should print out Uvs osck rmwse bh auebwsih!
 # Actually prints out Tvs dfci tzufg mu auebwsih!

【讨论】:

  • 谢谢!它工作完美。我目前正在研究它以真正了解它对我的代码产生的影响。
  • 它使用一个新的变量'c'作为关键字母的位置。所以遇到非字母字符时可以选择跳过或不跳过。
  • 谢谢!我只是在看它并查找模数在编程中的更多技术用途,以更好地理解它们
最近更新 更多