0

これは以前に尋ねられたことを理解しており、暗号と英語の間で頻度表を比較する方法をある程度把握しています(これは私のプログラムで想定している言語です)が、これをコードに組み込む方法がわかりません.

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 を使用します。周波数を保持する int の結果のベクトルが保存されます。

ここで、どのように進めるかを結びません。英語の文字の頻度をa にハードコードしてconst std:: vector <int>から、どうにかして比較する必要がありますか? 単純に各ベクトルを互いに比較するのではなく、効率的に比較するにはどうすればよいでしょうか?効率的な方法ではない可能性があります。

この比較は、シーザー暗号シフトでテキストを復号化するための適切なシフト値を取得するためのものです。テキストが読めるようになるまで、ブルートフォースを使用して一度に1つずつシフトしたくありません。これにアプローチする方法についてのアドバイスはありますか?ありがとう。

4

3 に答える 3

0

頻度ベクトルと「典型的な」英語テキストの頻度ベクトルを取り、相互相関を見つけます。

相互相関の最大値は、最も可能性の高いシフト値に対応します。その時点で、それぞれを使用して解読し、出力が適切かどうかを確認する必要があります (つまり、実際の単語と一貫した文が形成されます)。

于 2015-03-03T20:00:57.583 に答える
0

英語では、「e」が最も頻度が高いです。したがって、暗号文から取得した最も頻繁な文字が何であれ、それはおそらく「e」にマップされます。e --> X であるため、キーは「e」と最も頻繁に使用する文字 X の差になります。

これが適切なキーでない場合 (暗号文が短すぎて統計が歪められているため)、最も頻繁に使用される暗号文の文字を英語の iea の 2 番目の文字と一致させてみてください。

于 2015-03-03T19:49:57.657 に答える