Caesar Cipher破解使用C语言

Ceaser Cipher crack using C language

我正在编写一个程序来使用 ceaser 密码算法解密文本。 到目前为止,我的代码运行良好并获得所有可能的解密结果,但我必须只显示正确的结果,我该怎么做? 下面是获取所有解密字符串的代码。 我的代码答案应该是“3 hello world”。

void main(void)
{
  char input[] = "gourz#roohk";
  for(int key = 1;x<26;key++)
  {
    printf("%i",input[I]-x%26);
    for(int i = strlen(input)-1;i>=0;i--)
    {
      printf("%c",input[I]-x%26);
    }
  }
}

回想一下,凯撒密码只有 25 种可能的移位。此外,对于非平凡长度的文本,很可能 一个移位将使输入有意义。那么,一种可能的方法是查看转变的结果是否有意义;如果是,那么它可能是正确的转变(例如,将单词与字典进行比较,看看它们是否是 "real" 个单词;不确定您是否已经完成了网络服务,但是有 free dictionary APIs 个可用).

考虑以下文本:3 uryyb jbeyq。一些可能的转变:

  • 3 gdkkn vnqkc (12)
  • 3 xubbe mehbt (3)
  • 3 你好世界 (13)
  • 3 jgnnq yqtnf (15)
  • 等等

如您所见,只有 13 的移位使该文本包含 "real" 个单词,因此正确的移位可能是 13。

另一种可能的解决方案(虽然更复杂)是通过 frequency analysis(即查看生成的文本是否具有与英语相同或相似的统计特征)。例如,在英语中,最常见的字母是 "e,",因此正确的转换可能会将 "e" 作为最常见的字母。例如,这个答案的第一段包含字母 "e" 的 48 个实例,但是如果将它移动 15 个字母,它只有 8:

Gtrpaa iwpi p Rpthpg Rxewtg wph dcan 25 edhhxqat hwxuih. Pahd, udg itmi du cdc-igxkxpa atcviw, xi'h wxvwan axztan iwpi dcan dct hwxui lxaa bpzt iwt xceji bpzt htcht. Dct edhhxqat peegdprw, iwtc, xh id htt xu iwt gthjai du iwt hwxui bpzth htcht; xu xi sdth, iwtc xi'h egdqpqan iwt rdggtri hwxui (t.v. rdbepgt ldgsh pvpxchi p sxrixdcpgn id htt xu iwtn'gt "gtpa" ldgsh; cdi hjgt xu ndj'kt sdct ltq htgkxrth nti, qji iwtgt pgt ugtt sxrixdcpgn PEXh pkpxapqat).

这里的关键词是 "likely" - 它在统计上根本不是确定的(尤其是对于较短的文本)并且可以编写在某种程度上抵抗该技术的文本(例如通过故意拼写错误,lipograms,等等)。请注意,我实际上有一个上面的异常示例 - “3 xubbe mehbt” 比“3 hello world” 有更多字母 "e" 的实例,即使第二个显然是正确的转变 - 所以你可能想要应用多项统计测试来增加您的信心(尤其是对于较短的文本)。

你好,要对凯撒密码进行攻击,更快的方法是频率分析攻击,你可以计算文本中每个字母的频率以及它出现的次数,并将这个字母与英语中出现次数最多的字母进行比较这个 link ( https://www3.nd.edu/~busiforc/handouts/cryptography/letterfrequencies.html ) 然后通过将此 table 应用于字母,您可以 git 文本或使用此 link 它的代码获取中心 (https://github.com/tombusby/understanding-cryptography-exercises/blob/master/Chapter-01/ex1.2.py) 在 python 中,对于字母频率最后的答案是蛮力,因为它比频率分析更复杂
这里的蛮力是 26!这意味着通过获取字母 space 搜索字母减少一个

如果你想使用你的代码,你可以为最流行的英文字符串创建一个文件,每次解密时你都会在这个文件中搜索,但这样做会花费很多时间,所以字母频率越高越好