Python中的Vigenere密码不适用于大写/小写字母转换
Posted
技术标签:
【中文标题】Python中的Vigenere密码不适用于大写/小写字母转换【英文标题】:Vigenere cipher in Python not working for uppercase/lowercase letter conversion 【发布时间】:2019-10-02 17:15:29 【问题描述】:作为我目前正在参加的 CS50 哈佛编程课程的一部分,我正在做一个名为“Vigenere”的练习。
Vigenere 的密码应该有一个密钥作为输入,例如“abcd”。这将根据密钥中的每个字符对任何明文进行编码,其中 a = 0 和 b = 1 等。因此,带有明文“aa!aa”的密钥“abcd”将给出“ab!cd”。如果明文比密钥长,则密钥应该循环回 [0] 并重新开始,直到明文全部被编码。但是,非字母字母应该可以正常打印出来。
我的程序做的一切都是正确的(它逐行进行并且满足了预期的行为),除非我收到以大写字母后跟小写字母开头的输入,我的程序使用小写键打印一个不同的字母然后它应该给我。例如:键:“Baz”。明文:“aaa”。结果:“bgz”应该返回“baz”。
一直在谷歌搜索,调试,但就是想不通。也尝试过很多其他不同的方式,但我就是无法让它发挥作用。 (对不起,复制粘贴的那种,你可能注意到我已经发布了一个类似的问题,但是那是在 C(这是 python)中,它是另一种错误)
代码:
import sys
if len(sys.argv) != 2 or not sys.argv[1].isalpha():
print("usage: python vigenere.py keyword")
sys.exit()
cipher = sys.argv[1]
plaintext = input("plaintext: ")
j = 0
def code(j):
for key in cipher:
if key.islower():
return ord(cipher[j]) - 97
if key.isupper():
return ord(cipher[j]) - 65
print("ciphertext: ", end="")
for letters in plaintext:
if letters.islower():
print(chr(((ord(letters) - 97 + code(j)) % 26) + 97), end="")
j += 1
if letters.isupper():
print(chr(((ord(letters) - 65 + code(j)) % 26) + 65), end="")
j += 1
if j == len(cipher):
j = 0
if not letters.isalpha():
print(letters, end="")
print("")
【问题讨论】:
欢迎来到 ***。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确说明问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您指定的问题。您的帖子需要外部输入和外部模块;我们希望它是独立的。 你也忽略了演示问题:“my program bugs out”不是错误说明。 欢迎来到 SO。尝试使您发布的任何问题都可以复制给任何出现的人。您有一个针对特定大学课程的自定义库 (cs50),我猜只有极少数人已经拥有该库。您导入的函数 看起来 足够基本,可以让您自己实现,(将 get_string 替换为输入????) @SyntaxVoid 好的对不起,我编辑了帖子,你应该可以复制粘贴 rn 除了“bugs out”之外,您能否更具体地了解该错误?怎么了?你期望的输出是什么,你实际得到了什么? 【参考方案1】:您的代码中的问题是由您的code
函数引起的。
在其中,您使用for key in cipher:
行,然后使用if key.islower():
或if key.isupper():
进行检查。
问题是每次我们进入code
函数时,由于for循环,我们只检查密码中的第一个字母是大写还是小写。
例如。对于密码“Baz”,j = 0,我们检查 B 是否为上/下,并获得上。我们立即返回大写 B
对于密码“Baz”,j = 1,我们检查 B 是否为上/下,并获取上。我们立即返回上 A。(当我们应该检查上/下的 a,并返回下 a!)
通过检查密码的正确字母的大小写来解决此问题,并且可以通过将for key in cipher:
替换为key = cipher[j]
来解决此问题,如下块所示:
def code(j):
key = cipher[j]
if key.islower():
return ord(key) - 97
if key.isupper():
return ord(key) - 65
进行更改后,对于以下输入:
cipher = "BazBgh" 明文 = "aaaaAa"
我们得到
密文:bazbGh
【讨论】:
你太棒了!非常感谢!向 SO 上的每个人道歉,因为在没有提供正确代码的情况下创建了这篇文章(由于自定义功能,一开始无法复制粘贴),但已经注意到规则并将遵守它们。再次感谢 哦,np @AltijdGoed。很高兴我能帮上忙。重要的是态度,不要因最初的反应而气馁。我个人发现您的问题已经过充分的编辑,可以帮助您回答问题,因此使您的问题得到充分解释并提供足够的示例将帮助您顺利通过。祝你好运! 顺便说一下@AltijdGoed,如果它有助于解决您的问题,请不要忘记接受答案;这基本上可以让其他人看到您的问题已在问题提要中得到解决。以上是关于Python中的Vigenere密码不适用于大写/小写字母转换的主要内容,如果未能解决你的问题,请参考以下文章