Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Caesar密码和频率分析下一步如何进行?_C++_Vector_Ascii_Frequency Analysis_Caesar Cipher - Fatal编程技术网

C++ Caesar密码和频率分析下一步如何进行?

C++ Caesar密码和频率分析下一步如何进行?,c++,vector,ascii,frequency-analysis,caesar-cipher,C++,Vector,Ascii,Frequency Analysis,Caesar Cipher,我知道以前有人问过这个问题,我对如何比较密码和英语的频率表有点了解。这是我在程序中使用的语言,但我不确定如何将其转化为代码 void frequencyUpdate(std::vector< std::vector< std::string> > &file, std::vector<int> &freqArg) { for (int itr_1 = 0; itr_1 < file.size(); ++itr_1) {

我知道以前有人问过这个问题,我对如何比较密码和英语的频率表有点了解。这是我在程序中使用的语言,但我不确定如何将其转化为代码

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;
                }
            }

        }

    }
}
这就是我如何得到一个给定文件的频率,该文件的内容分为行,然后分为字,因此是字符串的双向量,并使用字符-65的ASCII值作为索引。保存保存频率的整数的结果向量

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


这个比较是为了得到一个合适的移位值,以便caesar密码移位来解密文本。我不想使用蛮力每次移动一个,直到文本可读为止。关于如何处理这个问题有什么建议吗?谢谢。

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


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

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


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

取你的频率向量和典型英语文本的频率向量,并找出互相关


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

您将具有暴力元素。这就是你的方法的本质。凯撒密码比一般的替换密码更具限制性。啊,对了。。。嗯,图形遍历在技术上仍然有效,它只是一个节点,对于不同的移位宽度有25个目的地很好的一点是,对于更复杂的算法,可以使用互相关,但在凯撒的例子中,我想计算它要比检查所有26种可能性的暴力攻击更复杂。@Krystian:也许不是-互相关的成本取决于字母表的大小,而不是要解码的文本的大小。您只需在加密文本上传递一次就可以构建频率表。暴力需要在整个文本中进行多次传递,尽管也许你可以提前退出,但如果最初的几个单词出现错误,就像我将其标记为正确答案一样,我不确定如何开始寻找两个向量之间的相互关系。你读过维基百科上的描述吗?为了求和,你需要一个循环。我应该把频率向量中的元素改为百分比而不是整数吗?我这样问是因为在英语字母表中获取字母频率列表往往具有非常大的int值。一旦我得到每个的总和?vector,我怎样才能得到所需的班次?不确定向量是否与函数相似。