为了简单起见,我假设您正在尝试解密凯撒(或移位)密码。尽管涉及的原则也适用于其他密码。
你表示你想找到最常见的字符。这并不能真正帮助你,因为这封信可以成为其他任何信件。然而,你可以用这个做一个字母频率攻击...然而这只对非常长的字符串非常有效......
解决这个问题的最简单方法可能是强制解决方案。由于只有极少数解决方案,因此强力可能非常有效。字母表中有26个字母,所以我们可以移动0-25。这意味着只有25个可能的字符串需要检查。
找到这些字符串是相对平凡的。在1-25范围内使用循环。现在,只需将字符串中的每个字符转换为数字0-25 [A = 0,B = 1 ... Z = 25]并添加移位[1-25]。 (char_value + shift) % 26
会给你新的角色价值。 (您也可以使用ASCII字符值,但我为了理解而使用这些值。
然而,不太重要的是确定哪个字符串是最有可能的在我看来,最好的方法是这是使用一个普通单词的字典 - 你可以在这里阅读更多关于这种类型的攻击:http://en.wikipedia.org/wiki/Known-plaintext_attack。用你的字典,你只需要查找已知单词数量最多的字符串 - 虽然它可以比这更复杂。机会是,这将是您的解决方案。
这将为所有情况。
如果您只有想要查看哪些最常见的字母被转换为E
的问题,问题就变得非常简单。但是,在实际的例子中,字符串中最常见的字母不一定是E
,所以这种策略并不是最优的。
通过循环字符串找出最常见的字母,保持每个字母出现的运行计数。你可以用很多方法来做到这一点。你可以使用整数列表,地图,或几乎任何东西......
从这里,确定从这封信到E
转变的大小。例如,如果S
是最常见的,则移位为12. E的值为4.S的值为18.移位是(26-18)+4。可以使用余数函数将其转换为所有可能的字母,例如((26-o)+4) % 26
,其中o
是最常用字母的值。所以如果最频繁的字母是A = 0,26 + 4%25 = 4,这是正确的转变。
现在,您可以如上所述移动所有字符。
我们在这里谈论什么样的密码?简单的移位密码或更复杂的东西? – DinoOcch
简单的密码,你转移信件的前进 –
我可以添加我已经做了,但我觉得它不会改变 –