Visual c++ 强力换位解密-分词

Visual c++ 强力换位解密-分词,visual-c++,encryption,dynamic-programming,text-segmentation,Visual C++,Encryption,Dynamic Programming,Text Segmentation,我是二年级的工商管理硕士。Sci。学生们,我有一个密码学作业,这真的让我很伤心。我们得到了一个转置加密英语短语的文本文件和一个英语词典文件,然后要求我们编写一个程序,在没有任何用户输入的情况下自动破译这些短语 我的第一个想法是简单地强制所有可能的密文排列,这应该是微不足道的。然而,我必须决定哪一个最有可能是真正的纯文本,这就是我正在努力解决的问题 这里有大量关于分词的信息,包括其他帖子。利用这些信息和我在大学学到的知识,以下是我到目前为止学到的: string DecryptTransposit

我是二年级的工商管理硕士。Sci。学生们,我有一个密码学作业,这真的让我很伤心。我们得到了一个转置加密英语短语的文本文件和一个英语词典文件,然后要求我们编写一个程序,在没有任何用户输入的情况下自动破译这些短语

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

这里有大量关于分词的信息,包括其他帖子。利用这些信息和我在大学学到的知识,以下是我到目前为止学到的:

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++程序员,所以我不能给你一个批评: