所以我得到了一项任务,我需要解密一个在移位密码中使用某个密钥加密的字符串。所以我的想法是找到字符串中最常见的字母,并从中找到密钥,因为最常见的字母是E,当我得到密钥时,我将解密文本(基本上是字符串中的每个字母都是& #39; ta space - 关键。现在我遇到了一些困难:
我希望我的程序适用于每个键,所以我不知道最常见的字母是在E之后还是之前(在ASCII图表中)所以我不能只是基板E和得到答案,我无法弄清楚我需要做些什么才能让它发挥作用。
此外,当我发现钥匙时,我不知道如何制作A
,请回到Y
,就像做圈子一样(但我想我知道也许我如何看待%
运营商)
无论如何,任何可以提供帮助的人都非常感激,并且我不允许使用真正的高级命令。字符串中的所有字母都是大写字母,密码是简单的移位密码。
答案 0 :(得分:0)
为了简单起见,我假设您正在尝试解决凯撒(或移位)密码。所涉及的原则也应该适用于其他密码。
你表示你想找到最常见的角色。在所有情况下,这并不能真正帮助你,因为这封信可以成为任何其他字母。但是你可以使用这个来进行字母频率攻击...这只对非常长的字符串非常有效但是......
解决此类问题的最简单方法可能是强制解决问题。由于只有极少数的解决方案,蛮力可能非常有效。字母表中有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,这是正确的移位。
现在,您可以按照上面的说明移动所有字符。