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

Break a Caesar-cipher cipher text without knowing the plaintext or the key through frequency-analysis

我正在尝试编写一个程序,它可以帮助您在不知道明文和密钥的情况下破解密文。

我希望输出中的可能纯文本给出最接近的统计值和一组可能的候选键

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

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]);
            }
         }
    }
}

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

凯撒密码只是将每个纯文本字符替换为一个固定数量的字母表字符。假设没有大小写和英文文本,那么产生所有可能的 26 种解密并仅凭眼睛挑出正确的一种是微不足道的。

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

更复杂的解决方案可能会根据频率分布生成映射,而不仅仅是排序顺序,并使用有关语言的已知事实,例如Q 通常跟在 U 之后。您可以非常喜欢并检查二字母和三字母频率:http://practicalcryptography.com/cryptanalysis/letter-frequencies-various-languages/english-letter-frequencies/