利用频率分析提高替换密码的精度 这样,在我的C++代码中,我用普通英语中的文本文件,通过文件分析英文字母中的字母的频率,并将它们存储到向量中。在获得频率后,我用英语字母表中频率最高的字母替换了以频率最高的字母开头的每个字母。我使用了“etaoinshrdlucmfwypvgbgkjqxz”和“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

利用频率分析提高替换密码的精度 这样,在我的C++代码中,我用普通英语中的文本文件,通过文件分析英文字母中的字母的频率,并将它们存储到向量中。在获得频率后,我用英语字母表中频率最高的字母替换了以频率最高的字母开头的每个字母。我使用了“etaoinshrdlucmfwypvgbgkjqxz”和“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,c++,encryption,dictionary,frequency,substitution,C++,Encryption,Dictionary,Frequency,Substitution,对于中等长度的文本,我得到的结果文本的单词如下 REANSISF FTARH from LEARNING GOALS REANS YTU A CAHGERR VY LINAS RIWTKAMA from Learn You a Haskell by Miran Lipovaca 注意有些词是多么接近。像学习或你或作者。沿着这些思路的某个地方,我可能会“粗暴地”用实际单词替换这些拼写。 那么,我如何才能提高准确性,使其至少50%接近原文?我只是暂时需要一些想法。无论是在字典中找到常见的字母模

对于中等长度的文本,我得到的结果文本的单词如下

REANSISF FTARH  from LEARNING GOALS
REANS YTU A CAHGERR VY LINAS RIWTKAMA from Learn You a Haskell by Miran Lipovaca 
注意有些词是多么接近。像
学习
作者
。沿着这些思路的某个地方,我可能会“粗暴地”用实际单词替换这些拼写。
那么,我如何才能提高准确性,使其至少50%接近原文?我只是暂时需要一些想法。无论是在字典中找到常见的字母模式,还是在C++中使用字典作为词典,都会有任何建议。谢谢。

我最近在一个编程挑战中解决了一个类似的问题,所以我不想透露太多,但我要说的是,我发现建立一个完整单词模式的词典比建立字母频率的词典更有成效。将一个单词转换成一种模式,如
转义
->
ABCDEAB
,可以轻松地获取一个密码并快速识别具有相同模式的候选明文单词


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

你基本上发现的是“部分好的”当只正确替换单词中使用的字母时,解决方案已正确返回这些单词。如果你把Q和X混在一起,这没有多大关系,这是一个真正的风险,因为它们都很罕见

因此,作为接近度的度量,您可以使用字典中尝试解密的单词数量。你会发现确实出现的单词中某些字母的出现率要高得多,而且这些字母可能是正确的。试一试所有12道“EATO”会让你有很多单词


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

如上图所示。左侧显示文本中字母的频率,中间数字是频率量,右侧是英语字母表中频率最高的字符串。这是一个简单的替换,将文本中的字母替换为新的字母。试着看看双字符频率。(或三元图,或n-gram)