资讯动态

别再只靠猜了!用Python+频率分析破解经典单表替换密码(实战阿加莎小说片段)

发布时间:2026/8/22 20:43:18 来源:尧图企业网站定制
用Python实现频率分析破解经典单表替换密码想象一下你正沉浸在阿加莎·克里斯蒂的侦探小说中突然发现一段神秘的加密对话。作为一位Python爱好者和密码学初学者你是否想过像波洛侦探一样破解这段密文本文将带你用Python实现频率分析技术逐步揭开单表替换密码背后的秘密。1. 密码学基础与频率分析原理单表替换密码是最古老的加密方式之一其核心思想是将明文中的每个字母按照固定的替换表映射为另一个字母。与凯撒密码简单的位移不同单表替换的密钥空间高达26!约4×10²⁶种可能看似无法暴力破解。但英语字母的出现频率存在显著差异这为破解提供了突破口。根据语言学统计字母频率字母频率E12.7%T9.1%A8.2%O7.5%I7.0%N6.7%S6.3%H6.1%R6.0%D4.3%提示英语中最常见的三字母单词是the出现频率约7%双字母组合th出现频率约3%频率分析法的实施步骤统计密文中各字母出现频率将结果与标准英语频率表对比猜测高频密文字母对应的高频明文字母通过部分破解的单词验证和调整映射关系2. Python实现频率统计与分析我们使用Python的collections模块快速实现频率统计。以下代码读取密文并生成频率报告from collections import Counter import matplotlib.pyplot as plt def analyze_frequency(ciphertext): # 过滤非字母字符并转换为小写 letters [c.lower() for c in ciphertext if c.isalpha()] total len(letters) # 统计字母频率 freq Counter(letters) sorted_freq sorted(freq.items(), keylambda x: x[1], reverseTrue) # 打印频率报告 print(字母频率统计) for char, count in sorted_freq: print(f{char}: {count/total:.2%}) # 绘制频率分布图 labels, values zip(*sorted_freq) plt.bar(labels, [v/total for v in values]) plt.xlabel(字母) plt.ylabel(频率) plt.title(密文字母频率分布) plt.show() return dict(sorted_freq) # 示例密文阿加莎小说片段 cipher bmjs dtz uqfd ymj lfrj tk ymwtsjx dtz bns tw dtz inj ymjwj nx st rniiqj lwtzsi analyze_frequency(cipher)执行后会输出类似如下的频率统计字母频率统计 j: 15.2% t: 12.1% d: 9.1% m: 7.6% ...配合生成的柱状图我们可以直观识别出密文中的高频字母。例如假设密文中J出现频率最高我们可初步猜测它对应明文字母E。3. 构建字母映射与智能猜测基于频率统计我们建立初始替换规则并逐步完善def build_mapping(cipher_freq, lang_freq[e,t,a,o,i,n,s,h,r,d]): 根据频率匹配构建初始字母映射 mapping {} for (cipher_char, _), lang_char in zip(cipher_freq.items(), lang_freq): mapping[cipher_char] lang_char return mapping # 示例假设j,t,d是密文前三高频字母 initial_map {j:e, t:t, d:a}但单纯频率匹配准确率有限我们需要结合单词模式识别。例如发现密文中频繁出现dtz如果假设d→at→t那么atz可能是and、the等常见词测试z→h时ath无意义测试z→d时atd也不合理尝试z→n得到atn再尝试z→e得到ate更合理这种迭代修正过程可通过以下代码实现def apply_mapping(ciphertext, mapping): 应用当前映射规则解密 result [] for char in ciphertext.lower(): result.append(mapping.get(char, char)) return .join(result) # 根据新发现更新映射 initial_map.update({z:e, q:h}) partial_decrypt apply_mapping(cipher, initial_map) print(partial_decrypt)4. 完整破解流程与优化技巧结合上述方法我们构建系统化的破解流程预处理阶段清洗密文去除标点、统一大小写统计单字母、双字母组合频率识别可能的短词1-2字母单词初始映射建立将密文最高频字母映射为e次高频字母尝试t、a等特别注意出现频率异常的字母可能是q、z等低频字母模式识别与验证寻找重复出现的字母模式如xxy可能对应lls利用英文单词结构特征如t_e很可能是the检查单字母单词通常是a或I交互式修正显示部分解密结果供人工判断对不确定的映射提供多个候选记录修正历史以便回溯def interactive_decrypt(ciphertext, initial_mapNone): 交互式解密工具 mapping initial_map or {} while True: current apply_mapping(ciphertext, mapping) print(\n当前解密结果) print(current) print(\n当前映射关系) for k, v in sorted(mapping.items()): print(f{k} → {v}) cmd input(\n输入命令如a→b修改映射quit退出: ).strip() if cmd.lower() quit: break if → in cmd: cipher_char, plain_char cmd.split(→) mapping[cipher_char.strip()] plain_char.strip()实际破解阿加莎密文时经过几次迭代后可能得到原始密文bmjs dtz uqfd ymj lfrj tk ymwtsjx dtz bns tw dtz inj ymjwj nx st rniiqj lwtzsi 部分解密when _ou _a_e t_e _or_ o_ t______ _ou _n_ __ _ou _n_ t___ _e __ ______ _o___通过识别t_e模式补全the发现_ou可能是you最终完整解密when you play the game of thrones you win or you die there is no middle ground5. 进阶技巧与实战建议双字母频率分析英语中常见字母组合如th、he、in等出现频率具有特征性。统计密文中双字母组合频率可提供额外线索def analyze_bigrams(text, n10): words [w for w in text.lower().split() if len(w) 1] bigrams [b for w in words for b in zip(w[:-1], w[1:])] return Counter(bigrams).most_common(n) # 示例输出[(d, t), (t, z), (y, m), ...]词长分布分析英语单词长度分布有一定规律如3字母单词占比最高。统计密文中单词长度分布可验证解密合理性单词长度英语文本比例密文比例13%5%215%18%331%28%422%25%常见单词猜测表单词长度可能单词候选1a, I2of, to, in, it, is, be, by3the, and, for, are, but在实战中遇到困难时可以优先破解短词特别是重复出现的2-3字母组合注意标点符号后的单词可能是专有名词或句子开头结合上下文语义验证如小说对话常用I think等短语保留多个可能的映射方案并行测试def suggest_mappings(cipher_word, english_words): 根据单词模式和已知映射建议可能匹配 pattern [] known_mappings {} # 构建单词模式如abc→123 char_map {} counter 1 for c in cipher_word: if c not in char_map: char_map[c] str(counter) counter 1 pattern.append(char_map[c]) pattern_str .join(pattern) # 寻找匹配模式的英语单词 matches [w for w in english_words if len(w) len(cipher_word) and get_pattern(w) pattern_str] # 从匹配单词中提取新映射关系 new_mappings {} if matches: sample matches[0] for c_cipher, c_plain in zip(cipher_word, sample): if c_cipher not in known_mappings: new_mappings[c_cipher] c_plain return new_mappings破解密码就像侦探破案需要耐心收集线索频率统计、建立假设字母映射、验证推理部分解密。当看到最初毫无意义的密文逐渐显现出原著中波洛侦探的经典台词时那种成就感无与伦比。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价