添加openssl依赖
下载openssl(http://slproweb.com/products/Win32OpenSSL.html),并将其lib和include文件拷贝到工程目录下,如下所示
- 注意图中标出的文件夹路径,没有按照该方式存放文件会出现无法找到依赖,无法找到函数实现的报错!!!!
- 下载并安装的openssl的lib目录下有细分 MD/MDd/MT/MTd,只需要知道MT/MTd表示静态链接库,MD/MDd表示动态链接库,d自然是表示debug
项目pro文件中移入依赖
- 方式一:直接在pro文件中手写依赖
- $$PWD 表示当前工程目录
LIBS += -L$$PWD/openssl/lib/ -llibcrypto
LIBS += -L$$PWD/openssl/lib/ -llibssl
INCLUDEPATH += $$PWD/openssl/include/
- 方式二:从项目中引用外部库,完成后会自动在pro文件中添加依赖
编写算法代码
依赖头文件
- 生成公私钥方法
- genrsa -out rsa_private_key.pem 512
- rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
- 将 rsa_private_key.pem 和 rsa_public_key.pem以记事本的方式进行打开,在程序中,就可以通过这对公秘钥就行加解密
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bn.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
函数实现如下
/**
* @Brief: RSA加解密
* @Author: springIce
* @Date: 2024-01-31
**/
static void RSAEncrpyt(const QString& decryptData, QString &outData);
static void RSADecrypt(const QString& encryptData, QString &outData);
void Algorithm::RSAEncrpyt(const QString &decryptData, QString &outData)
{
//私钥 长度为512 (使用自己生成的公秘钥)
char private_key[] = "xxxxx";
//将字符串键加载到bio对象上
BIO* pKeyBio = BIO_new_mem_buf(private_key, strlen(private_key));
if (pKeyBio == NULL) {
return;
}
RSA* pRsa = RSA_new();
pRsa = PEM_read_bio_RSAPrivateKey(pKeyBio, &pRsa, NULL, NULL);
if (pRsa == NULL ) {
BIO_free_all(pKeyBio);
return;
}
int nLen = RSA_size(pRsa);
char* pEncryptBuf = new char[nLen];
memset(pEncryptBuf, 0, nLen);
QByteArray clearDataArry = decryptData.toUtf8();
int nClearDataLen = clearDataArry.length();
uchar* pClearData = (uchar*)clearDataArry.data();
int nSize = RSA_private_encrypt(nClearDataLen,
pClearData,
(uchar*)pEncryptBuf,
pRsa,
RSA_PKCS1_PADDING);
if (nSize >= 0 ) {
QByteArray arry(pEncryptBuf, nSize);
outData = arry.toBase64();
}
// 释放内存
delete pEncryptBuf;
BIO_free_all(pKeyBio);
RSA_free(pRsa);
}
void Algorithm::RSADecrypt(const QString &encryptData, QString &outData)
{
//公钥解密
char public_key[] = "xxxxxx";
//将字符串键加载到bio对象
BIO* pKeyBio = BIO_new_mem_buf(public_key, strlen(public_key));
if (pKeyBio == NULL) {
return;
}
RSA* pRsa = RSA_new();
pRsa = PEM_read_bio_RSA_PUBKEY(pKeyBio, &pRsa, NULL, NULL);
if (pRsa == NULL ) {
BIO_free_all(pKeyBio);
return;
}
int nLen = RSA_size(pRsa);
char* pClearBuf = new char[nLen];
memset(pClearBuf, 0, nLen);
//解密
QByteArray decryptDataArry = encryptData.toUtf8();
decryptDataArry = QByteArray::fromBase64(decryptDataArry);
int nDecryptDataLen = decryptDataArry.length();
uchar* pDecryptData = (uchar*)decryptDataArry.data();
int nSize = RSA_public_decrypt(nDecryptDataLen,
pDecryptData,
(uchar*)pClearBuf,
pRsa,
RSA_PKCS1_PADDING);
if (nSize >= 0 ){
outData = QByteArray(pClearBuf, nSize);
}
// 释放内存
delete pClearBuf;
BIO_free_all(pKeyBio);
RSA_free(pRsa);
}
调用如下
- 我本次是将函数写在类中,将其声明为静态函数
QString encrypt_str = "";
Algorithm::RSAEncrpyt("123abc", encrypt_str);
qDebug()<<"加密数据:"<<encrypt_str;
QString decrypt_str = "";
Algorithm::RSADecrypt(encrypt_str, decrypt_str);
qDebug()<<"解密数据:"<<decrypt_str;
实现效果