python - 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 新手,无法修复此错误。在下面的屏幕截图中,您可以看到,它有时有效,有时无效。
解决方案
当你设置你的临时变量时,你使用 %26 它将返回一个介于 0 和 25 之间的 int。但你的字典中的键范围是从 1 到 26。每当 temp 设置为零时,您的代码就会中断。您需要将字典中的键更改为 0 到 25 的范围
推荐阅读
- angularjs - AngularJS 组件和等待同步功能
- java - 更改返回堆栈活动按钮状态
- python - 创建一个返回新字典的函数
- azure - VM 数据磁盘使用的存储帐户
- c# - 检查树节点的 ACL 角色权限
- kubectl - 如何获取 Kubernetes 机密文件?
- json - 使用泛型和 Decodable 解码 JSON 数组
- angular - Angular Material: mat-dialog 打开多个对话框。退订?
- excel - 试图改变 Cell 的 Comment 对象的属性。Excel生成的宏不起作用
- microsoft-graph-api - 使用 Microsoft Graph API 的 Webhook 通知