维吉尼亚密码解密故障求助:解密结果无法正常输出
维吉尼亚密码解密问题排查
你的核心decrypt函数逻辑是正确的,解密功能失效的问题出在代码的交互流程上:当前代码会先自动加密你输入的初始消息,然后解密该密文,最后通过choice函数重复打印已生成的加密/解密结果——但如果你的需求是解密外部输入的密文,现有代码无法支持,因为choice函数没有提供输入新密文的入口,只会打印初始解密结果。
问题验证
假设你输入初始消息hello world、密钥abc,代码会自动生成密文khoor zruog并解密回原消息,此时无论是直接打印还是通过choice选2,都能正确输出解密结果。但如果你想解密其他密文(比如从别处获取的khoor zruog),现有代码无法处理,只能输出初始解密结果,导致你误以为解密功能失效。
修复方案
修改choice函数,让它支持动态输入消息/密文和密钥,实现真正的加密/解密交互:
def encrypt_key(message, key): i = 0 empty_key = '' for char in message: if char.isalpha(): empty_key += key[i % len(key)] i += 1 else: empty_key += ' ' return empty_key def encrypt_decrypt(message_char, key_char, choice='encrypt'): if message_char.isalpha(): first_alphabet_letter = 'a' if message_char.isupper(): first_alphabet_letter = 'A' original_char_position = ord(message_char) - ord(first_alphabet_letter) key_char_position = ord(key_char.lower()) - ord('a') if choice == 'encrypt': new_char_position = (original_char_position + key_char_position) % 26 else: new_char_position = (original_char_position - key_char_position + 26) % 26 return chr(new_char_position + ord(first_alphabet_letter)) return message_char def encrypt(message, key): cipher = '' empty_key = encrypt_key(message, key) for message_char, key_char in zip(message, empty_key): cipher += encrypt_decrypt(message_char, key_char) return cipher def decrypt(cipher, key): message = '' empty_key = encrypt_key(cipher, key) for cipher_char, key_char in zip(cipher, empty_key): message += encrypt_decrypt(cipher_char, key_char, 'decrypt') return message def choice(): while True: try: user_choice = int(input(''' Enter your choice (1, 2 or 3): 1. Encrypt a new message 2. Decrypt a new cipher 3. Exit > ''')) if user_choice == 1: message = input('Enter your message to encrypt here: ') key = input('Enter your key: ') cipher = encrypt(message, key) print(f'\nCipher: {cipher}\n') elif user_choice == 2: cipher = input('Enter your cipher to decrypt here: ') key = input('Enter your key: ') decrypt_message = decrypt(cipher, key) print(f'\nDecrypted: {decrypt_message}\n') elif user_choice == 3: print('Exiting...') break else: print('\nInvalid choice, please enter 1, 2 or 3\n') except ValueError: print('\nPlease enter a valid number\n') choice()
修复说明
- 移除了初始自动加密/解密的代码,改为通过
choice函数触发交互 - 为
choice函数添加了循环和输入校验,支持重复操作 - 加密/解密功能保留原有正确逻辑,仅调整交互流程
内容的提问来源于stack exchange,提问作者Astivery
相关产品推荐
相关产品推荐

