通过频率分析在不知道明文或密钥的情况下打破凯撒密码密文

时间:2015-10-03 17:30:45

标签: c# encryption frequency-analysis caesar-cipher

我正在尝试创建一个程序,可以帮助您在不知道纯文本和密钥的情况下破解密文。

我想在输出端显示可能的纯文本,它提供最接近的统计值和一组可能的候选键

我开始进行频率分析,完成了它。它帮助我讲述了每个字母的出现,但我不知道如何从中生成密钥。

class Program
{
     static void Main()
     {
         // Array to store frequencies.
         int[] c = new int[(int)char.MaxValue];


         // Read entire text file.
            string s = File.ReadAllText("text.txt");


          // Iterate over each character.
          foreach (char t in s)
            {
            // Increment table.
            c[(int)t]++;
         }


          // Write all letters found.
         for (int i = 0; i < (int)char.MaxValue; i++)
         {
            if (c[i] > 0 &&
            char.IsLetterOrDigit((char)i))
            {
            Console.WriteLine("Letter: {0}  Frequency: {1}",
                (char)i,
                c[i]);
            }
         }
    }
}

2 个答案:

答案 0 :(得分:0)

对于简单的字母替换密码,您可能希望获得英文字母频率列表,并尝试将它们映射到消息中最常用的字母。注意。在计算机之前,真正的军队将不相关的文本插入到消息中以便将其丢弃。当时使用的策略密码学家是寻找更长的重复字符串。在英语中,他们寻找三个字母的单词,如 。在德语中,他们寻找长的复合词,例如一个单位报告的总部名称,或者试图猜测它会在给定的位置和时间发送的天气报告。

答案 1 :(得分:0)

凯撒密码只是用字母表中的一个固定数量的位置替换每个纯文本字符。假设没有套管和英文文本,那么生成所有可能的26个解密并且只是通过眼睛挑选出正确的解密是微不足道的。

对于替代密码,您需要概括解决方案。一种简化的方法是按照您的建议进行频率计数,并按频率的降序对字符进行排序。将它们映射到字母(再次用于英语)ETAOINSRHOLUCMFYWGPBVKXQJZ(例如,假设最常见的字符表示E,下一个最常见的字符表示T,依此类推)。使用映射进行解密。密码越多,解密就越好。它不太可能完全准确,但会为您提供足够的信息来手动填补空白。

更复杂的解决方案可能会从频率分布而不仅仅是排序顺序生成映射,并使用有关语言的已知事实,例如Q通常后跟U.你可以真正看中并检查有向图和三角频率:http://practicalcryptography.com/cryptanalysis/letter-frequencies-various-languages/english-letter-frequencies/