写点什么

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

作者:springIce
  • 2024-02-02
    北京
  • 本文字数:1980 字

    阅读完需:约 6 分钟

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/ -llibcryptoLIBS += -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;
复制代码


发布于: 刚刚阅读数: 6
用户头像

springIce

关注

just do it 2019-09-23 加入

还未添加个人简介

评论

发布
暂无评论
Qt项目第二弹-文件加解密之RSA_rsa_springIce_InfoQ写作社区