首先在QTcreater创建的QT工程中配置静态库和头文件。
1、
LIBS += -L"E:\OpenSSL-Win32\lib" -llibcrypto
LIBS += -L"E:\OpenSSL-Win32\lib" -llibssl
INCLUDEPATH += $$quote(E:\OpenSSL-Win32\include)
2、openssl的bin目录下把libcrypto-1_1.dll和msvcr120.dll复制到工程目录下,就是拷到build后生成的文件夹比如(debug和release文件夹下),如果不复制,构建时QT会提示程序异常退出。
3、OK,开始运行项目报错:
OPENSSL_Uplink(6B437000,08): no OPENSSL_Applink
这个错呢,百度上一搜就有答案了,就是添加一个头文件
#include "applink.c"
BUT,我的openssl的include里没有applink.c文件,经过一番寻找后,终于在某篇博客中看到:
1.1的版本在include/openssl的目录下没有applink.c
我的解决办法:直接去1.0.2那个版本下把applink.c拷贝到你QT工程所在的目录下,然后在工程中添加现有文件把applink.c添加到工程中。
注意:
如果在添加到工程中后,在代码内再加上头文件#include "applink.c",就又会报指针赋值错误,如果不添加这个头文件,直接构建,运行就都过了。
完美运行,最后附上我的两个加密解密函数,使用之前记得先创建秘钥,具体操作百度很详细。
(data是需要加密/解密的数据,第二个参数是秘钥的路径)
char *data_encrypy(char *data, char *PUB_KEY)
{
//对数据进行加密函数
char *encry_data;
RSA *p_rsa;
FILE *file;
int data_len, rsa_len;
if ((file = fopen(PUB_KEY, "r")) == NULL)
return NULL;
if ((p_rsa = PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL)) == NULL)
return NULL;
data_len = strlen(data);
rsa_len = RSA_size(p_rsa);
encry_data = (char *)malloc(rsa_len+1);
memset(encry_data, 0, rsa_len+1);
if (RSA_public_encrypt(rsa_len, (unsigned char *)data,
(unsigned char *)encry_data, p_rsa, RSA_NO_PADDING)<</span>0)
return NULL;
RSA_free(p_rsa);
fclose(file);
return encry_data;
}
char *data_decrypy(char *data, char *SSL_KEY)
{
//对数据进行解密函数
char *decry_data;
RSA *p_rsa;
FILE *file;
int rsa_len;
if ((file = fopen(SSL_KEY, "r")) == NULL)
return NULL;
if ((p_rsa = PEM_read_RSAPrivateKey(file,NULL,NULL,NULL)) == NULL)
return NULL;
rsa_len = RSA_size(p_rsa);
decry_data = (char *)malloc(rsa_len+1);
memset(decry_data, 0, rsa_len+1);
if (RSA_private_decrypt(rsa_len, (unsigned char *)data, (unsigned char *)decry_data,
p_rsa, RSA_NO_PADDING) <</span> 0)
return NULL;
RSA_free(p_rsa);
fclose(file);
return decry_data;
}