ubuntu18.04LTS编译openssl库进行rsa加密解密

news2024/12/23 17:34:25

一、下载openssl库源码,下载地址:https://ftp.openssl.org/source/

我下载的版本:

 二、编译源码

1、解压源码:

tar zxvf openssl-1.1.1u.tar.gz

 2、进入到解压后的文件夹中:

cd openssl-1.1.1u/

3、执行配置,生成makefile文件:

./config shared --prefix=/usr/local/openssl

4、编译:

make

5、安装

sudo make install

至此,编译完成!

三、测试rsa加密解密:

1、找到编译后的头文件和库文件,起目录为:/usr/local/openssl

将头文件和库文件拷贝到程序目录中:

2、将头文件和库文件添加项目中:

 3、测试:

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

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //加密函数
    QString rsa_pri_encrypt_base64(const QString &strClearData);
    //解密函数
    QString rsa_pub_decrypt_base64(const QString &strDecryptData);
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QString encrypt_str =  rsa_pri_encrypt_base64("123abc");

    QString decrypt_str = rsa_pub_decrypt_base64(encrypt_str);
    qDebug() << "解析后:" << decrypt_str << endl;
}

MainWindow::~MainWindow()
{
    delete ui;
}

//私钥加密
QString MainWindow::rsa_pri_encrypt_base64 (const QString& strClearData)
{
    //私钥  长度为512  (使用自己生成的公秘钥)
    char private_key[] = "-----BEGIN PRIVATE KEY-----\n"
            "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAypZS0ybGDs7WWDIs\n"
            "bN9qNnojaHpQn6wiQf23U3Tm0pe1vCR803+gY3We7hBYfT7+uXK3pykQ8bIKnWdb\n"
            "XmoddQIDAQABAkAFCE7uZ9wrqf+xGS35VmNxDv+qLL+r976yHPdc316MhKTi9zfS\n"
            "9qAnilqB7LE6YedPpMMrKCK7AobBlTrzqF/RAiEA/KdNO+w7WDwYjC98ocOZqHLb\n"
            "49AP85nQL1Hu0eUf1HsCIQDNRUG+W9/IIK3kJ76eVwfSkq+LhM85yEY3vVIVmXmK\n"
            "zwIgT6KoLHgUaIZgsmcRYKeXmknB13ewX3ce8JthrFUNCFsCIHySNx+q6det3VnE\n"
            "tO2qq1ijJF1rL8dFPze8cQAir5wJAiEAmMP+WBohdEzXQMFYFkaVCIyfB8Zs6Muv\n"
            "cUsvIxOqW2o=\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;
}

