我知道以前曾经问过这个问题,而且我对如何比较密码和英语之间的频率表有一定的把握(这是我为我的程序假设它的语言),但我不确定关于如何将其转化为代码。
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>
硬编码英文频率的字母然后以某种方式进行比较吗?我如何有效地进行比较而不是简单地将每个向量相互比较,这可能不是一种有效的方法?
此比较用于获取凯撒密码转换的适当移位值以解密文本。我不想使用蛮力并一次移动一个直到文本可读。关于如何处理这个问题的任何建议?感谢。
答案 0 :(得分:0)
用英语,&#39; e&#39;频率最高。因此,无论您从密文中获得最常见的信件,它都很可能映射到&#39; e。 因为e - > X然后关键应该是&#39; e&#39;和你最常见的字母X。
如果这不是正确的密钥(由于密文太短导致统计信息失真),请尝试将最常用的密文字母与第二个密文用英语匹配,即a。
答案 1 :(得分:0)
我建议使用图遍历算法。您的起始节点没有分配替换,并且有26个连接的节点,每个可能的字母替换一个最常出现的密文字母。下一个节点有另外25个连接节点,用于第二个最常用的密文字母的可能字母(少一个,因为你已经使用过一个可能的字母)。您选择的目标节点应基于哪些字母最有可能被赋予目标语言的正常频率分布。
在每个节点上,您可以通过对密文进行替换来测试成功,并查找现在与字典文件中的条目匹配的所有结果单词。您找到的匹配越多,您就越有可能获得正确的替换密钥。
答案 2 :(得分:0)
将频率向量和频率向量取为&#34;典型值&#34;英文文本,找到互相关。
互相关的最高值对应于最可能的移位值。此时,你需要使用每一个来解密,并查看输出是否合理(即形成真实的单词和连贯的句子)。