当转换无一一对应关系时,如何用Python解密文本?附替换加解密代码
用Python处理替换密码的解密(含非严格一一对应场景说明)
当替换密码不存在严格的一一对应关系时,解密确实会麻烦一些——毕竟一个密文字符可能对应多个明文字符,这时候得结合上下文或者频率分析来猜。不过如果是像**移位密码(凯撒密码)**这种有固定循环映射的替换(本质还是一一对应,只是循环移位),咱们直接用Python标准库就能快速实现加解密,完全不用额外装包。
核心思路
Python的str.maketrans()可以创建字符映射表,str.translate()则能根据这个表完成字符替换。加密时是明文→密文的映射,解密时反过来,把密文→明文的映射表传进去就行。
完整示例代码
def cifrar(word, BASE, CIFRA_CODE): # 创建明文到密文的映射表 table = str.maketrans(BASE, CIFRA_CODE) # 应用映射并打印结果 print(word.translate(table)) def decifar(word, BASE, CIFRA_CODE): # 反过来,创建密文到明文的映射表 table = str.maketrans(CIFRA_CODE, BASE) print(word.translate(table)) def main(): # 明文字符集(这里用大写英文字母) BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 密文字符集:把BASE循环后移3位(凯撒密码的经典移位) CIFRA_CODE = "DEFGHIJKLMNOPQRSTUVWXYZABC" # 菜单选择加密/解密 menu = int(input("(1) Crypto (2) Decrypt: ")) word = input("Enter the text: ") if menu == 1: cifrar(word.upper(), BASE, CIFRA_CODE) elif menu == 2: decifar(word.upper(), BASE, CIFRA_CODE) else: print("Invalid option!") if __name__ == "__main__": main()
代码说明
cifrar函数:接收明文、明文字符集、密文字符集,生成映射表后完成加密并输出。decifar函数:和加密逻辑相反,用密文字符集映射回明文字符集,实现解密。- 主函数里的
BASE和CIFRA_CODE是移位3位的凯撒密码映射,你可以根据需求修改移位位数或者自定义替换规则。
关于非一一对应场景的补充
如果是真的没有一一对应关系的替换(比如多个明文字符映射到同一个密文字符),那解密会出现歧义,这时候单纯靠字符映射就不够了。你可能需要结合字符频率分析(比如英语里字母E出现频率最高),或者借助上下文语义来推断最合理的明文。Python的标准库虽然没有直接的频率分析工具,但你可以用collections.Counter来统计字符出现次数,辅助解密。
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

