Использую в проекте 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. Помогите решить проблему