QT使用Openssl实现RSA加解密_qt rsa(1)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

前言:

RSA是目前最有影响力和最常用的加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。这是一种非对称密码算法,所谓非对称,就是指该算法需要一对公密钥,使用其中一个加密,则需要用另一个才能解密。密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。下面这篇文章采用的是512位的RSA秘钥

一、下载Openssl源码编译成库

在网上有很多编译的教程,这里就给大家推荐一个编译的教程:WIN10-64位安装OpenSSL详细教程,编译源码其实不难,重于要有耐心以及细心。我将我编译好的32位openssl上传至网盘,需要的可以自行下载 。

链接: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"\
            "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);



![img](https://img-blog.csdnimg.cn/img_convert/cdc76a904f577e6ae81169ccf66fd270.png)
![img](https://img-blog.csdnimg.cn/img_convert/47ea2d1edad92d8832723a86b8fc0611.png)

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

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

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

涵盖了95%以上物联网嵌入式知识点,真正体系化!**

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

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RSA是一种非对称加密算法,使用公钥加密和私钥解密。在Linux和Qt环境下,我们可以使用OpenSSL库对RSA进行加密和解密操作。 在Qt使用OpenSSL库,需要在.pro文件中加入如下语句: LIBS += -lssl -lcrypto 这样就可以链接OpenSSL库。 RSA算法分为公钥加密和私钥解密两个步骤。在Qt中,我们可以使用该库中的RSA_generate_key函数生成一对公私钥,该函数需要传入一个整型值作为密钥位数。 生成密钥对后,我们可以使用RSA_public_encrypt函数和RSA_private_decrypt函数分别对明文进行加密和密文进行解密操作。 下面是一个简化版的RSA加密算法实现: #include <openssl/rsa.h> #include <openssl/pem.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 生成密钥对 RSA *r = RSA_generate_key(1024, RSA_F4, NULL, NULL); // 明文和密文 unsigned char plaintext[100] = "Hello, world!"; unsigned char ciphertext[1024] = {0}; unsigned char output[100] = {0}; // 加密 int len = RSA_public_encrypt(strlen((const char *)plaintext), plaintext, ciphertext, r, RSA_PKCS1_PADDING); printf("Ciphertext: %s\n", ciphertext); // 解密 len = RSA_private_decrypt(len, ciphertext, output, r, RSA_PKCS1_PADDING); printf("Plaintext: %s\n", output); return 0; } 这是一个简单的RSA加密解密程序,其中使用OpenSSL库中的RSA_generate_key、RSA_public_encrypt和RSA_private_decrypt函数分别生成密钥对、加密明文和解密密文。 ### 回答2: RSA加密算法是一种非对称加密算法,常用于信息安全领域。使用Qt实现RSA加密解密,需要先了解RSA算法及其原理。 首先,RSA算法中需要生成一对公私钥,公钥用于加密,私钥用于解密。生成公私钥的过程如下: 1. 随机选择两个不同的质数p和q 2. 计算n=p*q 3. 计算欧拉函数φ(n)=(p-1)*(q-1) 4. 选择一个整数e(1<e<φ(n)),e与φ(n)互质 5. 计算d,满足d*e ≡ 1 (mod φ(n)) 6. 公钥为(n,e),私钥为(n,d) 加密过程如下: 1. 将待加密数据转换为整数m(0<=m<n) 2. 计算密文c=m^e (mod n) 解密过程如下: 1. 接收到密文c 2. 计算明文m=c^d (mod n) 使用Qt实现RSA加密解密,可以参考以下步骤: 1. 生成公私钥对:随机选择两个质数p和q,计算n、φ(n)、e和d,得到公钥(n,e)和私钥(n,d)。 2. 加密:将待加密数据转换为整数m,计算密文c=m^e(mod n)。 3. 解密:接收到密文c,计算明文m=c^d(mod n)。 4. 实现一个简化版的RSA加密算法:通过Qt提供的大数类,实现上述步骤。 5. 测试:输入待加密的字符串,将其转换为整数后加密,再将密文解密并转回字符串,与原字符串进行比较,验证加解密是否正确。 总的来说,使用Qt实现RSA加密解密需要了解RSA算法原理,并掌握Qt提供的大数类。在实现过程中,需要注意数据类型的转换和边界处理,保证算法的正确性和运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值