使用C语言破解凯撒密码

标签 c encryption brute-force

我正在编写一个程序来使用 Cecer 密码算法解密文本。 到目前为止,我的代码工作正常并获得所有可能的解密结果,但我必须仅显示正确的结果,我该怎么做? 下面是获取所有解密字符串的代码。 对于我的代码答案应该是“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 种可能的移位。此外,对于长度较长的文本,很有可能只有一次转换才能使输入有意义。那么,一种可能的方法是看看转变的结果是否有意义;如果确实如此,那么这可能是正确的转变(例如,将单词与字典进行比较,看看它们是否是“真实”的单词;不确定您是否已经完成了网络服务,但有 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 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).

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

关于使用C语言破解凯撒密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40536345/

相关文章:

node.js - 资源优化 : which one to use Knapsack, 蛮力或任何其他方法?

正确的输出,但 codechef 在提交代码时说错了

java - AES 解密 : javax. crypto.IllegalBlockSizeException:解密中的最后一个 block 不完整

c# - 得到错误 : "Specified block size is not valid for this algorithm" while initialize AesCryptoProvider

php - 这些加密算法之间有什么区别?

c++ - 避免或改进暴力破解方法 : Counting character repetition from all words in a dictionary text file

c++ - 在 C++ 中创建蛮力算法

c - 如何在 C 中使用正则表达式查找文件中的一行?

c - Realloc 在 For 循环中不起作用

c++ - 防止 Windows 程序将 ^Z 解释为文件结尾