维吉尼亚密码加解密程序空格处理问题求助
解决维吉尼亚密码处理空格的问题
你的问题核心在于:当前代码把空格当成普通字符参与了密钥扩展和加解密运算,但你希望空格直接保留、不参与加密。之前尝试的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)
关键修改点说明
- 统一大小写:把明文和密钥都转成大写,避免大小写混合导致的编码计算错误(维吉尼亚密码通常只处理同一种大小写的字符)
- 密钥索引独立跟踪:用
key_index变量单独管理密钥的使用位置,只有处理非空格字符时才递增,保证密钥仅对有效字符循环应用 - 空格直接保留:遇到空格时直接加入结果列表,跳过加解密计算,同时不移动密钥索引
- 简化密钥逻辑:不再提前生成和明文等长的密钥,而是通过
key_index % len(key)直接循环取密钥字符,代码更简洁高效
测试示例
比如输入明文:WATERMELON IS SWEET,密钥:LEMON
- 加密结果会保留空格:
CPKUGZQFQD QN QFZAN - 解密后会还原为原明文:
WATERMELON IS SWEET
这样就完美解决了空格处理的问题,同时保证加解密的正确性。
内容的提问来源于stack exchange,提问作者Naman Sood
相关产品推荐
相关产品推荐

