我正在编写一个使用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 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;徐熙达,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”实例-因此您可能要应用多个统计测试,以增加您的信心(尤其是较短的文字)。