Python密码索引器
运行python 3.5。 我开始研究基本加密,我决定尝试写一个简单的凯撒密码。非常直截了当的逻辑: 1) 对于给定的明文消息,请在“我的字母”字符串中查找每个消息符号的索引 2) 将shift键添加到索引中 3) 结果数字是密码符号的索引 4) 如果结果数字大于字母字符串的长度,则从数字中减去字母字符串的长度(这将处理回字符串开头的换行) 这是这个程序的代码 凯撒密码2.pyPython密码索引器,python,Python,运行python 3.5。 我开始研究基本加密,我决定尝试写一个简单的凯撒密码。非常直截了当的逻辑: 1) 对于给定的明文消息,请在“我的字母”字符串中查找每个消息符号的索引 2) 将shift键添加到索引中 3) 结果数字是密码符号的索引 4) 如果结果数字大于字母字符串的长度,则从数字中减去字母字符串的长度(这将处理回字符串开头的换行) 这是这个程序的代码 凯撒密码2.py LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrustu
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrustuvwxyz1234567890!@#$%^&*()><.,?/"
message = str(input("Enter a message. "))
key = int(input("Enter a whole number key (1-79). "))
mode = str(input("Press 'E' to encrypt or 'D' to decrypt. "))
def encrypt_message(plain_message):
translated = " "
for symbol in plain_message:
if symbol in LETTERS:
num = LETTERS.find(symbol)
num += key
if num > len(LETTERS):
num -= len(LETTERS)
translated += LETTERS[num]
else:
translated += symbol
return translated
def decrypt_message(cipher_message):
translated = " "
for symbol in cipher_message:
if symbol in LETTERS:
num = LETTERS.find(symbol)
num -= key
if num < 0:
num += len(LETTERS)
translated += LETTERS[num]
else:
translated += symbol
return translated
def main():
if mode == "E" or mode == "e":
print(encrypt_message(message))
elif mode == "D" or mode == "d":
print(decrypt_message(message))
if __name__ == "__main__":
main()
因此,我决定编写另一个脚本,使用encrypt_Message()中的代码来测试任何给定消息中所有可能的密钥。我发现,通过该函数传递的任何明文消息都会产生一些移位密钥(通常为5-10个密钥)在同一行上抛出索引器。所有其余的密钥按预期返回密文
调试这些错误抛出键上的代码表明,在为这些特定键翻译明文消息时,行:
num = LETTERS.find(symbol)
返回字母的长度,而不是字母中符号的索引,然后代码似乎从此处挂起。if语句不会触发以调整num变量,因此当它到达转换语句时,num变量已超出索引范围
我的问题是为什么会发生这种情况?为什么代码对大多数键都能正常工作,而对其余的键却抛出了这个异常
有什么想法吗?
谢谢。Python索引列表从0开始。这将产生以下效果:
>>> x = ['a', 'b', 'c', 'd']
>>> len(x)
4
>>> x[0]
'a'
>>> x[3]
'd'
>>> x[4]
IndexError: list index out of range
请注意,x[4]
已经超出了包含4个元素的列表的范围。根据经验,可以在边界内考虑的最大索引是len(x)-1
在你的情况下,错误是
if num > len(LETTERS):
应该是哪一个
if num >= len(LETTERS):
我认为问题在于您的检查“if num>len(字母)”。它应该是“if num>=len(字母)”因为如果它等于列表的长度,它就超出了范围。我认为@Byteventurer是个问题,但是你能为抛出异常的情况粘贴准确的回溯吗。回溯是你的朋友!这就是为什么我爱你们。我断断续续地调试这件事好几天了,但我忽略了完整的回溯谢谢你的新眼光。
if num >= len(LETTERS):