Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Hellrider от Апрель 25, 2013, 14:13



Название: OpenSSL и компиляция, нужна помощь
Отправлено: Hellrider от Апрель 25, 2013, 14:13
Использую в проекте AES шифрование, через OpenSSL. При компиляции выдаёт "aes.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ _EVP_MD_CTX_cleanup в функции "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl sha256(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?sha256@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@Z)" и много такого рода ошибок. Инклюды на openssl нормально подключаются. Вот код самой реализации шифрования
aes.h
Код
C++ (Qt)
#ifndef AES_H
#define AES_H
 
#include <QtCore>
#include <QtGui>
 
 
   QString encrypt(const QString &data, const QString &master);
   QString decrypt(const QString &text, const QString &master);
 
#endif // AES_H
 
aes.ccp
Код
C++ (Qt)
#include "aes.h"
 
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <openssl/rand.h>
 
 
std::string digest_to_hex_string(const unsigned char *digest, int len)
{
   char* hexstring = (char*)malloc(len * 2 + 1);
   len = (len > 510) ? 510 : len;
   for (int i = 0; i < len; i++)
       sprintf(&hexstring[2 * i], "%02x", digest[i]);
   std::string hex(hexstring);
   free(hexstring);
   return hex;
}
 
std::string sha256(std::string text)
{
   EVP_MD_CTX mdctx;
   unsigned char md_value[EVP_MAX_MD_SIZE];
   unsigned int md_len;
 
   EVP_DigestInit(&mdctx, EVP_sha256());
   EVP_DigestUpdate(&mdctx, text.c_str(), text.size());
   EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
   EVP_MD_CTX_cleanup(&mdctx);
 
   return digest_to_hex_string(md_value, md_len);
}
 
QString encrypt(const QString &data, const QString &master)
{
   std::string text = data.toStdString();
   std::string password = master.toStdString();
   EVP_CIPHER_CTX ectx;
   std::string key = sha256(password);
   std::string iv = sha256("aes_iv_" + password);
   int size = text.size();
   unsigned char* out = (unsigned char*)malloc(size);
   int outlen = 0;
   int tlen = 0;
 
   EVP_CIPHER_CTX_init(&ectx);
   EVP_EncryptInit(&ectx, EVP_aes_256_cbc(), (const unsigned char*)key.c_str(), (const unsigned char*)iv.c_str());
   EVP_EncryptUpdate(&ectx, out, &outlen, (const unsigned char*)text.c_str(), text.size());
   tlen += outlen;
   EVP_EncryptFinal(&ectx, out+tlen, &outlen);
   tlen += outlen;
   EVP_CIPHER_CTX_cleanup(&ectx);
 
   std::string res((const char*)out, tlen);
   free(out);
   return QString::fromStdString(res);
}
 
QString decrypt(const QString &data, const QString &master)
{
   std::string text = data.toStdString();
   std::string password = master.toStdString();
   EVP_CIPHER_CTX ectx;
   std::string key = sha256(password);
   std::string iv = sha256("aes_iv_" + password);
   int size = text.size();
   unsigned char* out = (unsigned char*)malloc(size);
   int outlen = 0;
   int tlen = 0;
 
   EVP_CIPHER_CTX_init(&ectx);
   EVP_DecryptInit(&ectx, EVP_aes_256_cbc(), (const unsigned char*)key.c_str(), (const unsigned char*)iv.c_str());
   EVP_DecryptUpdate(&ectx, out, &outlen, (const unsigned char*)text.c_str(), text.size());
   tlen += outlen;
   EVP_DecryptFinal(&ectx, out+tlen, &outlen);
   tlen += outlen;
   EVP_CIPHER_CTX_cleanup(&ectx);
 
   std::string res((const char*)out, tlen);
   free(out);
   return QString::fromStdString(res);
}
 

Есть подозрение на криво установленный openssl, но я не уверен. Устанавливал я его так: скачал версию под винду, установил, из установленного дистрибутива
 скопировал содержимое папок bin, include, lib в Qt библиотеку в соответствующие папки + ддлки тоже в bin. Помогите решить проблему


Название: Re: OpenSSL и компиляция, нужна помощь
Отправлено: lesav от Апрель 26, 2013, 11:53
ssleay32.dll и libeay32.dll положить рядом с бинарником, использующим SSL

Как собирал Qt ?
Код:
configure.exe -opensource -release -shared -debug-and-release -nomake demos -nomake examples -openssl -I C:\OpenSSL-Win32\Include -L C:\OpenSSL-Win32\Lib

Или воспользовался готовым ?


Название: Re: OpenSSL и компиляция, нужна помощь
Отправлено: Hellrider от Апрель 26, 2013, 13:02
ssleay32.dll и libeay32.dll положить рядом с бинарником, использующим SSL

Как собирал Qt ?
Код:
configure.exe -opensource -release -shared -debug-and-release -nomake demos -nomake examples -openssl -I C:\OpenSSL-Win32\Include -L C:\OpenSSL-Win32\Lib

Или воспользовался готовым ?

Изначально использовал стандартную собранную Qt с сайта, ничего не пересобирал, тупо закинул SSL как писал выше. Потом решил собрать из исходников с поддержкой openssl
Код:
-shared -debug-and-release -opensource -openssl -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -nomake demos -nomake examples
В этом случае я тоже засунул по папкам SSL файлы, и собрал сборку - ошибок небыло. Пробую скомпилить проект результат такой же как и был, не разрешенные ссылки. Перелопатил весь гугл,
чего только не пробовал, потом наткнулся на такую штуку как LIBS += -llibeay32 . Прописал в про файле - заработало! Решил попробовать запустить также, только на старой сборке которая не пересобиралась - тоже работает!  :o Чудеса... Собственно, напрашивается такой вопрос - зачем пересобирать Qt под openssl, если можно тупо закинуть файлики по папочкам и все работает?


Название: Re: OpenSSL и компиляция, нужна помощь
Отправлено: Bepec от Апрель 26, 2013, 13:04
Потому что библиотеки могут быть собраны с SSL а могут быть и не собраны.
И если они не собраны с поддержкой, даже закопав свою программу в горы библиотек openSsl ты ничего не получишь :)


Название: Re: OpenSSL и компиляция, нужна помощь
Отправлено: Hellrider от Апрель 26, 2013, 13:31
Ну а так как я подсовываю SSL для соборки Qt, такой способ правильный?