【问题标题】:Caesar Cipher w/Frequency Analysis how to proceed next?带有频率分析的凯撒密码接下来如何进行?
【发布时间】:2015-03-03 19:39:24
【问题描述】:

我知道以前有人问过这个问题,并且我对如何比较密码和英语之间的频率表有一定的了解(这是我假设它用于我的程序的语言),但我不确定如何获得这变成了代码。

void frequencyUpdate(std::vector< std::vector< std::string> > &file, std::vector<int> &freqArg) {
    for (int itr_1 = 0; itr_1 < file.size(); ++itr_1) {

        for (int itr_2 = 0; itr_2 < file.at(itr_1).size(); ++itr_2) {

            for (int itr_3 = 0; itr_3 < file.at(itr_1).at(itr_2).length(); ++itr_3) {
                file.at(itr_1).at(itr_2).at(itr_3) = toupper(file.at(itr_1).at(itr_2).at(itr_3));

                if (!((int)file.at(itr_1).at(itr_2).at(itr_3) < 65 || (int)file.at(itr_1).at(itr_2).at(itr_3) > 90)) {
                    int temp = (int)file.at(itr_1).at(itr_2).at(itr_3) - 65;
                    freqArg.at(temp) += 1;
                }
            }

        }

    }
}

这就是我如何获得给定文件的频率,该文件将其内容分成行然后分成单词,因此是字符串的双向量并使用字符的 ASCII 值 - 65 作为索引。保存频率的结果向量。

现在是我不知道如何进行的地方。我是否应该在const std:: vector &lt;int&gt; 中硬编码字母的英文频率,然后以某种方式进行比较?我将如何有效地比较而不是简单地比较每个向量,因为这可能不是一种有效的方法?

这个比较是为了得到一个适当的移位值,用于凯撒密码移位来解密文本。在文本可读之前,我不想使用蛮力并一次移动一个。关于如何解决这个问题的任何建议?谢谢。

【问题讨论】:

  • 你会有蛮力元素。这就是你的方法的本质。

标签: c++ vector ascii frequency-analysis caesar-cipher


【解决方案1】:

获取您的频率向量和“典型”英文文本的频率向量,并找到互相关

互相关的最高值对应于最可能的偏移值。此时,您需要使用每一个来解密,并查看输出是否合理(即形成真实的单词和连贯的句子)。

【讨论】:

  • 好点,对于更复杂的算法,人们会使用互相关,但如果是凯撒,我猜计算它会比检查所有 26 种可能性的“蛮力攻击”更复杂。
  • @Krystian:也许不是——互相关的成本取决于字母的大小,而不是要解码的文本的大小。您只需遍历加密文本即可构建频率表。蛮力需要对整个文本进行多次遍历(尽管如果前几个单词出来不好,也许你可以提前退出)
  • 尽管我确实将此标记为正确答案,但我不确定如何开始找到两个向量之间的互相关。
  • 您阅读了维基百科上的描述?要进行求和,您需要一个循环。
  • 我应该将频率向量中的元素更改为百分比而不是整数吗?我问是因为获取英文字母表中字母的频率列表往往具有非常大的 int 值。一旦我得到每个的总和?矢量,我将如何获得所需的转变?不确定向量是否类似于函数。
【解决方案2】:

在英语中,“e”的频率最高。所以无论你从密文中得到什么最常见的字母,它最有可能映射到“e”。 由于 e --> X 那么关键应该是 'e' 和你最常用的字母 X 之间的区别。

如果这不是正确的密钥(由于太短的密文扭曲了统计数据),请尝试将您最常用的密文字母与英文中的第二个字母匹配,即 a。

【讨论】:

    【解决方案3】:

    我会建议一个图遍历算法。您的起始节点没有分配替换,并且有 26 个连接的节点,每个可能的字母替换最常出现的密文字母。下一个节点有另外 25 个连接节点,用于第二个最常见的密文字母的可能字母(少一个,因为您已经使用了一个可能的字母)。您选择哪个目标节点应基于哪些字母最有可能给定目标语言的正态频率分布。

    在每个节点上,您可以通过对密文进行替换来测试是否成功,并找到现在与字典文件中的条目匹配的所有结果单词。您找到的匹配项越多,您获得正确替换键的可能性就越大。

    【讨论】:

    • 凯撒密码比通用替换密码更严格。
    • 啊对...好吧,从技术上讲,图遍历仍然可以工作,它只是一个具有 25 个目的地的单个节点,用于不同的移位宽度。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2020-05-31
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多