RSA算法(C++)

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.mzph.cn/pingmian/45562.shtml

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

相关文章

【RHCE】基于密钥的身份验证(Win-Linux)

目的&#xff1a;要提⾼系统安全性&#xff0c;通过在 OpenSSH 服务器上禁⽤密码⾝份验证来强制进⾏基于密钥的⾝份验证。 1、一台虚拟机无需密码连接另一台虚拟机 .ssh目录 > 保存了ssh相关的key和一些记录文件 &#xff08;1&#xff09;生成密钥对 使⽤这个流程在本地…

day19打卡

面试又一次失败&#xff0c;需要自我治愈一下&#xff0c;屡战屡败、屡败屡战....... 501.二叉搜索树中的众数 这题自己做的时候&#xff0c;出现了几个遗漏的思路&#xff1a;1、使用迭代法的时候&#xff0c;判断当前节点和pre节点是否相同&#xff0c;需要push的是pre节点 …

U盘打不开的终极解决方案:原因剖析、恢复策略与预防之道

U盘困境&#xff1a;打不开的焦虑与应对 在数字化时代&#xff0c;U盘作为数据交换与存储的重要工具&#xff0c;几乎成为了每个人工作、学习和生活中的必需品。然而&#xff0c;当您满怀期待地将U盘插入电脑&#xff0c;却遭遇“无法识别”、“无法访问”等提示&#xff0c;U…

【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

​​​​​​​ 目录 一、引言 二、音频分类&#xff08;audio-classification&#xff09; 2.1 概述 2.2 技术原理 2.2.1 Wav2vec 2.0模型 2.2.1 HuBERT模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.4.1 …

【Qt 基础】Qt Creator 的初步使用、创建项目的过程

文章目录 1. Qt SDK 中工具程序的介绍2. 创建第一个 Qt 项目的前置步骤 1. Qt SDK 中工具程序的介绍 下载之后会出现下面几个程序&#xff1a; Assistant 表示 Qt 自带的离线官方文档&#xff1b; Designer &#xff1a;Qt设计师&#xff0c;图形化的设计界面的工具&#xf…

C++程序进阶学习

目录 引言 C内存分区 一、内存分区模型 二、 程序运行前 三、程序执行后 C引用 引用的语法 作用 本质 优点 C封装 C对象特性 C对象模型和this指针 C友元 C运算符重载 C继承 C多态 C文件 引言 看过我博客的朋友可能都了解这篇文章内容了&#xff0c;这篇博…

请使用C语言编写一个简单的MFC应用程序,实现一个窗口并在其中添加一些控件。

以下是一个简单的使用C编写的MFC应用程序示例&#xff0c;可以在其中添加一些控件。请使用Visual Studio等C开发工具打开并编译运行。 #include <afxwin.h>class CMyApp : public CWinApp { public:virtual BOOL InitInstance(); };class CMainWindow : public CFrameWn…

算术运算符. 二

# 表达式 # 操作数和运算符组成 比如 11 # 作用&#xff1a;表达式可以求值&#xff0c;也可以给变量赋值。 # Python算术运算符&#xff1a; # - * / % //&#xff08;整除:向下取整&#xff09; ** print(10 4) # 14 print(10 - 4) # 6 print(10 * 4) # 40 …

【PLC】基本概念

1、程序页 1.1 定义 PLC程序页是PLC程序中用于组织、编辑和显示各个程序段&#xff08;如主程序、子程序、中断程序等&#xff09;的独立区域。即&#xff1a;在程序编辑器窗口中&#xff0c;为不同的程序组织单元&#xff08;POU&#xff09;提供的独立页面或区域。 每个程序…

超声波清洗机哪家好?家用超声波眼镜清洗机推荐

超声波清洗机现在已经成为了很多家庭的新宠&#xff0c;它能够帮助我们轻松解决日常生活中的清扫烦恼。但是&#xff0c;面对市面上品种繁多的清洗机产品&#xff0c;我们该如何选择一款适合自己的呢?毕竟不同的品牌和型号&#xff0c;在清洗效果、噪音水平、除菌能力等方面都…

