当前位置: 首页 > 知识库问答 >
问题:

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

封瑞
2023-03-14

我想做一个程序,可以帮助你打破密码文本,而不知道纯文本和密钥。

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

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

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个答案

巫马英豪
2023-03-14

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

颜举
2023-03-14

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

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

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

 类似资料:
  • 这里是一个加密的消息,首先使用3个位置的凯撒密码,然后5个位置。 解密时应该说: 好的,这是我写的类(您将需要所有的导入),我想感谢任何提前帮助的人:

  • 我需要编写一个python、hacker和wow这些单词的加密文本,并且使用不包括使用RAW_INPUT的python中的凯撒密码,距离为3。这是我到目前为止,但我不断得到一个错误消息,我不知道如何修复它。

  • 我想知道如何限制加密的ASCII范围从32-126。 这个是用来解密的 我的加密工作得很好(当我引用解密函数时),但我的解密并不像它应该的那样工作。 额外注意:我们只需要在编码时进行右移,给出一个字符串供整个程序加密和解密(“这是C++”) 注意:在添加更多代码描述的过程中

  • 本网站(https://www.guballa.de/substitution-solver)他做到了。 我必须通过频率分析来做到这一点(https://en.wikipedia.org/wiki/Frequency_analysis) 我面临的主要问题是,当我替换时,检查单词是否看起来像英语单词。 请指导我如何处理这个问题 谢谢哈基德

  • 问题内容: 我通过java进行了凯撒密码,它可以运行,但是在用户输入密钥后不对任何内容进行加密! 这是我的代码 跑: 问题答案: 使用效率不是很高…您可以对值进行整数运算以获得其索引。 我在代码中添加了注释以解释更多信息,但这就是我想出的。 输出应该是这样的

  • 我目前正在学习如何使用Python中的凯撒密码方法进行加密/解密。我已经研究了如何加密'14:00/船只就位',以接收'7,21,18,_6,21,22,3,6,_14,5,18,_22,1,_3,2,6,22,7,22,2,1',但正在努力如何编写解密代码。具体地说,我不确定如何使用if/else语句正确地反转原始加密,以及如何将数字转换回字母。每封信将根据小时(班次)的变化。 解密代码