Vigenere密码'字符串索引超出范围'用于解密 [英] Vigenere cipher 'string index out of range' for decryption

查看:190
本文介绍了Vigenere密码'字符串索引超出范围'用于解密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的Vigenere密码非常适用于加密,但是我需要解决这个解密问题,在运行程序之后,字符串索引超出范围。有人可以让我知道我需要改变它,如果可以的话我会非常感激。



编辑:我已经改变了导致字符串索引问题的代码部分,但是现在,当处理解密时,输出是一个空行,None这个没有错误。



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

  #encryption 
def encrypt():
crypt =''
key_phrase = raw_input (请输入一个关键短语加密通过:)
key_phrase = key_phrase.upper()
key_text = raw_input(请输入要加密的文本:)
key_text = key_text.upper()
if len(key_text)== 0:
print(Key must be length 1 or more。); exit()
如果不是key_text.isalpha()或不是key_phrase.isalpha():
print(文本和键都只能由字母组成);对于范围(0,len(key_text))中的字母,exit()

new = ord(key_text [letters])+ ord(key_text [letters%len(key_text)]) - 65
如果新的> 90:
new - = 26
crypt + = chr(new)
打印crypt

#decryption
def decrypt():
decrypt =''
_key_phrase = raw_input(请输入一个密码短语加密:)
_key_phrase = _key_phrase.upper()
_key_text = raw_input(请输入一段文字加密:)
_key_text = _key_text.upper()
if len(_key_text)== 0:
print(Key must be length 1 or more。 exit()
如果不是_key_text.isalpha()或不是_key_phrase.isalpha():
print(文本和键都只能由字母组成); exit()
为范围内的字母(0,len(_key_text)):
new = ord(_key_text [letters]) - ord(_key_text [letters%len(_key_text)])+ 65
如果新的< 65:
new + = 26
decrypt == chr(new)
print decrypt

#asking用户输入a或b进行en /他们希望继续
choice = raw_input(请输入a进行加密或b进行解密:)
如果选择=='a':
print encrypt()
else:
print decrypt()


解决方案

如果您的密钥文本长于密钥短语,您将在此处获得无效索引:
new = ord(_key_phrase [letters]) - ord(_key_text [letters%len(_key_text )])
字母变得大于 len(_key_text) / p>

您在加密中的两个地方都有 key_text code>密钥文本和密钥短语在解密,所以你必须在这里更改一个变量。


my Vigenere cipher works perfectly for encryption but I just need to fix this problem for decryption where I am told, after running the program, that the string index is out of range. Could someone please let me know what i need to change it to, I would be extremely grateful if you could.

edit: I have changed the part of the code that was causing the string index problem but now, when processing decryption, the output is a blank line with 'None' beneath it and no error.

edit: ord(_key_text[letters%len(_key_text)]) i needed to replace _key_text with _key_phrase on this side of the equation in decrypt.

#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()

解决方案

If your key text is longer than key phrase you'll get an invalid index here : new = ord(_key_phrase[letters]) - ord(_key_text[letters%len(_key_text)]) when letters becomes greater than len(_key_text)

You have key_text on both places in encryption and key text and key phrase in decryption so you have to change one variable here.

这篇关于Vigenere密码'字符串索引超出范围'用于解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