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

维吉尼亚密码程序保留空格异常,解密结果不符预期求助

排查维吉尼亚密码解密错误的问题

看起来你的解密逻辑出现了几个关键问题,导致结果和预期完全不符。咱们一步步拆解问题,然后给出针对性的修复方案:

可能的问题根源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:12:59