蛮力换位解密 - 分词

时间:2013-11-06 05:06:06

标签: visual-c++ encryption dynamic-programming text-segmentation

我是第二年B. Comp。科学。学生,并有一个密码学任务,真的让我悲伤。我们已经获得了转置加密的英语短语和英语词典文件的文本文件,然后要求编写一个程序,在没有任何用户输入的情况下自动解密自动这些短语。

我的第一个想法是简单地强制强制所有可能的密文排列,这应该是微不足道的。然而,我必须决定哪一个最可能是真正的明文,这就是我正在努力的目标。

此处有关于分词的大量信息,其中包括thisthis等帖子。使用这些信息以及我在大学学到的知识,这是我到目前为止所做的:

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
}

此算法存在两个主要问题:

  1. 速度非常慢,耗时约30秒。解密一个80字符。消息。
  2. 这不完全准确(如果我还没有整整一页,我会详细说明这一点,但您可以使用full VC++ 2012 project自行尝试。)
  3. 有关如何改进此算法的任何建议将不胜感激。 MTIA: - )

0 个答案:

没有答案