You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vigenère Cipher解密异常:Python代码密钥迭代逻辑错误排查

Vigenère密码解密问题修复

你的代码存在三个核心问题,导致解密结果错误:

  • 密钥未循环迭代:你先遍历了一遍密钥,最终key_val仅保留了密钥最后一个字母s的索引(18),解密时所有字母都复用这个值,完全没用到前面的密钥字母。
  • 运算逻辑搞反:Vigenère解密需要用密文字母索引减去密钥字母索引再模26,你用成了相加,这相当于对密文再次加密,而非解密。
  • 密钥位置未正确跟踪:遇到标点、空格等非字母字符时,密钥不应该前进,你的代码没有处理这个规则。

修正后的代码

message = "dfc aruw fsti gr vjtwhr wznj? vmph otis! cbx swv jipreneo uhllj kpi rahjib eg fjdkwkedhmp!"
alpha = "abcdefghijklmnopqrstuvwxyz"
punc = ".!? \/$@^%&*'"

def decoder(message, key):
    decoded = ""
    key_index = 0  # 跟踪当前使用的密钥字母位置
    key_length = len(key)
    
    for letter in message:
        if letter not in punc:
            # 获取密文和密钥对应的索引值
            message_val = alpha.find(letter)
            key_val = alpha.find(key[key_index % key_length])  # 循环复用密钥
            
            # 解密运算:密文索引 - 密钥索引,模26处理边界情况
            decoded_val = (message_val - key_val) % 26
            decoded += alpha[decoded_val]
            
            # 仅处理字母时才移动密钥指针
            key_index += 1
        else:
            # 非字母字符直接保留
            decoded += letter
    return decoded

# 执行解密并打印结果
print(decoder(message, "friends"))

关键修正说明

  1. 密钥循环逻辑:通过key_index % key_length实现密钥的循环复用,每次处理一个字母后递增key_index,确保密钥按顺序对应每个密文字母。
  2. 解密运算修正:将message_val + key_val改为message_val - key_val,模26保证结果始终在字母表索引范围内(Python的负数模运算会自动转为正数,无需额外处理)。
  3. 非字符处理:只有当处理的是字母时,才移动密钥的位置,标点、空格等字符不消耗密钥,保持解密对应关系正确。

运行修正后的代码,会得到正确明文:

you were able to decode this? nice work! you are becoming quite the expert at cryptography!

内容的提问来源于stack exchange,提问作者Peter DeMore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:15:46