在二进制数据上使用CryptoPP :: Base64Encoder(密文)

时间:2011-11-04 20:42:48

标签: c++ base64 crypto++

我在使用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)));

2 个答案:

答案 0 :(得分:1)

目前你的意图有点不清楚。 您为什么要使用SHA摘要作为AES加密的密钥?

关于代码中的错误,

你的密码是一个字符串。如果想与某人沟通 你可以随时发送它。 为什么在代码末尾使用Base 64编码器? 如果您的密文是二进制形式,那么您可以使用Base64 Encoder 将其转换为ASCII字符串格式。 只要不是,您的代码中就不需要以下部分。

std::string encoded;
StringSource(ciphertext, true, new Base64Encoder(new StringSink(encoded)));

答案 1 :(得分:1)

  

我的问题是:我这样做是否正确?

是的,代码很好(digest.erase();除外)。


  

我被困了一段时间,并且一直在研究,但没有成功。

在内存检查器下运行它。 Valgrind或Clang Asan(地址消毒剂)。


  

我能找到的最接近的是:http://www.mail-archive.com/cryptopp-users@googlegroups.com/msg06053.html

我过去也遇到过这种说法。我不记得是iOS还是Linux。我认为是具有特定版本GCC的Linux(可能是4.4或4.5)。


  

我的问题是我在运行以下代码时随机出现断言错误:

CryptoPP::StringSource(ciphertext, true, 
    new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));

将上述内容更改为:

CryptoPP::StringSource ss(ciphertext, true, 
    new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));

GCC的一个版本存在匿名声明问题。它会很快开始运行对象析构函数。