LINUX.ORG.RU

BF_cbc_encrypt


0

0

Доброго времени суток всем. Необходимо зашифровать данные алгоритмом Blowfish (да и расшифровать тоже). Юзаю OpenSSL. Вот функция, отвечающая за кодирование:

String crypto::encrypt(const String& data, const String& key){
int datalen=data.length()+1, keylen=key.length()+1;
BF_KEY bf_key;
BF_set_key(&bf_key, keylen, (const unsigned char*)key.c_str());
char *encrypted_data=new char[datalen];
unsigned char iv[8];
memset(iv, 0, sizeof(iv));
BF_cbc_encrypt((const unsigned char*)data.c_str(), (unsigned char*)encrypted_data, datalen, &bf_key, iv, BF_ENCRYPT);
String result(encrypted_data);
delete[] encrypted_data;
return result;
}

String - это класс-наследник от string из <string>. Алгоритм Blowfish работает с ключом в 16 байт и размером блока данных 8 байт. Функция работает нормально для данных в 8 байт. Для данных в 22568 байт кодируются лишь первые 158 байт, что остальные не кодируются. с декодированием тоже самое. Если кто-либо имеет опыт в openssl/blowfish просьба откликнуться. Спасибо.


1. Длина блока encrypted_data может оказаться недостаточной для зашифрованных данных;
2. Копирование String result(encrypted_data), возможно, спотыкается на завершающем нуле.

mannaz
()

> String - это класс-наследник от string из <string>

Страуструп со товарищи тебя за это покарают :))

BreadFan ★★
()
Ответ на: комментарий от mannaz

> 2. Копирование String result(encrypted_data), возможно, спотыкается на завершающем нуле.

что-то мне подсказывает, что в этом-то всё дело.

ОП, обязательно ли тебе возвращать строкой? почему нельзя использовать просто char*?

оно же всё равно будет не в читабельном виде - зачем его в строке хранить?
проще всего хранить в векторе.

то есть:

в месте, откуда вызываешь свою функцию.
std::vector<char> enc_data;
в приведённую тобой функию добавляешь еще один параметр - ссылку на этот вектор. а возвращать она может bool - в зависимости от успешности. или ничего не возвращать.

в твоей функции вместо new:
enc_data.resize(enc_sz);

а в функцию шифрования передавать &enc_data[0].

только, опять же, всегда ли размер будет одинаков у шифрованных данных и у нешифрованных?

g
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.