首页 > 解决方案 > Vernam Cipher KeyError:0 Python

问题描述

我试图使用 python 编程语言创建 Vernam Cipher 加密和解密技术。但有时它有效,有时无效。我不确定确切的错误是什么。只收到 Keyerror 0 消息。

import string
import random

number_to_alphabet_dict = { 1:'a',2:'b',3:'c',4:'d',5:'e'
                           ,6:'f',7:'g',8:'h',9:'i',10:'j'
                           ,11:'k',12:'l',13:'m',14:'n',15:'o'
                           ,16:'p',17:'q',18:'r',19:'s',20:'t'
                           ,21:'u',22:'v',23:'w',24:'x',25:'y'
                           ,26:'z'}

alphabet_to_number_dict = {  'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5
                           , 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10
                           , 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15
                           , 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20
                           , 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25
                           , 'z': 26}
def getMode():
    while True:
        print("Do you want to encrypt or decrypt the message")
        mode = str(input()).lower()
        if mode in 'encrypt e decrypt d'.split():
            return mode
        elif mode in 'exit quit'.split():
            break
        else:
            print("Enter either 'encrypt' or 'e' for Encryption or 'decrypt' or 'd' for Dycryption")
def getMessage():
    print("Enter the message:")
    message = str(input())
    message = message.lower()
    return message

def generateKey(message):
    key = ''.join([random.choice(string.ascii_letters) for n in range(len(message))])
    key = key.lower()
    return key

def getKey():
    print("Enter the key:")
    key = str(input())
    key = key.lower()
    return key

def cipherText(message,key):
    encrypted_message =''
    index = 0
    for symbol in message:
        temp = (alphabet_to_number_dict[symbol] + alphabet_to_number_dict[key[index]]) % 26
        encrypted_message = encrypted_message +number_to_alphabet_dict[temp]
        index = index + 1
        if index == len(key):
            index = 0
    return encrypted_message

def plainText(message,key):
    decrypted_message =''
    index = 0
    for symbol in message:
        temp = (alphabet_to_number_dict[symbol] - alphabet_to_number_dict[key[index]]) % 26
        decrypted_message = decrypted_message +number_to_alphabet_dict[temp]
        index = index + 1
        if index == len(key):
            index = 0
    return decrypted_message

while True:
    print("Do you want to encrypt or decrypt the message")
    mode = str(input()).lower()
    if mode in 'encrypt e decrypt d'.split():
        if mode[0]=='e':
            message = getMessage()
            key = generateKey(message)
            print("Plain Message is {0}".format(message))
            print("Encryption Key is {0}".format(key))
            cipher_text = cipherText(message,key)
            print("Encrypted Message is {0}".format(cipher_text))
        elif mode[0]=='d':
            message = getMessage()
            key = getKey()
            print("Cipher Message is {0}".format(message))
            print("Decryption Key is {0}".format(key))
            plain_text = plainText(message,key)
            print("Plain Message is {0}".format(plain_text))
        else:
            print("Enter either 'encrypt' or 'e' for Encryption or 'decrypt' or 'd' for Dycryption.")  
    elif mode in 'exit quit'.split():
            break

请帮助我。我是 python 新手,无法修复此错误。在下面的屏幕截图中,您可以看到,它有时有效,有时无效。

在此处输入图像描述

标签: pythonpython-3.xcryptography

解决方案


当你设置你的临时变量时,你使用 %26 它将返回一个介于 0 和 25 之间的 int。但你的字典中的键范围是从 1 到 26。每当 temp 设置为零时,您的代码就会中断。您需要将字典中的键更改为 0 到 25 的范围


推荐阅读