C# 通过频率分析,在不知道明文或密钥的情况下破译Caesar密码文本

C# 通过频率分析,在不知道明文或密钥的情况下破译Caesar密码文本,c#,encryption,frequency-analysis,caesar-cipher,C#,Encryption,Frequency Analysis,Caesar Cipher,我正在尝试制作一个程序,它可以帮助你在不知道明文和密钥的情况下破解密码文本 我希望在输出中有可能的纯文本,它给出最接近的统计值和一组可能的候选键 我开始做频率分析,完成了。它帮助我知道每个字母的出现,但我不知道如何从中生成键 class Program { static void Main() { // Array to store frequencies. int[] c = new int[(int)char.MaxValue];

我正在尝试制作一个程序,它可以帮助你在不知道明文和密钥的情况下破解密码文本

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

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

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]);
            }
         }
    }
}
类程序
{
静态void Main()
{
//存储频率的数组。
int[]c=newint[(int)char.MaxValue];
//读取整个文本文件。
字符串s=File.ReadAllText(“text.txt”);
//迭代每个字符。
foreach(字符t在s中)
{
//增量表。
c[(int)t]++;
}
//写下所有找到的信。
对于(int i=0;i<(int)char.MaxValue;i++)
{
如果(c[i]>0&&
char.isleterordigit((char)i))
{
WriteLine(“字母:{0}频率:{1}”,
(char)我,
c[i]);
}
}
}
}

对于简单的字母替换密码,您需要获得英文字母频率列表,并尝试将它们映射到消息中最频繁的字母。请注意。在计算机出现之前,真正的军队在信息中插入不相关的文本来摆脱这种情况。当年,密码学家使用的一种策略是寻找更长的重复字符串。在英语中,他们寻找三个字母的单词,如and、the、not或for。在德语中,他们寻找长的复合词,比如一个单位向其报告的总部的名称,或者试图猜测它在给定的地点和时间会发送什么天气报告。

凯撒密码只是将每个纯文本字符替换为字母表中固定位置以外的一个字符。假设没有大小写和英文文本,那么生成所有可能的26个解密并仅凭肉眼挑出正确的一个就很简单了

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


更复杂的解决方案可能会根据频率分布生成映射,而不仅仅是排序顺序,并使用有关该语言的已知事实,例如,Q后面通常跟U。你可以非常有趣地检查有向图和三叉图的频率:

在程序破坏第一个加密字符串之前,你可能会老死。@artjomB。我已经添加了代码,敬请检阅。如果没有密钥就很容易破译,那么我知道人们首先会使用这种加密技术。你在寻找什么样的暴力计划,可能需要几年才能得到任何结果。你为什么要这样做?你为什么要做这样的项目?您的程序将解决什么问题?丢失的信息太多,无法以任何有意义的方式帮助您。使用了什么密码(古典的像凯撒还是现代的像AES)?到目前为止,您取得了哪些成果(请提供一些数据)?你知道什么样的数据应该在那里(文本或二进制)?公平地说,这可能是有趣的证明谁是刚刚进入该领域的人。这几乎不像是一种威胁,如果这是一位真正想成为瓦雷斯作家的人,我会感到安全:)