CryptoPP の使用に問題があります。私は AES を使用しており、バイナリ暗号文を base64 にエンコードして表現したいと考えています。
私の問題は、次のコードを実行するとランダムにアサーション エラーが発生することです。
std::string encoded;
// ciphertext is of type std::string from AES
CryptoPP::StringSource(ciphertext, true,
new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));
具体的なアサーション エラーは次のとおりです。
Assertion failed: m_allocated, file include\cryptopp\secblock.h, line 197
この「ランダムな」動作のため、問題は暗号文の内容にあると私は信じています。
私の質問は次のとおりです。私はこれを正しい方法で行っていますか? 私はしばらく困惑しており、成功せずに少し研究してきました。私が見つけることができる最も近いものは次のとおりです。http://www.mail-archive.com/cryptopp-users@googlegroups.com/msg06053.html
私の完全な実装は次のとおりです。
std::string key = "key";
std::string in = "This is a secret message.";
CryptoPP::SHA1 sha;
byte digest[CryptoPP::SHA1::DIGESTSIZE];
sha.CalculateDigest(digest, reinterpret_cast<const byte *>(key.c_str()), key.length());
byte iv[CryptoPP::AES::BLOCKSIZE];
memset(iv, 0x00, CryptoPP::AES::BLOCKSIZE);
CryptoPP::AES::Encryption encrypt(reinterpret_cast<const byte *>(digest), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbc_encrypt(encrypt, iv);
std::string ciphertext;
CryptoPP::StreamTransformationFilter encryptor(cbc_encrypt,
new CryptoPP::StringSink(ciphertext));
encryptor.Put(reinterpret_cast<const unsigned char *>(in.c_str()), in.length() + 1);
encryptor.MessageEnd();
std::string encoded;
CryptoPP::StringSource(ciphertext, true,
new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));