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

维吉尼亚密码加解密程序空格处理问题求助

解决维吉尼亚密码处理空格的问题

你的问题核心在于:当前代码把空格当成普通字符参与了密钥扩展和加解密运算,但你希望空格直接保留、不参与加密。之前尝试的if(s[i]==' '): continue没生效,是因为你没同步调整密钥的使用逻辑——密钥应该只对非空格字符循环应用,而不是按明文的总长度(包含空格)来扩展。

问题根源分析

你原来的密钥生成是直接匹配明文的总长度,加密时每个字符(包括空格)都对应一个密钥字符,这就导致空格被错误加密,同时密钥的循环逻辑也被空格打乱了。正确的逻辑应该是:

  • 空格直接保留在加密/解密结果中
  • 密钥仅在处理非空格字符时,按顺序循环使用

修改后的完整代码

print("Enter the string to be encrypted")
plaintext = input().upper()  # 统一转大写,避免大小写混合的编码问题
print("Enter the key for encryption")
key = input().upper()

encrypted = []
decrypted = []
key_index = 0  # 单独跟踪当前使用的密钥字符位置

# 加密过程
for char in plaintext:
    if char == ' ':
        # 空格直接加入结果,不参与加密运算
        encrypted.append(' ')
        continue
    # 计算加密字符的编码
    plain_code = ord(char) - ord('A')
    key_code = ord(key[key_index % len(key)]) - ord('A')
    encrypted_code = (plain_code + key_code) % 26
    encrypted.append(chr(encrypted_code + ord('A')))
    # 仅处理非空格字符时,密钥索引才递增
    key_index += 1

encrypted_str = ''.join(encrypted)
print("The encrypted string is: ")
print(encrypted_str)

# 解密过程
key_index = 0  # 重置密钥索引
for char in encrypted_str:
    if char == ' ':
        decrypted.append(' ')
        continue
    encrypted_code = ord(char) - ord('A')
    key_code = ord(key[key_index % len(key)]) - ord('A')
    # +26是为了避免减法出现负数,保证模运算正确
    decrypted_code = (encrypted_code - key_code + 26) % 26
    decrypted.append(chr(decrypted_code + ord('A')))
    key_index += 1

decrypted_str = ''.join(decrypted)
print("The decrypted string is: ")
print(decrypted_str)

关键修改点说明

  1. 统一大小写:把明文和密钥都转成大写,避免大小写混合导致的编码计算错误(维吉尼亚密码通常只处理同一种大小写的字符)
  2. 密钥索引独立跟踪:用key_index变量单独管理密钥的使用位置,只有处理非空格字符时才递增,保证密钥仅对有效字符循环应用
  3. 空格直接保留:遇到空格时直接加入结果列表,跳过加解密计算,同时不移动密钥索引
  4. 简化密钥逻辑:不再提前生成和明文等长的密钥,而是通过key_index % len(key)直接循环取密钥字符,代码更简洁高效

测试示例

比如输入明文:WATERMELON IS SWEET,密钥:LEMON

  • 加密结果会保留空格:CPKUGZQFQD QN QFZAN
  • 解密后会还原为原明文:WATERMELON IS SWEET

这样就完美解决了空格处理的问题,同时保证加解密的正确性。

内容的提问来源于stack exchange,提问作者Naman Sood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:37:20