//公钥解密
QString MainWindow::rsa_pub_decrypt_base64(const QString& strDecryptData)
{
    //公钥解密
    char public_key[] = "-----BEGIN PUBLIC KEY-----\n"\
            "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMqWUtMmxg7O1lgyLGzfajZ6I2h6UJ+s\n"\
            "IkH9t1N05tKXtbwkfNN/oGN1nu4QWH0+/rlyt6cpEPGyCp1nW15qHXUCAwEAAQ==\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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.数组、排序和查找|Java学习笔记

文章目录 数组数组使用注意事项和细节数组赋值机制 排序查找相关链接 数组 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 数据类型 数组名[] new 数据类型[大小];int a[] 或者 int[] a 都可以。 int[] a {1,2,3};// 二维数组的声明方式有…

ThreeJS教程:山脉地形高度可视化

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 山脉地形高度可视化 一个山脉地形的高度可视化&#xff0c;具体说就是地形不同的高度设置不同的颜色值。有多种方式&#xff0c;下面就举一个设置顶点颜色.attributes.color的例子 …

魏副业而战:夸克网盘拉新如何引流推广?3个方法,让你多赚5W+

我是魏哥&#xff0c;与其在家躺平&#xff0c;不如魏副业而战&#xff01; 夸克网盘拉新项目&#xff0c;相信大家都知道吧。 提到拉新&#xff0c;很多人不屑一顾&#xff0c;认为拉人头的项目&#xff0c;没什么前途。 这个想法&#xff0c;魏哥是反对的。 任何项目的存…

阿里巴巴 2023 版(Java 岗)面试突击手册,Github 已标星42K

程序员作为一个自带“高薪多金”标签的职业&#xff0c;收入要高于市场的平均薪资&#xff0c;即便是在 2023 年,程序员的薪资依然保持居高不下。 据拉勾发布的《2022 程序员群体职场洞察报告》显示计算机专业的应届本科生起薪普遍高于其他职业的平均薪资水平。77%的本科毕业生…

[数据库]数据库事务,管理等级,并发锁

1.数据库事务 数据库事务(transaction)是数据库的特性之一,在mysql数据库管理系统中,事务的管理是由引擎innordb实现的. 数据库事务可以理解为一个阶段中的活动,对于每一个窗口都有一个日志,日志中记录着本次事务中进行的改动(注意只是改动,查询不算).其中的两个指令commit,以…

ffplay设置延时

目录 理论 实验 不带参数 带参数 理论 使用ffplay播放视频源时&#xff0c;rtsp/rtmp等&#xff0c;会有一定的延时&#xff0c;这里我们可以通过设置ffplay播放参数将延时控制到最小。 ffplay.exe -i rtmp://xxxxxxx -fflags nobuffer 减少缓冲 也可以减少分析码流的时间…

chatgpt赋能python:Python就业岗位分析:机遇和挑战并存

Python就业岗位分析&#xff1a;机遇和挑战并存 Python是一种高级编程语言&#xff0c;它具有易于学习、易于阅读和维护的特点。自问世以来&#xff0c;Python一直是最受欢迎的编程语言之一&#xff0c;用于各种领域的开发、数据分析和科学计算等方面&#xff0c;因此Python岗…

【AI工具】 一款多SOTA模型集成的高精度自动标注工具(直接安装使用,附源码)

目录 高精度自动标注工具简介及其特性标注工具的安装开启自动标注 简介 X-AnyLabeling 是一款全新的交互式自动标注工具&#xff0c;其基于AnyLabeling进行构建和二次开发&#xff0c;在此基础上扩展并支持了许多的模型和功能&#xff0c;并借助Segment Anything和YOLO等主流…

Abp Vnext 搭建 ELK日志记录

ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana 安装 Elasticsearch Kibana 的方法我前面文章有写 Abp中加入Logstash Serilog.AspNetCore Serilog.Formatting.Elasticsearch Serilog.Sinks.Async Serilog.Sinks.Elasticsearchp…

算法与数据结构(四)

一、哈希表 1、哈希表在使用层面上可以理解为一种集合结构 2、如果只有key&#xff0c;没有伴随数据value&#xff0c;可以使用HashSet结构(C中叫UnOrderedSet) 3、如果既有key&#xff0c;又有伴随数据value&#xff0c;可以使用HashMap结构(C中叫UnOrderedMap) 4、有无伴随数…

【C++】4.多媒体库:SFML库入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

新能源车加速内卷,下一程拼什么

近日&#xff0c;一则长城汽车举报比亚迪的消息&#xff0c;瞬间刷爆了整个汽车圈&#xff0c;行业外对于这个事情多少有点懵&#xff0c;但业内对此却并不感到意外。如果说去年前年国内新能源汽车的“较量”&#xff0c;还是争夺入选资格的话&#xff0c;如今这种级别的“较量…

TensorFlow2进行CIFAR-10数据集动物识别,保存模型并且进行外部下载图片测试

首先&#xff0c;你已经安装好anaconda3、创建好环境、下载好TensorFlow2模块并且下载好jupyter了&#xff0c;那么我们就直接打开jupyter开始进行CIFAR10数据集的训练。 第一步&#xff1a;下载CIFAR10数据集 下载网址&#xff1a;http://www.cs.toronto.edu/~kriz/cifar-10…

【Vue.js】对Vue-element-admin做代理网关转发proxy配置

文章目录 环境配置配置vue.config.js演示为啥要这么做呢&#xff1f; 环境配置 .env.development # 开发环境 .env.production # 生产环境我们需要在两个环境变量文件中配置 VUE_APP_BASE_API /dev # 这里配置全局的API前置标识 开发环境我使用的/dev 生产环境用的是/prod V…

Word控件Spire.Doc 【其他】教程(8):在 Word 中嵌入多媒体文件

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

物联网开发中常用的几款传感器

传感器是物联网中的关键部件&#xff0c;在物联网开发中发挥着重要作用。目前&#xff0c;市场上的传感器种类繁多&#xff0c;它们有许多用途。有些传感器可能主要用于测量温度、压力、流量等物理量&#xff0c;有些则用于测量位置、距离、速度和加速度等物理量&#xff0c;还…

干货第一弹!多组学联合分析之代谢组FAQ

代谢组是对生物体内代谢产物全谱分析的一种研究手段&#xff0c;代谢产物包括核酸、蛋白质、脂类生物大分子以及其他小分子物质&#xff0c;目前主要是检测1000Da以下的物质。代谢组研究具有高通量的检测能力、高灵敏度和准确度、非侵入性、非破坏性、全面性、数据资源整合等特…

DIY制作隔离信号注入变压器

最近在学习模电知识&#xff0c;接触到了测量运放环路增益&#xff0c;需要使用合适的注入变压器&#xff0c;查找资料发现商用信号注入变压器价格昂贵&#xff0c;不适合个人学习使用。看到LOTO使用普通音频变压器做测试&#xff0c;也跟技术群友做了交流&#xff0c;尝试使用…

企业构建高性能Web应用的重要组件

目 录 01 出现背景 ‍‍‍‍‍‍‍ 02 PrimetonLB、PrimetonMemDB在高性能Web应用中的作用 03 与PAS的集成‍‍ 04 优势体现 05 总结 01 出现背景‍ 随着互联网的快速发展和普及&#xff0c;各类Web应用已成为人们日常生活的重要组成&#xff0c;人们对Web应用的要求从过去的…

使用QMenu和mousePressEvent制作右键弹出菜单

我需要实现一个在QTextBrowser上邮件弹出菜单的效果&#xff0c;如下所示&#xff1a; 创建QTextBrowser的子类MyTextBrowser 首先创建一个QTextBrowser的子类&#xff0c;MyTextBrowser&#xff0c;如下所示&#xff1a;并定义一个QMenu指针 #ifndef MYTEXTBROWSER_H #defin…