从Crypto ++获取随机输出

时间:2010-09-16 05:23:15

标签: c++ cryptography crypto++

无法弄清楚为什么我从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';

2 个答案:

答案 0 :(得分:0)

RC2Decryption应定义为:

CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), key.size(), keylen);

答案 1 :(得分:0)

RC2 :: Decryption构造函数的参数是:(指向键字节的指针,键字节的长度)。你给它一个指向16个字节但使用64字节长度的指针。 Crypto ++在读取密钥时读取未初始化的内存,因此您可以得到随机结果。

如果要指示有效的密钥长度,可以使用其他构造函数:

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

请注意,使用std :: string来保存密钥。包含0x00字节的密钥是完全合法的,而std :: string不是为了容纳它们而设计的。