RHCE-autofs自动挂载

要求 一、在主机上提供web&#xff0c;dns服务 服务端 IP&#xff1a;172.25.250.131/24 dns&#xff1a;172.25.250.131 [rootlocalhost ~]# cd /etc/httpd/conf.d[rootlocalhost conf.d]# vim vhost.conf [rootlocalhost conf.d]# mkdir /nfs/rhce -p[rootlocalhost conf…

Facebook应用开发:认证与授权登录流程详解

Facebook作为全球最大的社交平台之一&#xff0c;提供了强大的认证与授权机制&#xff0c;允许第三方应用通过Facebook登录来简化用户的注册和登录流程。本文将详细介绍Facebook应用开发中的认证和授权登录流程&#xff0c;以及如何在应用中实现这一功能。 关键词 Facebook登…

HTTPS和HTTP有哪些区别

两者的主要区别在于安全性和数据加密&#xff1a; 加密层&#xff1a;HTTPS 在HTTP 的基础上增加了SSL/TLS 协议作为加密层&#xff0c;确保数据传输的安全性,即使数据被截获&#xff0c;没有相应的密钥也无法解读数据内容。而HTTP 数据传输是明文的&#xff0c;容易受到攻击。…

雪深监测站的工作原理

TH-TS200雪深监测站是一种用于测量和记录雪层深度的设备&#xff0c;它在气象观测、交通管理、防灾减灾、水源管理等多个领域发挥着重要作用。雪深监测用来监测雪深的设备。它通过各种传感器和测量设备&#xff0c;如超声波测距仪、激光测距仪、压力传感器等&#xff0c;获取雪…

Python中的名称修改和特殊属性

在 Python 中&#xff0c;以双下划线&#xff08;__&#xff09;开头但不以双下划线结尾的变量主要用于类的私有属性&#xff0c;这种命名方式被称为名称修饰&#xff08;name mangling&#xff09;。名称修饰会将变量名转换为类名和变量名的组合&#xff0c;从而避免在子类中发…

若依安装和初始化教程(傻瓜教程 一步一步走)

1、若依的安装&#xff1a; 1、找到若依官方网站并选择若依的前后端分离版本 2、点击克隆 然后选择http进行复制 3、打开idea 如果有打开的项目就先关闭项目&#xff0c;然后就会自动弹出下面第二张图片&#xff0c;接着按照流程走就可以 到此若依的下载就成功了 2、若依项目…

如何判断代码是否是在UPDATE TASK的Session中执行?

1. 背景 有时我们想控制ABAP代码在UPDATE TASK中的逻辑&#xff0c;例如某些逻辑执行&#xff0c;某些逻辑不执行。 那么&#xff0c;我们应该如何判断当前代码运行的环境呢&#xff1f;也即&#xff0c;怎么知道一段运行时代码是运行在当前的ABAP session中&#xff0c;还是…

IDEA设置代码提示忽略大小写

一、设置代码提示为忽略大小写 IDEA代码提示默认是区分大小写的&#xff0c;设置为提示忽略大小写&#xff1a; Setting——Editor——Code Completion 如图

智慧金融-数据可视化

智慧金融-数据可视化 导入所需的库 import numpy as np import numpy_financial as npf import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif][FangSong] mpl.rcParams[axes.unicode_minus]False单图曲线图 r 0.05 # 贷款的年利率 n 30…

字符串哈希详解,单hash,双hash,滚动哈希

一、字符串哈希 1.1 基本概念 字符串哈希 将不同的字符串映射成不同的整数。 思想&#xff1a;将字符串映射成一个 p进制数字。 我们定义如下哈希函数&#xff1a; h a s h ( s ) ∑ i 1 n s [ i ] p n − i ( m o d M ) 其中 s 为长度为 n 的字符串&#xff0c;下标从…