用于解密的 Vigenere 密码“字符串索引超出范围”

Posted

技术标签:

【中文标题】用于解密的 Vigenere 密码“字符串索引超出范围”【英文标题】:Vigenere cipher 'string index out of range' for decryption 【发布时间】:2015-09-15 20:36:12 【问题描述】:

我的 Vigenere 密码非常适合加密,但我只需要解决这个问题以进行解密,在运行程序后,我被告知字符串索引超出范围。有人可以让我知道我需要将其更改为什么,如果可以的话,我将不胜感激。

编辑:我已经更改了导致字符串索引问题的代码部分,但现在,在处理解密时,输出是一个空白行,其下方为“无”且没有错误。

编辑:ord(_key_text[letters%len(_key_text)]) 我需要在解密的等式这一边用 _key_phrase 替换 _key_text。

#encryption
def encrypt():
    crypt = ''
    key_phrase = raw_input("Please enter a key phrase to encrypt by: ")
    key_phrase = key_phrase.upper()
    key_text = raw_input("Please enter a piece of text to encrypt: ")
    key_text = key_text.upper()
    if len(key_text) == 0: 
        print("Key must be of length 1 or more."); exit()
    if not key_text.isalpha() or not key_phrase.isalpha():
        print("Both text and key must be composed of letters only."); exit()
    for letters in range(0, len(key_text)):
        new = ord(key_text[letters]) + ord(key_text[letters%len(key_text)]) - 65
       if new > 90:
            new -= 26
        crypt += chr(new)
    print crypt

#decryption
def decrypt():
    decrypt = ''
    _key_phrase = raw_input("Please enter a key phrase to encrypt by: ")
    _key_phrase = _key_phrase.upper()
    _key_text = raw_input("Please enter a piece of text to encrypt: ")
    _key_text = _key_text.upper()
    if len(_key_text) == 0: 
        print("Key must be of length 1 or more."); exit()
    if not _key_text.isalpha() or not _key_phrase.isalpha():
        print("Both text and key must be composed of letters only."); exit()
    for letters in range(0, len(_key_text)):
        new = ord(_key_text[letters]) - ord(_key_text[letters%len(_key_text)]) + 65
        if new < 65:
            new += 26
        decrypt == chr(new)
    print decrypt

#asking the user to enter a or b for en/decryption and whether they wish to continue
choice = raw_input("Please enter either 'a' for encryption or 'b' for decryption: ")
if choice == 'a':
    print encrypt()
else:
    print decrypt()

【问题讨论】:

发布回溯会有帮助 顺便说一句,range() 中的起始值不需要显式设置为 0。0 是默认值,在这种情况下您可以省略它。 进一步考虑: 1. 在print encrypt()print decrypt() 中不能有print。 2. 您要求在decrypt 函数中输入加密密钥和文本。 3. 你的函数只加密和解密没有空格的文本。 4. 加密文本比原始文本短。我认为 Vigenere 密码不正确。 【参考方案1】:

如果您的关键文本比关键短语长,您将在此处获得无效索引: new = ord(_key_phrase[letters]) - ord(_key_text[letters%len(_key_text)])letters大于len(_key_text)

您在encryptionkey textkey phrase 的两个地方都有key_text 进行解密,因此您必须在此处更改一个变量。

【讨论】:

感谢您对字符串索引的帮助,但现在我的结果是一个空行,后跟“无”。你知道为什么会这样吗? Noneencryptdecrypt 函数的返回值。你在print-statements 中打印它。你得到一个空行,因为你的算法不正确,我认为。 ord(_key_text[letters%len(_key_text)]) 我需要在等式的这一边用 _key_phrase 替换 _key_text。谢谢你的帮助。

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

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

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

Python 中的 Vigenere 密码

尝试加密和解密 vigenere 密码

Vigenere 密码解密问题

使用修改后的 Vigenere 密码算法,解密不会导致原始输入 [关闭]