修复Python字母频率分析密码解密代码解密不完整问题
频率分析替换密码解密程序修复方案
基于ETAOIN字母频率硬排序一一映射的单表替换解密本身存在固有误差,叠加代码逻辑的常见疏漏,就会出现解密不完整、输出不符合预期的问题,按以下步骤逐一排查修复即可。
常见核心bug点
- 预处理逻辑错误:统计频率时未统一字母大小写,把同一字母的大写、小写形式拆成两个独立字符统计,拉低频率统计准确率;或是读取文件时编码错误,部分特殊字符读取失败丢内容。
- 替换逻辑缺陷:解密替换时跳过了非字母字符(空格、标点、数字、换行),或是替换后没有还原原文本的大小写、格式,导致输出内容残缺。
- 频率映射逻辑僵化:直接把密文字母的频率排序结果和ETAOIN标准顺序按索引一一绑定,没有考虑不同长度、不同主题文本的频率波动——尤其是长度低于1000字符的密文,频率排序和标准顺序偏差会非常大,硬匹配必然出现大量映射错误。
可直接复用的修复后代码逻辑
from collections import Counter # 标准英文高频字母排序(从高到低) ETAOIN = "ETAOINSHRDLCUMWFGYPBVKJXQZ" # 1. 读取密文,保留全部原始内容 with open("cipher.txt", "r", encoding="utf-8") as f: raw_cipher = f.read() # 2. 统计频率:仅提取字母、统一转大写统计,不修改原始密文 alpha_in_cipher = [c.upper() for c in raw_cipher if c.isalpha()] freq_counter = Counter(alpha_in_cipher) # 密文字母按出现频率从高到低排序 cipher_sorted = [item[0] for item in sorted(freq_counter.items(), key=lambda x: (-x[1], x[0]))] # 3. 生成初始映射表 decrypt_map = {} for cipher_char, plain_char in zip(cipher_sorted, ETAOIN): decrypt_map[cipher_char] = plain_char # 4. 解密逻辑:保留原文本所有格式、大小写 def decrypt(content, mapping): result = [] for char in content: if char.isupper(): result.append(mapping.get(char, char)) elif char.islower(): # 小写字符转大写查映射表后转回小写 result.append(mapping.get(char.upper(), char).lower()) else: # 非字母内容(空格、标点、换行、数字)直接保留 result.append(char) return "".join(result) # 输出初始解密结果 initial_result = decrypt(raw_cipher, decrypt_map) print("初始解密结果:\n", initial_result)
初始结果修正技巧
初始映射得到的结果不会100%正确,不需要上复杂算法,按以下规则手动调整映射表即可快速得到完整正确明文:
- 先定位单字母单词:英文中单字母单词几乎只有
A和I,直接对应修正映射关系 - 再匹配高频短词:3字母高频词优先匹配
THE、AND、FOR,2字母高频词优先匹配OF、TO、IN、IS,匹配到对应词就调整映射表中对应字母的关系 - 最后根据缩写校验:带撇号的短词比如
't对应not的尾字母、's对应所有格、're对应are,可以快速定位剩余错位的字母 - 每调整一次映射表就重新调用
decrypt函数生成新结果,重复3-5轮就能得到完全正确的明文。
不要试图靠纯频率硬匹配得到100%正确结果,所有单表替换频率分析都需要少量人工校验调整,尤其是短密文场景。
内容的提问来源于stack exchange,提问作者FoxCode
相关产品推荐
相关产品推荐

