RSA加密"/>
QT5通过openss1.1.1实现RSA加密
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有两种方式,一种是下载源码然后自己编译,这种方式有点事版本比较全,缺点是比较费劲,我折腾了两天依然没有编译好···直接放弃了。附源码下载地址:/。
第二种安装方式是使用第三方编译好的安装包,优点是省事,缺点是版本不全,下载连接:.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; //打印生成的加密内容
更多推荐
QT5通过openss1.1.1实现RSA加密
发布评论