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"))
关键修正说明
- 密钥循环逻辑:通过
key_index % key_length实现密钥的循环复用,每次处理一个字母后递增key_index,确保密钥按顺序对应每个密文字母。 - 解密运算修正:将
message_val + key_val改为message_val - key_val,模26保证结果始终在字母表索引范围内(Python的负数模运算会自动转为正数,无需额外处理)。 - 非字符处理:只有当处理的是字母时,才移动密钥的位置,标点、空格等字符不消耗密钥,保持解密对应关系正确。
运行修正后的代码,会得到正确明文:
you were able to decode this? nice work! you are becoming quite the expert at cryptography!
内容的提问来源于stack exchange,提问作者Peter DeMore
相关产品推荐
相关产品推荐

