QT5通过openss1.1.1实现RSA加密
1.查看当前版本的QT依赖哪个版本的openssl
#include <QSslSocket>
#include <QDebug>
qDebug() << QSslSocket::sslLibraryBuildVersionString();
控制台输出:
"OpenSSL 1.1.1w 11 Sep 2023"
可以看到大版本是1.1.1
2.安装openssl
安装openssl有两种方式,一种是下载源码然后自己编译,这种方式有点事版本比较全,缺点是比较费劲,我折腾了两天依然没有编译好···直接放弃了。附源码下载地址:https://www.openssl.org/source/old/。
第二种安装方式是使用第三方编译好的安装包,优点是省事,缺点是版本不全,下载连接:https://slproweb.com/products/Win32OpenSSL.html
在源码下载地址中可以看到1.1.1有很多版本,网上有人说不同版本之间会有所不同,目前在我使用中暂未发现问题。
注意:openssl大版本之间是不同的:1.0.X使用的是libeay32.dll和ssleay32.dll,这也是目前网上教程中被添加最多的库,但是1.1.X之后变成了libssl.dll与libcrypto.dll,此处在pro文件中添加库时会用到。
我是直接下载的第三方编译好的openssl,使用默认的安装设置,安装好之后会在C:\Program Files\OpenSSL-Win64中生成一系列文件。
3.使用
3.1首先将安装路径下lib与include文件夹全部复制到工程文件夹中,在 pro文件中添加库
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -llibcrypto
LIBS += -L$$PWD/lib -llibssl
3.2 测试能否正确引入头文件
#include "openssl/rsa.h"
#include "openssl/pem.h"
#include "openssl/err.h"
3.3 代码测试
.h文件
QString rsaPubEncrypt(const QString &strPlainData, const QString &strPubKey);
.cpp文件
QString MainWindow::rsaPubEncrypt(const QString &strPlainData, const QString &strPubKey)
{
QByteArray pubKeyArry = strPubKey.toUtf8();
uchar* pPubKey = (uchar*)pubKeyArry.data();
BIO *pKeyBio = BIO_new_mem_buf(pPubKey, pubKeyArry.length());//若编译不正确 此处会报错
if (pKeyBio == NULL)
{
return "";
}
RSA* pRsa = RSA_new();
if (strPubKey.contains(BEGIN_RSA_PUBLIC_KEY))
{
pRsa = PEM_read_bio_RSAPublicKey(pKeyBio, &pRsa, NULL, NULL);
}
else
{
pRsa = PEM_read_bio_RSA_PUBKEY(pKeyBio, &pRsa, NULL, NULL);
qDebug() << "pRsa pRsa " << pRsa;
}
if (pRsa == NULL)
{
BIO_free_all(pKeyBio);
return "";
}
int nLen = RSA_size(pRsa);
char* pEncryptBuf = new char[nLen];
//加密
qDebug() << "strPlainData: " << strPlainData;
QByteArray plainDataArry = strPlainData.toUtf8();
int nPlainDataLen = plainDataArry.length();
int exppadding=nLen;
if(nPlainDataLen>exppadding-11)
exppadding=exppadding-11;
int slice=nPlainDataLen/exppadding;//片数
if(nPlainDataLen%(exppadding))
slice++;
QString strEncryptData = "";
QByteArray arry;
for(int i=0; i<slice; i++)
{
QByteArray baData = plainDataArry.mid(i*exppadding, exppadding);
nPlainDataLen = baData.length();
memset(pEncryptBuf, 0, nLen);
uchar* pPlainData = (uchar*)baData.data();
int nSize = RSA_public_encrypt(nPlainDataLen,
pPlainData,
(uchar*)pEncryptBuf,
pRsa,
RSA_PKCS1_PADDING);
if (nSize >= 0)
{
arry.append(QByteArray(pEncryptBuf, nSize));
}
}
strEncryptData += arry.toBase64();
//释放内存
delete pEncryptBuf;
BIO_free_all(pKeyBio);
RSA_free(pRsa);
return strEncryptData;
}
测试代码:
QString str= rsaPubEncrypt("123",pubkey);//pubkey需要生成,即用公钥对字符串123进行加密
qDebug() << str; //打印生成的加密内容