RSA算法(C++)

news2025/1/10 3:44:59

RSA加解密过程

RSA为非对称加密算法,由一对公钥和一对私钥构成,私钥加密公钥解密,公钥加密私钥解密
如下图,D为私密的,假设传输英文字母,我们给英文字母编号A=1,B=2,C=3…
在这里插入图片描述

RSA加解密过程

两对密钥产生方法如下
在这里插入图片描述

C++ OpenSSL库实现加解密

#include <openssl/rsa.h> // 包含OpenSSL RSA加密算法相关函数
#include <openssl/pem.h> // 包含PEM格式编码和解码函数
#include <openssl/err.h> // 包含错误处理函数
#include <iostream>      // 包含标准输入输出流
#include <cstring>       // 包含C字符串处理函数
#include <vector>        // 包含向量容器
#include <memory>        // 包含智能指针
#include <stdexcept>     // 包含标准异常类

// RSAEncryptor类用于封装RSA加密和解密操作
class RSAEncryptor
{
private:
    // 使用智能指针管理RSA结构体和BIGNUM结构体资源
    std::unique_ptr<RSA, decltype(&RSA_free)> rsa;
    std::unique_ptr<BIGNUM, decltype(&BN_free)> bn;

public:
    // 构造函数,初始化RSA密钥对
    RSAEncryptor() : rsa(RSA_new(), RSA_free), bn(BN_new(), BN_free)
    {
        // 设置公钥指数为RSA_F4(65537),这是一个常用的公钥指数
        BN_set_word(bn.get(), RSA_F4);
        // 生成2048位的RSA密钥对
        if (RSA_generate_key_ex(rsa.get(), 2048, bn.get(), nullptr) != 1)
        {
            // 如果密钥生成失败,抛出异常
            throw std::runtime_error("RSA key generation failed");
        }
    }

    // 析构函数,默认即可,智能指针会自动释放资源

    // 加密函数,接收一个字符串,返回加密后的字节数组
    std::vector<unsigned char> encrypt(const std::string &plaintext)
    {
        // 获取RSA密钥长度
        int rsa_size = RSA_size(rsa.get());
        // 创建足够大的缓冲区来存储加密数据
        std::vector<unsigned char> encrypted(rsa_size);
        
        // 执行公钥加密操作
        int result = RSA_public_encrypt(plaintext.size(),
                                        reinterpret_cast<const unsigned char *>(plaintext.data()),
                                        encrypted.data(),
                                        rsa.get(),
                                        RSA_PKCS1_PADDING);
        // 如果加密失败,抛出异常
        if (result == -1)
        {
            throw std::runtime_error("RSA encryption failed");
        }

        // 调整vector大小以匹配加密后的数据长度
        encrypted.resize(result);
        return encrypted;
    }

    // 解密函数,接收加密后的字节数组,返回解密后的字符串
    std::string decrypt(const std::vector<unsigned char> &ciphertext)
    {
        // 获取RSA密钥长度
        int rsa_size = RSA_size(rsa.get());
        // 创建足够大的缓冲区来存储解密数据
        std::vector<unsigned char> decrypted(rsa_size);

        // 执行私钥解密操作
        int result = RSA_private_decrypt(ciphertext.size(),
                                         ciphertext.data(),
                                         decrypted.data(),
                                         rsa.get(),
                                         RSA_PKCS1_PADDING);
        // 如果解密失败,抛出异常
        if (result == -1)
        {
            throw std::runtime_error("RSA decryption failed");
        }

        // 将解密后的数据转换为字符串
        return std::string(decrypted.begin(), decrypted.begin() + result);
    }
};

