Qt项目第二弹-文件加解密之RSA

添加openssl依赖

下载openssl(http://slproweb.com/products/Win32OpenSSL.html),并将其lib和include文件拷贝到工程目录下,如下所示

  • 注意图中标出的文件夹路径,没有按照该方式存放文件会出现无法找到依赖,无法找到函数实现的报错!!!!
  • 下载并安装的openssl的lib目录下有细分 MD/MDd/MT/MTd,只需要知道MT/MTd表示静态链接库,MD/MDd表示动态链接库,d自然是表示debug
    Qt项目第二弹-文件加解密之RSA_第1张图片
    Qt项目第二弹-文件加解密之RSA_第2张图片
    Qt项目第二弹-文件加解密之RSA_第3张图片

项目pro文件中移入依赖

  • 方式一:直接在pro文件中手写依赖
    • $$PWD 表示当前工程目录
LIBS += -L$$PWD/openssl/lib/ -llibcrypto
LIBS += -L$$PWD/openssl/lib/ -llibssl

INCLUDEPATH += $$PWD/openssl/include/
  • 方式二:从项目中引用外部库,完成后会自动在pro文件中添加依赖
    Qt项目第二弹-文件加解密之RSA_第4张图片
    Qt项目第二弹-文件加解密之RSA_第5张图片
    Qt项目第二弹-文件加解密之RSA_第6张图片

编写算法代码

依赖头文件

  • 生成公私钥方法
    • 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 
#include 
#include 
#include 
#include 
#include 
#include 

函数实现如下

/**
    *  @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;

实现效果
在这里插入图片描述

你可能感兴趣的:(qt,开发语言)