代码之家  ›  专栏  ›  技术社区  ›  Don Reba

从Crypto获取随机输出++

  •  1
  • Don Reba  · 技术社区  · 15 年前

    我不明白为什么我会从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 回复  |  直到 15 年前
        1
  •  0
  •   Rasmus Faber    15 年前

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

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

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

    使用std::字符串保存密钥。一个键包含一个0x00字节是完全合法的,而std::string并不是用来保存这些字节的。

        2
  •  0
  •   Don Reba    15 年前

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