2

CS106L で STL アルゴリズムに関する演習を行っています。質問の 1 つは、random_shuffle を使用した置換暗号化について尋ねます。

問題は、random_shuffle を使用して、ソース文字列を受け取り、ランダムな単アルファベット置換暗号で暗号化する関数 MonoalphabeticSubstitutionEncrypt を実装することです。

つまり、最初に「AB..XYZ」があり、random_shuffle を AZ に呼び出し、「KVDQ...MSB」のようなものを生成してから、元の文字列を暗号化するマッピングを行います。

マッピングを使用して実行できますが、それらの STL アルゴリズムのみを使用して実行する必要があります。

誰にもアイデアがありますか?ありがとうございました!

私はこのようにしていますが、STLアルゴリズムの力を使っていないようです

string MonoSubsitutionEncrypt(string line){
    string original = "abcdefghijklmnopqrstuvwxyz";
    string excrypt = original;
    random_shuffle(encrypt.begin(), encrypt.end());
    map<char, char> m;
    for (int i = 0;i < original.length(); i++) 
        m.insert(make_pair(original[i],encrypt[i]));
    string result;
    for (int i = 0; i < line.length(); i++)
         result += m[line[i]];
    return result;
}
4

2 に答える 2

1

バイトを他のバイトにランダムにシャッフルするバージョンを作成しました。ASCII文字のみを受け入れて出力するには、いくつかのフープを通過する必要があります。文字列の末尾を示すためにヌル文字を保持する必要があるため、ヌル文字を特別に扱いました。

私のアルゴリズムの疑似コードは次のとおりです。

#include <algorithm>
#include <iostream>
#include <vector>
#include <string>

template class Filler (T)
    constructor Filler(T item)
        initial = item

    T operator () ()
        return initial++

    private T initial

template class Encryptor (T1, T2)
    constructor Encryptor(T1 mapping)
        cipher = mapping

    T2 operator () (T2 value)
        return cipher[value]

    private T1 cipher

int main (int c, char * v[])
    // stl class, big enough to hold each char
    vector<unsigned char> alphabet(256)       

    // creates a filler object described above
    Filler<unsigned char> filler(0)           

    // stl function, fills alphabet with one of each char
    generate_n(alphabet.begin(), 256, filler) 

    // stl function, shuffles alphabet (start at 1, leave NULL character at beginning)
    random_shuffle(alphabet.begin() + 1, alphabet.end())

    // creates a generator to be passed to transform
    Encryptor<vector<unsigned char>, unsigned char> e(alphabet)

    // get input value: either first parameter, or nothing if no parameters
    string input = c > 1 ? v[1] : ""

    // stl function, uses encryptor containing alphabet mapping to obfuscate input
    transform(input.begin(), input.end(), input.begin(), e)

    // printing the string yields garbled crap
    cout << input << endl;

使用される stl クラスのドキュメント: string vector ostream

使用される stl メソッドのドキュメント: generate_n random_shuffle transform

この投稿があまりにも多くを与える場合は、誰かが編集してください。

于 2012-07-26T00:17:14.687 に答える
0

作成時に配列/ベクトルを作成してシャッフルするマッピングクラスとoperator()、暗号化されたバージョンの入力を返すオーバーロードを使用します。大いに役立つようにするには、暗号化されたアルファベットを取得して復号化のキーとして使用するためのメンバー関数 (またはおそらく演算子) も必要です。

これで、暗号化自体を で行うのは非常に簡単なはずstd::transformです。

于 2012-07-25T22:53:04.923 に答える