gpt4 book ai didi

Python 凯撒密码索引错误

转载 作者:行者123 更新时间:2023-12-01 03:49:23 26 4
gpt4 key购买 nike

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

1) 对于给定的纯文本消息,在我的 LETTERS 字符串中查找每个消息符号的索引

2)将shift键添加到索引

3) 得到的数字就是密码符号的索引

4) 如果结果数字大于 LETTERS 字符串的长度,则从该数字中减去 LETTERS 字符串的长度(这将处理回绕到字符串开头的情况。

这是该程序的代码。

凯撒密码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()

程序似乎工作正常,但是当我运行测试用例时,我开始注意到一些 Shift 键在 encrypt_Message() 的以下行抛出 IndexError:

translated += LETTERS[num]

因此,我决定编写另一个脚本,使用 encrypt_Message() 中的代码来测试所有可能 key 的任何给定消息。我发现,我通过该函数传递的任何明文消息都会导致一些 Shift 键(通常是 5 - 10 个键)在同一行抛出 IndexError。所有其余 key 均按预期返回密文。

调试这些错误抛出键上的代码向我展示了为这些特定键翻译明文消息的一些要点,即以下行:

num = LETTERS.find(symbol)

返回 LETTERS 的长度而不是 LETTERS 中符号的索引,然后代码似乎从那里挂起。 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

请注意,对于包含 4 个元素的列表,x[4] 已经超出了范围。根据经验,可被视为入站的最大索引为 len(x) - 1

就您而言,错误是

if num > len(LETTERS):

应该是

if num >= len(LETTERS):

关于Python 凯撒密码索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com