QT中使用openssl实现RSA加密

下面的代码是我写的初版,后面增加了公钥解密,私钥解密,以及分段加密解密的功能,有需要的朋友可以

点击这里获取详细文件

本篇文章的RSA加密用的openssl
网上对于该工具大部分是先下载下来再包含到目录里,QT本身在安装时可以选择安装openssl工具
此篇文章就是介绍如何使用QT自带的openssl工具实现RSA加密
此方法为自己研究的,如果您有更好的方法,欢迎留言交流

1.在安装QT时,记得勾选openss工具
选择openssl工具
2.创建项目GetMachineCode,找到QT目录下的D:\Qt\Tools\OpenSSL\Win_x64,在里面的bin目录中找到libcrypto-1_1-x64.dll,
libssl-1_1-x64.dll,lib目录下找到libcrypto.lib,libssl.lib,复制这四个文件,将其拷贝到项目文件的debug目录下
3.打开属性页,在包含目录中添加openssl的include文件夹,在库目录中添加debug\文件夹
在这里插入图片描述
4.在链接器的输入中添加附加依赖项
在这里插入图片描述
5.配置完成,点击应用
6.在使用RSA加密的文件中,应包含以下头文件

#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"

7.公钥加密代码样例

QString GetMachineCode::rsaPubDecrypt(const QString& data)
{
    //公钥加密  (使用自己生成的公秘钥)                            //注意:公钥的头尾为public                
    char public_key[] =                                                         
        "-----BEGIN PUBLIC KEY-----\n"\
        "你自己的密钥\n"\
        "你自己的密钥\n"\
        "你自己的密钥\n"\
        "-----END PUBLIC KEY-----";
    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* pEncryptBuf = new char[nLen];
    memset(pEncryptBuf, 0, nLen);
    QByteArray clearDataArry = data.toUtf8();
    int nClearDataLen = clearDataArry.length();
    uchar* pClearData = (uchar*)clearDataArry.data();
    int nSize = RSA_public_encrypt(nClearDataLen,
        pClearData,
        (uchar*)pEncryptBuf,
        pRsa,
        RSA_PKCS1_PADDING);
    QString strEncryptData = "";
    if (nSize >= 0) {
        QByteArray arry(pEncryptBuf, nSize);
        strEncryptData = arry.toBase64();
    }
    // 释放内存
    delete pEncryptBuf;
    BIO_free_all(pKeyBio);
    RSA_free(pRsa);
    return strEncryptData;
}

私钥解密代码样例

QString frmMain::rsaPriDecrypt(const QString &data)
{
    //私钥解密
    char private_key[] =
        "-----BEGIN RSA PRIVATE KEY-----\n"\
        "你的私钥\n"\
        "你的私钥\n"\
        "你的私钥\n"\
        "-----END RSA PRIVATE KEY-----";
    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* pClearBuf = new char[nLen];
    memset(pClearBuf, 0, nLen);
    //解密
    QByteArray decryptDataArry = data.toUtf8();
    decryptDataArry = QByteArray::fromBase64(decryptDataArry);
    int nDecryptDataLen = decryptDataArry.length();
    uchar* pDecryptData = (uchar*)decryptDataArry.data();
    int nSize = RSA_private_decrypt(nDecryptDataLen,
        pDecryptData,
        (uchar*)pClearBuf,
        pRsa,
        RSA_PKCS1_PADDING);
    QString strClearData = "";
    if (nSize >= 0) {
        strClearData = QByteArray(pClearBuf, nSize);
    }
    // 释放内存
    delete pClearBuf;
    BIO_free_all(pKeyBio);
    RSA_free(pRsa);
    return strClearData;
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值