// 主函数,演示RSAEncryptor类的使用
int main()
{
    try
    {
        // 创建RSAEncryptor实例
        RSAEncryptor encryptor;

        // 原始消息
        std::string original_message = "你好, RSA!";
        // 加密消息
        std::vector<unsigned char> encrypted_message = encryptor.encrypt(original_message);
        // 解密消息
        std::string decrypted_message = encryptor.decrypt(encrypted_message);

        // 输出原始消息
        std::cout << "原信息: " << original_message << std::endl;
        // 输出加密后的数据
        std::cout << "加密数据: ";
        for (auto c : encrypted_message)
        {
            std::cout << std::hex << static_cast<int>(c);
        }
        std::cout << std::endl;
        // 输出解密后的数据
        std::cout << "解密数据: " << decrypted_message << std::endl;
    }
    catch (const std::exception &e)
    {
        // 如果发生异常,输出错误信息
        std::cerr << "发生错误: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

编译运行:

g++ -o rsa_example RSA.cpp -lssl -lcrypto

运行结果:
在这里插入图片描述

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

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

相关文章

网络通信基本知识

网络通信 什么是网络通信&#xff1f; 通信网络是指将各个孤立的设备进行物理连接&#xff0c;实现人与人&#xff0c;人与计算机&#xff0c;计算机与计算机之间进行信息交换的链路&#xff0c;从而达到资源共享和通信的目的。 什么是网络协议&#xff1f; 网络协议是计算机…

Python函数 之 参数

1.参数的简单介绍 参数 形式参数(形参)&#xff1a;在函数定义的时候,在括号中写⼊变量,这个变量就称为是函数的参数。实际参数(实参)&#xff1a;在函数调⽤的时候,可以给定义时候的形参传递具体的数据值,供其使⽤。注&#xff1a; 在函数调⽤的时候&#xff0c;会将函数的实…

wps 将列的内容转换为一个单元格内容,并以逗号分隔

wps 将列的内容转换为一个单元格内容&#xff0c;并以逗号分隔 1.首先在一个空白单元格输入 2.输入函数TEXTJOIN 这个函数有三个参数&#xff0c;第一个&#xff1a;以什么分隔符分隔&#xff0c;第二个&#xff1a;是否忽略空白格&#xff0c;true:忽略 false:不忽略 第三个&…

怎么使用代理IP?如何检测代理IP是否有效?

代理IP是一种网络代理技术&#xff0c;它是通过中间服务器来转发网络请求的IP地址。当我们使用代理IP时&#xff0c;我们的真实IP地址会被隐藏起来&#xff0c;而代理服务器的IP地址会被用作我们的身份标识。使用代理IP的步骤如下&#xff1a; 1.选择合适的代理服务器 考虑服务…

【微信小程序知识点】转发功能的实现

转发功能&#xff0c;主要帮助用户更流畅地与好友分享内容与服务。 想实现转发功能&#xff0c;有两种方式&#xff1a; 1.页面js文件必须声明onShareAppMessage事件监听函数&#xff0c;并自定义转发内容。只有定义了此事件处理函数&#xff0c;右上角菜单才会显示“转发”按…

WebStorm 使用 ESLint 自动格式化代码

WebStorm 不能像 VSCode 那样在保存的时候自动 Fix-ESLint&#xff0c;不能自动格式化代码&#xff0c;需要安装一个插件 安装 ESLint 插件 进入设置快捷键 win&#xff1a;CtrlAltS mac: command, 找到 Plugins&#xff0c;搜索eslint 在这里插入图片描述 安装后配置一下 …

【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式

注释&#xff1a; RTCM响应消息1020为GLONASS星历信息&#xff0c;暂不介绍&#xff0c;前公司暂未研发RTCM消息类型版本的DR/RTK模块&#xff0c;DR/RTK模块仅NMEA消息类型使用 注释&#xff1a; 公司使用的多信号语句类型为MSM4&MSM7&#xff0c;也应该是运用最广泛的语句…

从新手到进阶:高效设计 Tableau 可视化的 5 种技巧 | 数据可视化分析

让我们一起跟着大神学习五个超实用的技巧&#xff0c;加速你的可视化分析之旅&#xff01; 在日常分析中&#xff0c;人人都想实现可视化最佳实践。然而&#xff0c;对于很多初学者来说&#xff0c;在还未熟练掌握 Tableau 的情况下&#xff0c;这种愿望貌似不太符合实际。 为…

【想心静?】红尘中修炼的功夫,才是真正的功夫

刘君亮想要去山中静坐&#xff0c;先生说&#xff1a; 你若是以厌弃身外事物的心去静中寻求天理&#xff0c;反而只会养出骄傲怠惰的习气。你若能不厌弃身外事物&#xff0c;然后再到静处涵养天理&#xff0c;却是好的。 去一个安静的地方&#xff0c;去沉静一下自己的内心也…

电子画册制作流程技巧大揭秘

​随着科技的发展&#xff0c;电子画册已经逐渐取代传统纸质画册&#xff0c;成为展示企业形象、传播信息的重要工具。一份精美的电子画册&#xff0c;不仅能提升企业品牌形象&#xff0c;还能吸引更多潜在客户。那么&#xff0c;如何制作一份既精美又实用的电子画册呢&#xf…

YOLOv8损失函数改进-增加MPDIoU提升边界框回归精度【附代码】

文章目录 前言文章概述必要环境一、修改方法1.修改配置文件2. 增加 MPDIoU3. 修改 BboxLoss类4. 修改 v8DetectionLoss 类的 init 方法 二、训练代码三、训练过程总结 前言 本篇博客我们将详细介绍如何在 YOLOv8项目中增加 MPDIoULoss&#xff0c;包括如何修改配置文件、增加新…

U盘打不开难题解析:原因、恢复与预防全攻略

在日常生活中&#xff0c;U盘作为一种便捷的数据存储设备&#xff0c;深受大家的喜爱。然而&#xff0c;有时我们可能会遇到U盘打不开的情况&#xff0c;这不仅令人困扰&#xff0c;还可能导致重要数据的丢失。那么&#xff0c;当U盘打不开时&#xff0c;我们该如何应对呢&…

[PM]原型与交互设计

原型分类 1.草图原型 手绘图稿, 规划的早期,整理思路会使用 2.低保真原型 简单交互, 无需配色, 黑白灰为主, 产品规划和评审阶段使用 标准化的低保真原型是高保真原型的基础 3.高保真原型 复杂交互, 一般用于公开演示, 产品先产出低保真原型, 设计师根据原型产出设计稿 低保…

2024-07-12 Unity AI状态机1 —— 框架介绍

文章目录 1 有限状态机2 状态机实现框架2.1 StateMachine2.2 BaseState2.3 ...State2.4 IAIObject 3 框架类图 本文章参考 B 站唐老狮 2023 年直播内容。点击前往唐老狮 B 站主页。 1 有限状态机 ​ 有限状态机&#xff08;Finite - State Machine&#xff0c;FSM&#xff09…

如何让招投标数据成为企业决策的金钥匙?

在当今数据驱动的时代&#xff0c;招投标信息作为行业竞争情报的重要组成部分&#xff0c;正日益成为企业制定战略决策的关键依据。本文将深入探讨招投标数据采集的重要性&#xff0c;以及它如何为企业决策提供强有力的数据支持&#xff0c;同时揭秘如何高效、精准地获取这些数…

花几千上万学习Java,真没必要!(二)

1、注释&#xff1a; java代码注释分3种&#xff1a; 单行注释&#xff1a;//注释信息 多行注释: /*注释信息*/ 文本注释:/**注释信息*/ public class TestComments {// 这是单行注释&#xff0c;用于注释单行代码或解释代码功能/* 这是多行注释&#xff0c;用于注释多行代码…

eMMC规范 - 寻址/信息寄存器/总线协议/时序图/速度模式

存储器寻址 e•MMC 规范的早期实现&#xff08;至 v4.1 的版本&#xff09;是采用 32-bit 域实现字节寻址的。这种寻址 机制允许最大 2 GB 的 e•MMC 容量。 为了支持更大的容量&#xff0c;寻址机制升级到支持扇区寻址&#xff08; 512B 扇区&#xff09;。对所有容量大于 2 …

在PyQt中为自己开发的软件实现远程文件“一机一码”授权管理实例

在使用PyQt搞软件开发时&#xff0c;开发者往往想要给自己的软件添加一个授权机制&#xff0c;只有当客户提供了授权码并且开发者将授权码放在授权管理系统的时候&#xff0c;客户端才能正常启动。这几天小陶就在捣鼓这个事&#xff0c;发现确实是可行的。 如果没有进行授权&a…

mybatis动态传入参数 pgsql 日期 Interval ,day,minute

mybatis动态传入参数 pgsql 日期 Interval 在navicat中&#xff0c;标准写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL 5 day)在mybatis中&#xff0c;错误写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL#{numbers,jdbcTypeINTEGER} day)报错内…

html5——CSS高级选择器

目录 属性选择器 E[att^"value"] E[att$"http"] E[att*"http"] 关系选择器 子代&#xff1a; 相邻兄弟&#xff1a; 普通兄弟&#xff1a; 结构伪类选择器 链接伪类选择器 伪元素选择器 CSS的继承与层叠 CSS的继承性 CSS的层叠性 …