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 密码的问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试加密和解密 vigenere 密码

Vigenere密码[关闭]

Vigenere 密码语法错误

在 vigenere 密码中查找密钥的长度

vigenere 密码的问题

java中的ASCII Vigenere密码实现