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

时间:2015-03-10 22:17:14

标签: c++ encryption dictionary frequency substitution

因此,在我的C ++代码中,我使用普通英语文本文件,通过文件分析英文字母中字母的频率并将其存储到矢量中。在获得频率之后,我用最频繁的英文字母替换了每个字母,其中最常见的是字母。我使用"ETAOINSHRDLUCMFWYPVBGKJQXZ""EOTHASINRDLUYMWFGCBPKVJQXZ"之类的字符串来代表最常见的字母表,然后我逐个浏览最常用的文本(按比例排序Vector比较)并替换每一个他们用上面字符串中的字母。最终,这种天真方法的准确性取决于文件的大小;我想看看我是否可以在保持这种方法的同时使其更准确。就像,在我再次浏览文本以替换新字母后,我得到一个新文件,其中包含新的(非真实的)单词。由于这种方法的准确性如下

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 ++中的字典,任何建议都将受到赞赏。感谢。

2 个答案:

答案 0 :(得分:0)

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

除此之外,这个问题还有许多有趣的挑战:识别死角,选择首先破译的词,如何(以及是否)回溯,以及如何处理似乎不存在的密码词字典,仅供少数人使用。

答案 1 :(得分:0)

你基本上发现的是,当只是单词中使用的字母被正确替换时,“部分良好”的解决方案已经正确地返回了这些单词。如果Q和X混合起来并不重要,这是一个真正的风险,因为它们都很少见。

因此,作为接近度的度量,您可以使用尝试解密中有多少单词出现在字典中。您会发现确实发生的单词出现的字母要高得多,而且这些字母可能是正确的。只要尝试所有12个“EATO”订单就可以获得很多单词。

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