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有两种方式,一种是下载源码然后自己编译,这种方式有点事版本比较全,缺点是比较费劲,我折腾了两天依然没有编译好···直接放弃了。附源码下载地址: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中生成一系列文件。
20240603补充:新接触到一个项目,检查发现需使用1.1.1d版本,尝试使用1.1.1w版本,程序可正常运行,暂未遇到任何问题。
在这里插入图片描述

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;  //打印生成的加密内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值