0

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

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 <int>字母的英文频率,然后以某种方式进行比较吗?我将如何有效地比较而不是简单地比较每个向量,因为这可能不是一种有效的方法?

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

4

3 回答 3

0

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

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

于 2015-03-03T19:49:57.657 回答
0

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

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

于 2015-03-03T19:54:21.550 回答
0

取你的频率向量和“典型”英文文本的频率向量,然后找到互相关

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

于 2015-03-03T20:00:57.583 回答