字符串索引超出范围,Vigenere 密码

Posted

技术标签:

【中文标题】字符串索引超出范围,Vigenere 密码【英文标题】:String Index Out Of Range, Vigenere Cipher 【发布时间】:2015-09-23 23:13:29 【问题描述】:

我正在努力实现 Vigenere Cipher。我收到了错误:

IndexError: 字符串超出范围

import sys

# Get the message and key 
message = (sys.argv[1]).lower()
key = (sys.argv[2]).lower()

# Open file
f = open('Cipher.txt', 'w')

for i in range(len(message)):
    if i > len(key):
        j = i % len(key)
        f.write(str(ord(message[i]) + ord(key[j]) % 26 + ord('a')))
    else:
        f.write(str(ord(message[i]) + ord(key[i]) % 26 + ord('a')))
f.close()

我将在f.write(str(ord(message[i]) + ord(key[i]) % 26 + ord('a'))) 之后上线。我知道我的key 可能比message 的长度短,这就是为什么我在它前面打了一个检查。例如,如果我的密钥是 test,并且我已经到达第 5 个字符,我将回到 test 中的 t

【问题讨论】:

【参考方案1】:

如果是i == len(key),则返回值为i

替换

    if i > len(key):
        j = i % len(key)
        f.write(str(ord(message[i]) + ord(key[j]) % 26 + ord('a')))
    else:
        f.write(str(ord(message[i]) + ord(key[i]) % 26 + ord('a')))

与:

a = ord('a')
  ...
    j = i % (len(key) - 1)
    f.write(str((ord(message[i])-a + ord(key[j])-a) % 26 + a))

【讨论】:

这对我没有任何作用。 有效,但给出了错误的 unicode 字符,我相信我现在可以简单地修改这些值。谢谢! 另一件需要注意的事情是% 模运算符与*/ 具有相同的优先级,因此您可能想要这样:(ord(message[i]) + ord(key[j])) % 26 @MattBrzezinski 查看编辑。这也应该修复 unicode 字符

以上是关于字符串索引超出范围,Vigenere 密码的主要内容,如果未能解决你的问题,请参考以下文章

这个 Vigenere 密码中的“字符串索引超出范围”是啥意思?

Vigenere密码,如何处理超出字符值范围的序数值

Python 3.63,Vigenere 密码打印超出范围

/ password-reset /时的IndexError:重置密码时字符串索引超出范围

我的 vigenere 密码加密功能有啥问题?

数组索引超出范围