1

Crypto++ RC2 デコーダーから一見ランダムな出力が得られる理由がわかりません。インプットは常に同じですが、アウトプットは常に異なります。

const char * cipher     ("o4hk9p+a3+XlPg3qzrsq5PGhhYsn+7oP9R4j9Yh7hp08iMnNwZQnAUrZj6DWr37A4T+lEBDMo8wFlxliuZvrZ9tOXeaTR8/lUO6fXm6NQpa5P5aQmQLAsmu+eI4gaREvZWdS0LmFxn8+zkbgN/zN23x/sYqIzcHU");
int          keylen     (64);

unsigned char keyText[] = { 0x1a, 0x1d, 0xc9, 0x1c, 0x90, 0x73, 0x25, 0xc6, 0x92, 0x71, 0xdd, 0xf0, 0xc9, 0x44, 0xbc, 0x72, 0x00 };
std::string key((char*)keyText);

std::string data;
CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), keylen);
CryptoPP::ECB_Mode_ExternalCipher::Decryption rc2Ecb(rc2);
CryptoPP::StringSource
    ( cipher
    , true
    , new CryptoPP::Base64Decoder
        ( new CryptoPP::StreamTransformationFilter
            ( rc2Ecb
            , new CryptoPP::StringSink(data)
            , CryptoPP::BlockPaddingSchemeDef::NO_PADDING
            )
        )
    );

std::cout << data << '\n';
4

2 に答える 2

0

RC2Decryption は次のように定義されている必要があります。

CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), key.size(), keylen);
于 2010-09-16T12:09:26.407 に答える
0

RC2::Decryption コンストラクターへのパラメーターは次のとおりです: (キーバイトへのポインター、キーバイトの長さ)。16 バイトへのポインターを指定していますが、64 バイトの長さを使用しています。Crypto++ はキーの読み取り時に初期化されていないメモリを読み取っているため、ランダムな結果が得られます。

有効なキーの長さを示したい場合は、次のように他のコンストラクターを使用できます。

CryptoPP::RC2Decryption rc2(keyText, 16, keylen);

キーを保持するために std::string を使用しないでください。キーが 0x00 バイトを含むことは完全に合法であり、std::string はそれらを保持するようには設計されていません。

于 2010-09-16T12:18:53.560 に答える