使用频率分析提高替代密码的准确性

Improving Accuracy for a Substitution Cipher using Frequency Analysis

所以,在我的C++代码中,我拿一个普通英文的文本文件,通过文件分析英文字母表中字母的出现频率,并将它们存储到一个向量中。获得频率后,我将每个以最频繁出现的字母开头的字母替换为英文字母表中最频繁出现的字母。我使用 "ETAOINSHRDLUCMFWYPVBGKJQXZ""EOTHASINRDLUYMWFGCBPKVJQXZ" 之类的字符串来表示最常见的字母表,然后我逐一检查最常见的文本(按大于比较排序的向量)并替换每个他们与上面字符串中的字母。最终,这种天真的方法的准确性取决于文件的大小;我想看看我是否可以在保持这种方法的同时使其更准确。就像,在我 运行 再次通过文本替换新字母后,我得到一个新文件,其中包含新的(不是真实的)单词。由于这种做法的准确性如下

E 326 E
O 288 T
A 271 A
T 257 O
I 243 I
R 235 N
N 208 S
S 205 H
L 140 R
D 129 D
M 112 L
U 110 U
H 107 C
C 103 M
G 92 F
P 91 W
Y 73 Y
W 58 P
B 53 V
F 51 B
K 29 G
V 22 K
X 15 J
J 6 Q
Q 6 X
Z 1 Z

对于中等长度的文本,我得到的结果文本包含

REANSISF FTARH  from LEARNING GOALS
REANS YTU A CAHGERR VY LINAS RIWTKAMA from Learn You a Haskell by Miran Lipovaca 

请注意有些单词非常接近。喜欢 learnyouby。沿着这些思路,我也许可以 "bruteforce" 用自己的方式用实际单词替换这些拼写。 那么,我怎样才能提高准确性,使其至少接近原文 50%?我暂时只需要想法。无论是实现字典来查找常见的字母模式,还是在 C++ 中使用映射作为字典,任何建议都将不胜感激。谢谢。

我最近在一个编程挑战中解决了一个类似的问题,所以我不想放弃太多,但我会说我发现构建一个全词模式的字典比构建一个全词模式的字典更有成效字母频率。将单词转换为 ESCAPES -> ABCDEAB 这样的模式,可以轻松获取密文并快速识别具有相同模式的候选明文单词。

除此之外,这个问题还有许多有趣的挑战:识别死胡同、选择首先破译哪些单词、如何(以及是否)回溯以及如何处理似乎不存在的密码在字典里,就几个。

您基本上发现的是 "partially good" 解决方案已经 returns 正确地替换了单词中使用的字母。如果你把 Q 和 X 搞混了也没关系,这是一个真正的风险,因为它们都很罕见。

因此,作为接近程度的衡量标准,您可以使用尝试解密中的单词在字典中出现的次数。你会发现确实出现的单词中某些字母的出现率要高得多,而且这些字母可能是正确的。只需尝试 "EATO" 的所有 12 个订单,您就会得到很多单词。

但是你如何产生更多的假设呢?你的第一次尝试让你得到一个订单。您可以通过交换几乎一样常见的字母对来生成合理的变化。从最常见的字母开始,因为这会让你得到更多的单词。