Ceaser Cipher使用C语言破解

时间:2016-11-10 20:21:36

标签: c encryption brute-force

我正在编写一个使用ceaser cypher算法解密文本的程序。 到目前为止我的代码工作正常,并获得所有可能的解密结果,但我必须显示正确的一个,我该怎么做? 下面是获取所有解密字符串的代码。 对于我的代码,答案应该是“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);
    }
  }
}

2 个答案:

答案 0 :(得分:0)

回想一下,Caesar Cipher只有25个可能的转变。此外,对于非平凡长度的文本,高度可能一个班次将使输入有意义。那么,一种可能的方法是看看转变的结果是否有意义;如果确实如此,那么它可能是正确的转变(例如,将字词与字典进行比较以查看它们是否是“真实”字词;不确定您是否已经完成了Web服务,但有free dictionary APIs可用)。

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

  • 3 gdkkn vnqkc(12)
  • 3 xubbe mehbt(3)
  • 3 hello world(13)
  • 3 jgnnq yqtnf(15)

正如您所看到的,只有13的移位使得该文本包含“真实”单词,因此正确的移位可能是13。

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

  

Gtrpaa iwpi p Rpthpg Rxewtg wph dcan 25 edhhxqat hwxuih。 Pahd,udg   itmi du cdc-igxkxpa atc​​viw,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; qdi hjgt xu ndj'kt sdct ltq htgkxrth nti,qji   iwtgt pgt ugtt sxrixdcpgn PEXh pkpxapqat)。

这里的关键词是“可能的” - 它在统计上并不确定(特别是对于较短的文本)并且可以在某种程度上编写对该技术具有抵抗力的文本(例如通过故意拼写错误lipograms,等等。)。请注意,我实际上有一个上面例外的例子 - “3 xubbe mehbt”有更多的字母“e”而不是“3 hello world”的实例,即使第二个明显是正确的移位 - 所以你可能想申请几个统计测试以增加您的信心(特别是对于较短的文本)。

答案 1 :(得分:0)

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

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