C C++最全QT使用Openssl实现RSA加解密_qt rsa,2024年最新深入理解C C++的核心知识点

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

链接:https://pan.baidu.com/s/1xTiJf_d-e8QfZyDKFRYr2A
提取码:jg82

二、使用Openssl生成公秘钥

编译完成后,打开bin目录的openssl.exe生成公秘钥

开始生成RSA的私钥     genrsa -out rsa_private_key.pem 512 。512代表的是私钥长度,下面就生成了rsa_private_key.pem文件

利用私钥文件生成RSA公钥文件   rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,生成rsa_public_key.pem文件

对之前的私钥文件进行PKCS#8编码,生成一个编码后的私钥文件:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -out pkcs8_rsa_private_key.pem –nocrypt,生成pkcs8_rsa_private_key.pem文件

将 pkcs8_rsa_private_key.pem 和 rsa_public_key.pem以记事本的方式进行打开,在程序中,就可以通过这对公秘钥就行加解密

三、QT使用Openssl进行加解密

1、创建一个QT项目,将编译完成的oepnssl库中的include的  openssl文件夹和lib文件夹复制到工程目录下,并添加到项目中,添加头文件:右键text,选中Add Existing Diretory,然后点击确定。

添加lib库文件

2、项目头文件,添加所使用到的加解密的头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

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


![img](https://img-blog.csdnimg.cn/img_convert/3ae4733531d094b9512fcb33f09fc780.png)
![img](https://img-blog.csdnimg.cn/img_convert/5701147cee37e6beae9b7df68f607e93.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Qt 语言实现 RSA 算法加密文件的示例代码: ```cpp #include <QCoreApplication> #include <QFile> #include <QDataStream> #include <QDebug> #include <openssl/rsa.h> #include <openssl/pem.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 加载公钥 RSA *rsa = RSA_new(); FILE *fp = fopen("public_key.pem", "r"); rsa = PEM_read_RSA_PUBKEY(fp, &rsa, NULL, NULL); fclose(fp); // 打开待加密文件 QFile file("plaintext.txt"); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open file."; return -1; } // 读取待加密数据 QByteArray plaintext = file.readAll(); file.close(); // 计算加密后数据长度并分配内存 int plaintextLen = plaintext.size(); int keyLen = RSA_size(rsa); int cipherLen = 0; if (plaintextLen % keyLen == 0) { cipherLen = plaintextLen / keyLen * RSA_size(rsa); } else { cipherLen = (plaintextLen / keyLen + 1) * RSA_size(rsa); } unsigned char *ciphertext = new unsigned char[cipherLen]; // 使用公钥加密数据 int cipherBlockLen = RSA_public_encrypt(keyLen - 11, (unsigned char*)plaintext.constData(), ciphertext, rsa, RSA_PKCS1_PADDING); int totalCipherLen = cipherBlockLen; for (int i = keyLen - 11; i < plaintextLen; i += keyLen - 11) { cipherBlockLen = RSA_public_encrypt(keyLen - 11, (unsigned char*)plaintext.constData() + i, ciphertext + totalCipherLen, rsa, RSA_PKCS1_PADDING); totalCipherLen += cipherBlockLen; } // 保存加密后数据到文件 QFile cipherFile("ciphertext.bin"); if (!cipherFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to create cipher file."; return -1; } QDataStream out(&cipherFile); out.writeRawData((const char*)ciphertext, totalCipherLen); cipherFile.close(); // 释放内存 delete[] ciphertext; RSA_free(rsa); return a.exec(); } ``` 在示例代码中,我们使用 OpenSSL 库中提供的 `RSA` 类型和 `PEM_read_RSA_PUBKEY` 函数加载公钥文件。然后打开待加密文件,读取文件中的数据。接着计算加密后数据的长度,并分配内存。最后,使用公钥对数据进行加密,保存加密后数据到文件中。 需要注意的是,在使用 RSA 算法加密数据时,每次加密的数据长度不能超过公钥长度减去 11,因此我们需要对待加密数据进行分块加密。在示例代码中,我们使用一个循环来实现分块加密。 需要使用OpenSSL 库头文件为 `openssl/rsa.h` 和 `openssl/pem.h`。在编译时需要链接 OpenSSL 库,可以在项目文件中添加以下配置: ```qmake LIBS += -lssl -lcrypto ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值