我编写了一些用于解码维吉尼亚密码的代码。但它总是输出错误的解码消息。
这是我的代码:
alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
v_message= "txm srom vkda gl lzlgzr qpdb? fepb ejac! ubr imn tapludwy mhfbz cza ruxzal wg zztylktoikqq!"
keyword = "friends"
def vigenere_cipher(message, keyword):
decoded = []
for i in range(len(message)):
char = message[i]
if char.isalpha():
char_index = alphabet.index(char)
key_index = alphabet.index(keyword[i % len(keyword)])
letter_index = (char_index - key_index) % len(alphabet)
decoded.append(alphabet[letter_index])
else:
decoded.append(char)
return "".join(decoded)
print(vigenere_cipher(v_message, keyword))
它给我的输出是:
oge fowh ngqx bu hmioua mcaj? xacy zssy! cwa ezk ojhhhaet edsyh lrw ocsish to irplisoxagdn!
我不知道这是怎么回事。谁能帮我修复我的代码吗?
我也询问过chatGPT,但它找不到实际的错误。
根据维吉尼亚密码,当你应该向前移动字母时,你正在向后移动字母表中的字母。因此将
letter_index = (char_index - key_index) % len(alphabet)
替换为 letter_index = (char_index + key_index) % len(alphabet)
i
不应因空格而递增。
def vigenere_cipher(message, keyword):
decoded = []
i = 0
for char in message:
if char.isalpha():
char_index = alphabet.index(char)
key_index = alphabet.index(keyword[i % len(keyword)])
letter_index = (char_index + key_index) % len(alphabet)
decoded.append(alphabet[letter_index])
i += 1
else:
decoded.append(char)
return "".join(decoded)
这将打印:
你能解码这个吗?干得好!你正在成为密码学方面的专家!