Использование CryptoPP :: Base64Encoder для двоичных данных (зашифрованный текст) - PullRequest
3 голосов
/ 05 ноября 2011

У меня проблема с использованием 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 ]

1 голос
/ 04 октября 2013

Мой вопрос: правильно ли я это делаю?

Да, код в порядке (кроме digest.erase();).


Я какое-то время находился в тупике и немного занимался исследованиями.

Запустите его под контролем памяти.Valgrind или Clang Asan (очиститель адресов).


Ближайшая вещь, которую я могу найти: http://www.mail-archive.com/cryptopp-users@googlegroups.com/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 голос
/ 27 августа 2012

Ваше намерение немного неясно в данный момент.Почему вы хотите использовать дайджест SHA в качестве ключа для шифрования AES?

А что касается ошибки в вашем коде,

Ваш шифр в конце - строкаИ если вы хотите сообщить это кому-то, вы можете с готовностью отправить это.Почему вы использовали кодировщик Base 64 в конце кода?Если бы ваш зашифрованный текст был в двоичной форме, вы могли бы использовать Base64 Encoder для преобразования его в формат ASCII String.Пока это не так, вам не нужна следующая часть в вашем коде.

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