我正在编写一个使用stop 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);
    }
  }
}

最佳答案

回想一下,凯撒密码只有25种可能的移位。另外,对于长度不重要的文本,很可能只有一次移位才能使输入有意义。因此,一种可能的方法是查看转移的结果是否有意义。如果是,则可能是正确的转换(例如,将单词与词典进行比较以查看它们是否为“真实”单词;不确定您是否已经完成了Web服务,但是有free dictionary APIs可用)。

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


3 gdkkn vnqkc(12)
3 xubbe mehbt(3)
3你好世界(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。帕德(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;徐熙达,IWTC X'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)。


这里的关键词是“可能的”-从统计意义上来说并不确定(尤其是对于较短的文本),并且有可能在某种程度上编写对此技术具有抵抗力的文本(例如,通过故意的拼写错误,lipograms等)。注意,实际上我上面有一个例外的例子-尽管第二个显然是正确的移位,但“ 3 xubbe mehbt”比“ 3 hello world”具有更多的字母“ e”实例-因此您可能要应用多个统计测试,以增加您的信心(尤其是较短的文字)。

08-17 23:32