def find_vigenere_key(plaintext, ciphertext): """ 根据维吉尼亚密码的明文和密文推导密钥
参数: plaintext (str): 明文,可以包含字母、数字和其他字符 ciphertext (str): 密文,可以包含字母、数字和其他字符
返回: str: 推导得到的密钥,大小写与明文保持一致 """ if len(plaintext) != len(ciphertext): raise ValueError("明文和密文的长度必须相同")
key = [] for p, c in zip(plaintext, ciphertext): if p.isalpha() and c.isalpha(): is_upper = p.isupper()
p_val = ord(p.upper()) - ord('A') c_val = ord(c.upper()) - ord('A')
k_val = (c_val - p_val) % 26
key_char = chr(k_val + ord('A')) if not is_upper: key_char = key_char.lower()
key.append(key_char) elif not p.isalpha() and not c.isalpha(): key.append(p) else: raise ValueError(f"明文和密文在位置 {len(key)} 处不匹配(一个是字母,一个是非字母)")
return ''.join(key)
def main(): print("维吉尼亚密码密钥推导工具") print("-------------------------")
plaintext = input("请输入明文: ") ciphertext = input("请输入密文: ")
try: key = find_vigenere_key(plaintext, ciphertext) print(f"\n推导得到的密钥是: {key}")
def vigenere_encrypt(text, key): encrypted = [] key_len = len(key) for i, char in enumerate(text): k_char = key[i % key_len]
if char.isalpha() and k_char.isalpha(): is_upper = char.isupper()
t_val = ord(char.upper()) - ord('A') k_val = ord(k_char.upper()) - ord('A') c_val = (t_val + k_val) % 26
encrypted_char = chr(c_val + ord('A')) if not is_upper: encrypted_char = encrypted_char.lower()
encrypted.append(encrypted_char) elif not char.isalpha() and not k_char.isalpha(): encrypted.append(char) else: raise ValueError(f"明文和密钥在位置 {i} 处不匹配(一个是字母,一个是非字母)")
return ''.join(encrypted)
verified_ciphertext = vigenere_encrypt(plaintext, key) if verified_ciphertext == ciphertext: print("验证成功: 使用该密钥加密明文得到的结果与输入的密文一致") else: print(f"验证失败: 使用该密钥加密得到 {verified_ciphertext},与输入的密文不一致")
except ValueError as e: print(f"错误: {e}")
if __name__ == "__main__": main() """ 维吉尼亚密码密钥推导工具 ------------------------- 请输入明文: 0xGame 请输入密文: 0lCcop
推导得到的密钥是: 0oWccl 验证成功: 使用该密钥加密明文得到的结果与输入的密文一致
进程已结束,退出代码为 0 """
|