vigenere 密码的问题
Posted
技术标签:
【中文标题】vigenere 密码的问题【英文标题】:trouble with the vigenere cipher 【发布时间】:2015-05-20 19:45:42 【问题描述】:print ("")
print ("Welcome to Vigenere cipher!")
print ("")
print ("This program will encrypt then offer you a decryption of your message.")
print ("")
print ("Start this off with inputting your message you would like to encrypt.")
m = input("")
print ("")
print ("Now enter your keyword you would like to use. (it must be (" +str(len(m)),"or less letters.))")
k = input("")
if len(k) > len(m):
print ("")
print ("sorry this is an invaild keyword")
print ("Please re-enter your keyword.")
k = input("")
else:
print ("Your keyword is great. Lets keep going")
print ("")
print ("Is this correct?")
print ("")
print("-------\n"
"Message: ",m,"\n"
"Key: ",k,
"\n-------")
print ("")
print ("yes or no")
correct = input ("")
if 'yes'.startswith(correct.lower()):
print("Great! Lets keep going.")
else:
print ("You previously put: " +str(m), " as your message.")
print ("Please re-enter the keyword you wish to use. (it must be (" +str(len(m)),"or less letters.))")
k = input("")
encrypted = ("")
print ("")
for a in m:
print ("The message letters are")
encrypt2 = ord(a)
for b in k:
print ("The keyword letters are")
encrypt = ord(b)
encrypt3 = (encrypt) + (encrypt2)
encrpyted = chr(encrypt3)
print (chr(encrypt3))
我需要用关键字加密,有什么帮助吗? ps 它需要像上面的代码一样基本。 它适用于 GCSE(英国) 如果它需要一些命令,那么你能告诉我它们是做什么的吗:),所以我可以在任务中解释它:)
【问题讨论】:
可能缺少某些代码。但这一切都应该是这样的 我们不是来帮你作弊的,@GeorgeTaylder。请阅读***.com/help/how-to-ask 这段代码有什么问题?除此之外,您想重新查看您的if 'yes'.startswith
语句(打印需要缩进并且该代码不是检查“是”的最佳逻辑)。还是您只是需要帮助理解该加密方法的逻辑?
对于第二部分(vigenere ciphers),可以在chapter 19 of Invent with Python找到这个问题的一个非常简单的例子(附解释)
它只是加密,其余的我想让它看起来更好一点,如果你明白我的意思的话。
【参考方案1】:
首先,你的问题失败了:
for a in m:
上的所有代码都是不必要的,所有这些都不是您的问题的一部分,您真正的问题是使用 vigenere 密码算法加密一个单词,这可以用两行替换:
message = "ATTACKATDAWN"
key_adj = "LEMONLEMONLE"
或者如果你喜欢
message = "ATTACKATDAWN"
key = "LEMON"
#key_adj and message equal length
key_adj = key + key*((len(message)/len(key))-1) + key[:len(message)%len(key)]
#key_adj is LEMONLEMONLE
注意:我重命名变量,以便帮助您的人更好地理解,
由于输入现在没有问题,我可以解决问题
第二,你的算法失败:
最明显的错误是使用嵌套的for
,越多越好,这会使您的解决方案复杂化,对于这个问题,您只需要一个for
for a in m:
for b in k:
....
第二次失败,是密码方程....例如,第一个字母:
letter_menssage = "A" -> ord("A") = 65 letter_key = "L" -> ord("L") = 76 +141 -> chr(141) = "ì"有了所有这些解释,现在我可以展示一个解决方案:
#i use zip function, match letter message with letter key
# (A,L) (T,E) (T,M) (A,O) (C,N) (K,L) etc.
encrypt = ""
for letter_msg, letter_key in zip(message, key_adj):
code_letter_msg = ord(letter_msg)-ord('A')
code_letter_key = ord(letter_key)-ord('A')
encrypt += chr((code_letter_msg+code_letter_key) % 26 + ord('A'))
print (encrypt)
你得到:
LXFOPVEFRNHR
解释方程:
letter_menssage = "A" -> ord("A")-65 = 0 letter_key = "L" -> ord("L")-65 = 11 ((0+11)%26 + 65)-> chr(76) = "L" letter_menssage = "T" -> ord("A")-65 = 19 letter_key = "E" -> ord("E")-65 = 4 ((19+4)%26 + 65)-> chr(88) = "X"【讨论】:
不不不。我想要它,以便用户可以输入消息和密钥,然后它将通过关键字给出加密消息。我不想从 k = input ("") 编辑任何内容 @GeorgeTaylder 是的,我明白....但是输入不是你的问题,这是多种原因之一,你得到了有问题的负面因素以上是关于vigenere 密码的问题的主要内容,如果未能解决你的问题,请参考以下文章