维吉尼亚密码程序保留空格异常,解密结果不符预期求助
排查维吉尼亚密码解密错误的问题
看起来你的解密逻辑出现了几个关键问题,导致结果和预期完全不符。咱们一步步拆解问题,然后给出针对性的修复方案:
可能的问题根源
1. 解密方向搞反:误用了加密的加法逻辑
维吉尼亚密码的核心运算逻辑是:
- 加密:
明文偏移 + 密钥偏移 ≡ 密文偏移 (mod 26) - 解密:
密文偏移 - 密钥偏移 ≡ 明文偏移 (mod 26)(注意负数要加26再取模,避免出现负索引)
你当前得到的错误结果MBOAV CWLP IOB KRWJYB,看起来就是把密文和密钥偏移相加后的结果,而非解密需要的相减操作,这是最可能的核心问题。
2. 空格处理时密钥索引未正确跳过
当遇到空格时,应该保持密钥的当前索引不变,只在处理字母字符时才递增密钥索引。如果空格也触发密钥索引递增,会导致后续字母的密钥偏移完全错位,结果自然不对。
3. 大小写不统一导致偏移计算错误
如果密文是大写、密钥是小写,却没有统一转换为相同大小写,字符的ASCII值差会出错(比如'c'的ASCII是99,'J'是74,直接相减会得到非预期的偏移值)。
修复后的代码示例
下面是修正后的translatedMessage函数,解决了上述所有问题:
def translatedMessage(ciphertext, key, mode): # 统一转换为大写,消除大小写差异影响 ciphertext = ciphertext.upper() key = key.upper() result = [] key_index = 0 alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for char in ciphertext: if char == ' ': # 保留空格,密钥索引不递增 result.append(char) continue # 获取密文字符的字母偏移(A=0,B=1...Z=25) cipher_offset = alphabet.index(char) # 循环获取密钥字符的偏移 key_offset = alphabet.index(key[key_index % len(key)]) if mode == 'd': # 解密:密文偏移 - 密钥偏移,模26处理负数情况 plain_offset = (cipher_offset - key_offset) % 26 else: # 加密:明文偏移 + 密钥偏移,模26 plain_offset = (cipher_offset + key_offset) % 26 result.append(alphabet[plain_offset]) # 只有处理字母时才递增密钥索引 key_index += 1 return ''.join(result) # 测试验证 print(translatedMessage('JPZFR DTZA NKC HFHOUC', 'cloudy', 'd')) # 输出:HELLO FROM THE FUTURE
逻辑正确性验证
咱们手动验证几个关键字符:
- 第一个密文字符
J(偏移9)对应密钥C(偏移2):9-2=7→H(正确) - 第二个密文字符
P(偏移15)对应密钥L(偏移11):15-11=4→E(正确) - 空格直接保留,密钥索引停在第5位,下一个字符
D(偏移3)对应密钥Y(偏移24):3-24=-21→-21+26=5→F(正确)
这样就能得到你预期的解密结果了。
内容的提问来源于stack exchange,提问作者Abbas97
相关产品推荐
相关产品推荐

