Visual c++ 强力换位解密-分词
我是二年级的工商管理硕士。Sci。学生们,我有一个密码学作业,这真的让我很伤心。我们得到了一个转置加密英语短语的文本文件和一个英语词典文件,然后要求我们编写一个程序,在没有任何用户输入的情况下自动破译这些短语 我的第一个想法是简单地强制所有可能的密文排列,这应该是微不足道的。然而,我必须决定哪一个最有可能是真正的纯文本,这就是我正在努力解决的问题 这里有大量关于分词的信息,包括其他帖子。利用这些信息和我在大学学到的知识,以下是我到目前为止学到的:Visual c++ 强力换位解密-分词,visual-c++,encryption,dynamic-programming,text-segmentation,Visual C++,Encryption,Dynamic Programming,Text Segmentation,我是二年级的工商管理硕士。Sci。学生们,我有一个密码学作业,这真的让我很伤心。我们得到了一个转置加密英语短语的文本文件和一个英语词典文件,然后要求我们编写一个程序,在没有任何用户输入的情况下自动破译这些短语 我的第一个想法是简单地强制所有可能的密文排列,这应该是微不足道的。然而,我必须决定哪一个最有可能是真正的纯文本,这就是我正在努力解决的问题 这里有大量关于分词的信息,包括其他帖子。利用这些信息和我在大学学到的知识,以下是我到目前为止学到的: string DecryptTransposit
string DecryptTransposition(const string& cipher, const string& dict)
{
vector<string> plain;
int sz = cipher.size();
int maxCols = ceil(sz / 2.0f);
int maxVotes = 0, key = 0;
// Iterate through all possible no.'s of cols.
for (int c = 2; c <= maxCols; c++)
{
int r = sz / c; // No. of complete rows if c is no. of cols.
int e = sz % c; // No. of extra letters if c is no. of cols.
string cipherCpy(cipher);
vector<string> table;
table.assign(r, string(c, ' '));
if (e > 0) table.push_back(string(e, ' '));
for (int y = 0; y < c; y++)
{
for (int x = 0; x <= r; x++)
{
if (x == r && e-- < 1) break;
table[x][y] = cipherCpy[0];
cipherCpy.erase(0, 1);
}
}
plain.push_back(accumulate(table.begin(),
table.end(), string("")));
// plain.back() now points to the plaintext
// generated from cipher with key = c
int votes = 0;
for (int i = 0, j = 2; (i + j) <= sz; )
{
string word = plain.back().substr(i, j);
if (dict.find('\n' + word + '\n') == string::npos) j++;
else
{
votes++;
i += j;
j = 2;
}
}
if (votes > maxVotes)
{
maxVotes = votes;
key = c;
}
}
return plain[key - 2]; // Minus 2 since we started from 2
}
该算法存在两个主要问题:
速度非常慢,大约需要30秒。解密一个80个字符。消息
这并不完全准确,若我还并没有占用整个页面的话,我会详细说明这一点,但你们可以自己尝试一下。
任何关于如何改进此算法的建议都将不胜感激。MTIA:-我发现answer.txt有一大堆拼写错误,这可能是它不完全准确的原因之一。示例:EXCPET在第三行到最后一行,GODDREASO在第二行到最后一行,Difficult在最后一行。如果您试图将短语与词典文件进行匹配,那么如果您匹配这些单词,它将失败。@hargobind Yeah教授告诉我们,在一些测试消息中可能存在拼写错误,我们的算法应该会生成相应的答案,无论这是否。所以相应的答案中有这些错误。如果你不介意告诉我,你觉得代码怎么样?我不是C++程序员,所以我不能给你一个批评: