Vigenere Cipher,在122 / z之前循环

时间:2015-11-18 15:33:43

标签: python encryption ascii vigenere

我一直在编写一个Vigenere Cipher,但程序循环回到第26个字母z之前。如果值为122,则不是打印z,也可能是a,而是打印第96个ASCII字符 - “。

这是我的代码:

def getMode():
    while True:
       mode = input("enter encrypt, e, decrypt or d: ")
       if mode in 'encrypt e decrypt d ENCRYPT E DECRYPT D Encrypt Decrypt'.split():
           return mode
       else:
           input('Please enter encrypt or decrypt to start: ')

mode = getMode()
message = input('Enter your message: ')
for char in ' ?.,:;-!/':
    message = message.replace(char,'')
key = input('Enter the one word key: ')
times = len(message)//len(key)+1
encryptedKey = (times*key)[:len(message)]

output = []
for character in message:
    number = ord(character) - 96
    output.append(number)

outputKey = []
for character in encryptedKey:
    numberKey = ord(character) - 96
    outputKey.append(numberKey)

if mode[0] == 'd':
    outputKey = [-x for x in outputKey]

encryptedMessage = [(outputKey[i] + output[i])%26 for i in range(len(output))]
finalMessage = ''.join(chr(c + 96) for c in encryptedMessage)

print(message)
print(encryptedKey)
print(outputKey)
print(output)
print(encryptedMessage)
print('Your encrypted message is: ' + finalMessage)

基本上,如果我输入:

enter encrypt, e, decrypt or d: e
Enter your message: abcdefghijklmnopqrstuvwxyz
Enter the one word key: yo
abcdefghijklmnopqrstuvwxyz
yoyoyoyoyoyoyoyoyoyoyoyoyo
[25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
[0, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 1, 12, 3, 14, 5, 16, 7, 18, 9, 20, 11, 22, 13, 24, 15]
Your encrypted message is: `qbsdufwhyjalcnepgritkvmxo

应该是z,26的数字现在是`,而且我不知道我做了什么来提前循环。

这是一个小问题,但可以真正搞砸了这些消息。任何帮助都表示赞赏 - 如果有这样的问题(虽然我找不到),请将我重定向到它!

谢谢!

2 个答案:

答案 0 :(得分:0)

你的问题是26%26是0而不是26!所以不是z(chr(96 + 26)),而是得到一个`(chr(96 + 0))。

您可以轻松修复它,但可以在encrypted_message计算机中逐步修复它。 :

encryptedMessage = [(outputKey[i] + output[i] - 1)%26 + 1 for i in range(len(output))]

然后你会正确地得到:

[25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15, 25, 15]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
[26, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 1, 12, 3, 14, 5, 16, 7, 18, 9, 20, 11, 22, 13, 24, 15]
Your encrypted message is: zqbsdufwhyjalcnepgritkvmxo

答案 1 :(得分:0)

在ASCII中'a'是97。 你的第一个字符是0 + 96所以'''而不是'a'。

在加密'a'时,在严格的Vigenere密码中,它应该成为关联的关键字母('a'没有移位)。 在你的例子中,'a'变为0而不是25。

我认为你应该订购0到25而不是1到26的字母。即使用97而不是96。

所以你会得到0到25​​之间的数字。一旦你加上97,你就会得到你的字母从'a'到'z'。

希望我的答案没有大错。如果是这样,我会根据需要编辑或删除。 ; - )