1

私はcrypto++ライブラリを使用してアプリケーションを書いています。慣れていない人のために、ECB_ModeテンプレートクラスはCipherModeBaseから継承します。プログラムはコンパイルされて実行されますが、取得した出力が正しくありません。暗号化メソッドをcipher_objectから呼び出すと、ECB_Modeオブジェクトを直接使用する場合と同じようには機能しません。オプションオブジェクトのインスタンス変数が正しく割り当てられていることを確認しました。if_then_else構造体またはswitch_case内にインスタンスを作成して、コードを適切にDRYに保つことができるようにします。私は何が間違っているのですか?

これが私が試していることですが、機能しません:

    CipherModeBase *cipher_object;
    cipher_object == NULL;

    if(options->cipher == BS_AES)
    {
        ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
        cipher_object = &ecbEncryption;
    }
    else if(options->cipher == BS_TWOFISH)
    {
        ECB_Mode<Twofish >::Encryption ecbEncryption(options->key, options->keylen);
        cipher_object = &ecbEncryption;     
    }
cipher_object->processData(args);

動作するものは次のとおりです。

ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
ecbEncryption.processData(args);

PS。ECBモードを使用しないことを知っています。すべてが機能するようになるまで、IVをいじりたくありません。また、C++については比較的経験がありません。

4

2 に答える 2

2

ecbEncryptionオブジェクトは、ifスコープとelseスコープ内のスタックで宣言されます。(スコープは中括弧で囲まれたものです)。

オブジェクトは、オブジェクトが終了時に宣言されたスコープで破棄されます。そのため、processDataを呼び出しているオブジェクトは、そのメソッドを呼び出す前に削除されています。明らかにそれはうまくいきません。

1つのオプションは、スタックの代わりにヒープ上でオブジェクトを宣言できることです。そうすれば、寿命を制御して、希望どおりに機能させることができます。

生のポインタの代わりに、cipher_objectにstd::unique_ptrを使用してみてください。次に、if句とelse句で、次のように割り当てます。

cipher_object.reset( new ECB_Mode<AES>::Encryption(options->key, options->keylen) );

その後、オブジェクトは、cipher_objectのスコープが終了するまでヒープ上に残ります。終了すると、unique_ptrによってオブジェクトが削除されます。また、cipher_objectのスコープは、メソッドを呼び出すまで続きます。

于 2012-06-18T14:55:15.163 に答える
1

ここ:

cipher_object == NULL;

if(options->cipher == BS_AES)
{
    // v
    ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
    cipher_object = &ecbEncryption;
}

ecbEncryptionそのスコープに対してローカルです。ローカルのアドレスを保存していて、スコープ外になった後で使用しています。それは未定義の振る舞いです。新しいキーワードを使用して、ヒープに割り当てる必要があります。

if(options->cipher == BS_AES)
{
    cipher_object = new ECB_Mode<AES >::Encryption(options->key, options->keylen);
}

他のifステートメントについても同じことを行う必要があります。

また、これに注意してください:

cipher_object == NULL;

これに変更する必要があります:

cipher_object = NULL;

ただし、上記のコードを使用して問題を解決する必要があります。

于 2012-06-18T14:50:58.910 に答える