问题描述
我的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密码'字符串索引超出范围'用于解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!