Python Vigenère 密码输出与正确答案不匹配

问题描述 投票:0回答:1

我编写了一些用于解码维吉尼亚密码的代码。但它总是输出错误的解码消息。

这是我的代码:

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,但它找不到实际的错误。

python vigenere
1个回答
0
投票
  1. 根据维吉尼亚密码,当你应该向前移动字母时,你正在向后移动字母表中的字母。因此将

    letter_index = (char_index - key_index) % len(alphabet)
    替换为
    letter_index = (char_index + key_index) % len(alphabet)

  2. 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)

这将打印:

你能解码这个吗?干得好!你正在成为密码学方面的专家!

© www.soinside.com 2019 - 2024. All rights reserved.