Caesar Cipher w/Frequency 分析下一步如何进行?

Caesar Cipher w/Frequency Analysis how to proceed next?

我知道之前有人问过这个问题,我有点了解如何比较密码和英语之间的频率表(这是我假设它用于我的程序的语言)但我不确定如何将其写入代码。

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

此比较是为了获得适当的移位值,以进行凯撒密码移位以解密文本。我不想使用蛮力并一次移动一个,直到文本可读为止。关于如何处理这个问题的任何建议?谢谢

在英语中,'e'出现频率最高。因此,无论您从密文中得到的最频繁的字母是什么,它很可能映射到 'e'。 因为 e --> X 那么关键应该是 'e' 和你最常用的字母 X.

之间的区别

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

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

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

取你的频率向量和"typical"英文文本的频率向量,并找到互相关

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