【发布时间】:2013-03-05 04:36:03
【问题描述】:
我正在尝试使用 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 加密时,我该如何解密数据?
【问题讨论】:
-
从the CryptoPP website 上的图表来看,我有点犹豫是否建议它支持除 128 位块之外的任何东西。 (显然它支持更大的 keys)。如果他们的削减仅符合 AES,那么这是有道理的,因为没有 AES 衍生产品使用超过 16 字节的块和 IV)。看看the header file 就很有说服力了。
-
@WhozCraig 你是指上面写着
FixedBlockSize<16>的那部分? -
@owlstead 差不多,是的。老实说,我不知道它是否会派生出你自己的
Rijindael_Info32作为public FixedBlockSize<32>, public VariableKeyLength<16, 16, 32, 8>的扩展,或者甚至是public FixedBlockSize<32>, public FixedKeyLength<32>,而算法的其余部分只会占据并工作,因为我不是对 CryptoPP 足够熟悉,可以拨打电话。我的悲观主义者说这不太可能。 -
@WhozCraig 好吧,我不是 Rijndael 实现方面的专家,但我仍然很确定这也不太可能。
-
@WhozCraig 发布了我们的调查结果作为答案,并提高了一些您接受/好的答案作为回报
标签: c++ encryption aes crypto++