Я пытаюсь перенести процедуру дешифрования с C # на C ++, используя cryptopp, но у меня есть проблема. В программе 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.
Итак, как я могу расшифровать данные, когда они были зашифрованы IV с длиной = 32?
Глядя на реализацию, текущие итерации crypto ++ поддерживают только Rijndael с размером блока 16 байтов. Поскольку IV должен быть точно одним блоком для режима CBC, Rijndael с размером блока 256 битов, кажется, не представляется возможным.
Других решений пока нет …