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

添加openssl依赖

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

  • 注意图中标出的文件夹路径,没有按照该方式存放文件会出现无法找到依赖,无法找到函数实现的报错!!!!
  • 下载并安装的openssl的lib目录下有细分 MD/MDd/MT/MTd,只需要知道MT/MTd表示静态链接库,MD/MDd表示动态链接库,d自然是表示debug
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

项目pro文件中移入依赖

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

INCLUDEPATH += $$PWD/openssl/include/
  • 方式二:从项目中引用外部库,完成后会自动在pro文件中添加依赖
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

编写算法代码

依赖头文件

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

函数实现如下

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

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

相关推荐

  1. rust学习(openssl rsa解密文件

    2024-02-03 00:50:01       33 阅读
  2. 高并发支持的RSA文件解密后端接口设计与实现

    2024-02-03 00:50:01       32 阅读
  3. 【已解决QT如何载qss文件

    2024-02-03 00:50:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-03 00:50:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-03 00:50:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-03 00:50:01       82 阅读
  4. Python语言-面向对象

    2024-02-03 00:50:01       91 阅读

热门阅读

  1. 公司就一个后端一个前端,有必要搞微服务吗?

    2024-02-03 00:50:01       50 阅读
  2. MYSQL学习笔记1

    2024-02-03 00:50:01       62 阅读
  3. Excel计算表达式的值

    2024-02-03 00:50:01       61 阅读
  4. HTTP无状态协议和服务器端状态管理

    2024-02-03 00:50:01       54 阅读
  5. 重新配置vue项目时出现的:连接已断开问题

    2024-02-03 00:50:01       47 阅读
  6. linux ssh 时环境变量

    2024-02-03 00:50:01       48 阅读
  7. 学术写作|第二篇论文写作记录|GPT4论文润色Prompt

    2024-02-03 00:50:01       47 阅读
  8. C语言的流程结构和语句分类

    2024-02-03 00:50:01       47 阅读
  9. git的使用

    2024-02-03 00:50:01       48 阅读
  10. 基于Qt5录音项目演示

    2024-02-03 00:50:01       56 阅读
  11. vue插槽

    vue插槽

    2024-02-03 00:50:01      43 阅读