我是第二年B. Comp。科学。学生,并有一个密码学任务,真的让我悲伤。我们已经获得了转置加密的英语短语和英语词典文件的文本文件,然后要求编写一个程序,在没有任何用户输入的情况下自动解密自动这些短语。
我的第一个想法是简单地强制强制所有可能的密文排列,这应该是微不足道的。然而,我必须决定哪一个最可能是真正的明文,这就是我正在努力的目标。
此处有关于分词的大量信息,其中包括this和this等帖子。使用这些信息以及我在大学学到的知识,这是我到目前为止所做的:
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
}
此算法存在两个主要问题:
有关如何改进此算法的任何建议将不胜感激。 MTIA: - )