2011-11-04 129 views
3

我有一个使用CryptoPP的问题。我使用AES,并且想通过将它编码为base64来表示二进制密文。在二进制数据(密文)上使用CryptoPP :: Base64Encoder

我的问题是,运行下面的代码时,我随机得到的断言错误:

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/[email protected]/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))); 
+0

你是什么意思的错误?崩溃?输出无效?输出错误? –

+0

用特定的断言错误更新了我的问题。 – Parazuce

回答

1

我的问题是:我是不是该做的正确方法?

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


我已经难倒了一段时间,并已研究了一下没有成功。

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


我能找到最接近的是:http://www.mail-archive.com/[email protected]/msg06053.html

我遇到以往那种说法了。我不记得它是iOS还是Linux。我认为这是Linux与特定版本的GCC(可能是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在匿名声明方面存在问题。它会很快开始运行对象析构函数。

1

你的打算是有点不清楚的时刻。 为什么你想使用SHA摘要作为AES加密的密钥?

以及关于你的代码中的错误,

你在最后的密码是一个字符串。如果想要将它传达给某人 ,您可以随时发送它。 为什么在代码的末尾使用Base 64编码器? 如果你的密码文本是二进制格式,你可以使用Base64编码器 将它转换成ASCII字符串格式。 只要不是,您不需要代码中的以下部分。

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