Python密码索引器

Python密码索引器,python,Python,运行python 3.5。 我开始研究基本加密,我决定尝试写一个简单的凯撒密码。非常直截了当的逻辑: 1) 对于给定的明文消息,请在“我的字母”字符串中查找每个消息符号的索引 2) 将shift键添加到索引中 3) 结果数字是密码符号的索引 4) 如果结果数字大于字母字符串的长度,则从数字中减去字母字符串的长度(这将处理回字符串开头的换行) 这是这个程序的代码 凯撒密码2.py LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrustu

运行python 3.5。 我开始研究基本加密,我决定尝试写一个简单的凯撒密码。非常直截了当的逻辑:

1) 对于给定的明文消息,请在“我的字母”字符串中查找每个消息符号的索引

2) 将shift键添加到索引中

3) 结果数字是密码符号的索引

4) 如果结果数字大于字母字符串的长度,则从数字中减去字母字符串的长度(这将处理回字符串开头的换行)

这是这个程序的代码

凯撒密码2.py

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):