3

我正在尝试使用 cryptopp 将解密例程从 C# 程序移植到 C++,但我遇到了问题。在 C# 程序中,密钥和 IV 都是 256 位。所以我试着做这样的事情:

    char *hash1 = "......";
    std::string hash2;

    CryptoPP::StringSource(hash1, true,new CryptoPP::Base64Decoder(new CryptoPP::StringSink(hash2)));
    CryptoPP::Rijndael::Decryption decryptor(key, 32);
    CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( decryptor, iv);
    CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, (new CryptoPP::StringSink( decryptedData ) ));
    stfDecryptor.Put( reinterpret_cast<const unsigned char*>( hash2.c_str() ), hash2.size() );
    stfDecryptor.MessageEnd();

我得到

StreamTransformationFilter:密文长度不是块大小的倍数。

我试图像这样传递 IV 大小:

    CryptoPP::CBC_Mode<CryptoPP::Rijndael >::Decryption decr;
    decr.SetKeyWithIV(key, 32, iv, 32);

但后来我得到:

IV 长度 32 超过最大值 16。

那么,当数据由长度= 32的IV加密时,如何解密数据?

4

1 回答 1

3

从实现来看,crypto++ 的当前迭代只支持块大小为 16 字节的 Rijndael。由于 CBC 模式的 IV 必须精确地是单个块,因此具有 256 位块大小的 Rijndael 似乎是不可能的。

于 2013-03-19T20:05:18.023 回答