QT使用Openssl实现RSA加解密_qt rsa,2024年最新我在华为做物联网嵌入式开发外包的真实经历

66 阅读3分钟

#ifndef MAINWINDOW_H #define MAINWINDOW_H

#include

#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> namespace Ui { class MainWindow; }

class MainWindow : public QMainWindow { Q_OBJECT

public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); //加密函数 QString rsa_pri_encrypt_base64(const QString &strClearData); //解密函数 QString rsa_pub_decrypt_base64(const QString &strDecryptData); private: Ui::MainWindow *ui; };

#endif // MAINWINDOW_H


2、使用私钥进行加密函数,打开刚刚生成的私钥文件pkcs8\_rsa\_private\_key.pem,复制到加密函数中



//私钥加密 QString MainWindow::rsa_pri_encrypt_base64 (const QString& strClearData) { //私钥 长度为512 (使用自己生成的公秘钥) char private_key[] = "-----BEGIN PRIVATE KEY-----\n"
"MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEAzpXEGSjFGDRdr4Gp\n"
"k/impFrqxw0JUs7oUwTheJgqNIfCJfw00PHOKmIDI9UoS+E3Ozs1reMP1r0IuUys\n"
"zX5LGwIDAQABAkEAhUCjcdsTbu5wM8H+QT0VOFSQtf5ZsjlWMB6o1SHJr4Fs8UEE\n"
"7JHUTGrlUopMrhQDfYxGqDUAXykca99xu8e1QQIhAPPdcze2DeV5X9a8bcd3VEzK\n"
"Luy6SMOtomEMUKPlYEa7AiEA2N1puJwKEulYWaHywLwhA8tM08YFsFqh18JsUbP5\n"
"NyECIQCtuykXGnLB9XsqfyjyPnfnEO7nJTsrdGrHGr/kU0gIewIgVWqYGntzSFGa\n"
"V+t+psUyp8DqaLslQHniJw5QBbpCXaECIQDgDWRfFb7h68XMi2fpkd727YDpl64p\n"
"fb2H/qFyq3xBDw==\n"
"-----END PRIVATE KEY-----";

//将字符串键加载到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 = strClearData.toUtf8();
int nClearDataLen = clearDataArry.length();
uchar* pClearData = (uchar*)clearDataArry.data();
int nSize = RSA_private_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;

}


3、使用公钥进行解密函数,打开刚刚生成的公钥文件 rsa\_public\_key.pem,复制到公钥密函数中



//公钥解密 QString MainWindow::rsa_pub_decrypt_base64(const QString& strDecryptData) {

//公钥解密
char public_key[] = "-----BEGIN PUBLIC KEY-----\n"\
        "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM6VxBkoxRg0Xa+BqZP4pqRa6scNCVLO\n"\
        "6FME4XiYKjSHwiX8NNDxzipiAyPVKEvhNzs7Na3jD9a9CLlMrM1+SxsCAwEAAQ==\n"\
        "-----END PUBLIC KEY-----";

//将字符串键加载到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 = strDecryptData.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);
QString strClearData = "";
if ( nSize >= 0 ){
    strClearData = QByteArray(pClearBuf, nSize);
}

// 释放内存
delete pClearBuf;
BIO_free_all(pKeyBio);
RSA_free(pRsa);
return strClearData;

}


4、测试是否能正确进行加解密



MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QString encrypt_str = rsa_pri_encrypt_base64("123abc"); qDebug()<<"加密数据:"<<encrypt_str;

QString decrypt_str = rsa_pub_decrypt_base64(encrypt_str);
qDebug()<<"解密数据:"<<decrypt_str;

}


大家运行会发现程序异常结束,是因为前面我留了个小陷阱,还需要将编译好的openssl中bin目录下的libcrypto-1\_1.dll和libssl-1\_1.dll动态链接库复制到项目的执行目录下的debug下(项目使用debug编译放在该文件夹下,如果是release编译的话就添加到relase目录下),这样项目就能正常运行了。


![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a82dc05387b94311ac6b3be1e5538bcf~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771855694&x-signature=G%2BIJPHLo0bPsYr0xJfQAEgRhWVw%3D)


 


四、效果展示


![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9842495af4a44646bee6e7b13452c226~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771855694&x-signature=ykqEqD58w08LtQvCbhlBQBUbL3w%3D)


从输出结果上看,能够正确的进行加解密。


#### 问题咨询及项目源码请加群:


#### QQ群


#### 名称:IT项目交流群


![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9a2fbf2a5e2b46889394f6b6a0ed4e37~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771855694&x-signature=w5g2L3tVuY1VaiQqjVW2a5HSrzA%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/00ee94909857426b8819b8309e997cd4~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771855694&x-signature=KXYkkUoLAhhku5pB33xifkJhjqY%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**