服饰营销型网站建设/微信小程序开发教程
RSA算法是一种非对称加密算法,由三位数学家Rivest
、Shamir
和Adleman
共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。
RSA算法是一种常用的非对称加密算法,与对称加密算法不同,RSA算法使用一对非对称密钥,分别为公钥和私钥,公钥和私钥是成对生成的,公钥可以公开,用于加密数据和验证数字签名,而私钥必须保密,用于解密数据和生成数字签名。因此,RSA算法的使用场景是公钥加密、私钥解密,或者私钥加密、公钥解密。
OpenSSL库中提供了针对此类算法的支持,但在使用时读者需要自行生成公钥与私钥文件,在开发工具包内有一个openssl.exe
程序,该程序则是用于生成密钥对的工具,当我们需要使用非对称加密算法时,则可以使用如下命令生成公钥和私钥。
- 生成私钥: openssl genrsa -out rsa_private_key.pem 1024
- 生成公钥: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
读者执行上述两条命令后即可得到rsa_private_key.pem
私钥,以及rsa_public_key.pem
公钥,如下图所示;
在使用非对称加密时,读者需要分别导入所需要的头文件,这其中就包括了rsa.h
用于处理加密算法的库,以及pem.h
用于处理私钥的库,这两个库是使用RSA时必须要导入的。
#include <iostream>
#include <string>
#include <openssl/err.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/crypto.h>extern "C"
{
#include <openssl/applink.c>
}#pragma comment(lib,"libssl.lib")
#pragma comment(lib,"libcrypto.lib")
20.2.1 公钥加密私钥解密
RSA公钥用于加密数据和验证数字签名,私钥用于解密数据和生成数字签名,通常用于公钥加密、私钥解密的场景,具有较高的安全性,但加密和解密速度较慢,因此通常采用一种混合加密方式,即使用RSA算法加密对称加密算法中的密钥,再使用对称加密算法加密数据,以保证数据的机密性和加密解密的效率。
首先我们来实现公钥加密功能,如下Public_RsaEncrypt
函数,该函数接受两个参数,分别是需要加密的字符串以及公钥文件,代码中首先通过fopen()
打开一个公钥文件,并通过PEM_read_RSA_PUBKEY
函数读入并初始化公钥文件,接着调用RSA_public_encrypt
该函数主要用于实现公钥加密,当加密成功后返回加密后的文本内容,类型是字符串。
// 公钥加密
std::string Public_RsaEncrypt(const std::string& str, const std::string& path)
{RSA* rsa = NULL;FILE* file = NULL;char* ciphertext = NULL;int len = 0;int ret = 0;file = fopen(path.c_str(), "r");if (file == NULL){return std::string();}rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL);if (rsa == NULL){ERR_print_errors_fp(stdout);fclose(file);return std::string();}len = RSA_size(rsa);ciphertext = (char*)malloc(len + 1);if (ciphertext == NULL){RSA_free(rsa);fclose(file);return std::string();}memset(ciphertext, 0, len + 1);ret = RSA_public_encrypt(str.length(), (unsigned char*)str.c_str(), (unsigned char*)ciphertext, rsa, RSA_PKCS1_PADDING);if (ret < 0){ERR_print_errors_fp(stdout);free(ciphertext);RSA_free(rsa);fclose(file);return std::string();}std::string s(ciphertext, ret);free(ciphertext);RSA_free(rsa);fclose(file);return s;
}
与公钥加密方法类似,Private_RsaDecrypt
函数用于使用私钥进行解密,该函数接受两个参数,第一个参数是加密后的字符串数据,第二个参数则是私钥的具体路径,函数中通过PEM_read_RSAPrivateKey
实现对私钥的初始化,并通过RSA_private_decrypt
函数来实现对特定字符串的解密操作。
// 私钥解密
std::string Private_RsaDecrypt(const std::string& str, const std::string& path)
{RSA* rsa = NULL;FILE* file = NULL;char* plaintext = NULL;int len = 0;int ret = 0;file = fopen(path.c_str(), "r");if (file == NULL){return std::string();}rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL);if (rsa == NULL){ERR_print_errors_fp(stdout);fclose(file);return std::string();}len = RSA_size(rsa);plaintext = (char*)malloc(len + 1);if (plaintext == NULL){RSA_free(rsa);fclose(file);return std::string();}memset(plaintext, 0, len + 1);ret = RSA_private_decrypt(str.length(), (unsigned char*)str.c_str(), (unsigned char*)plaintext, rsa, RSA_PKCS1_PADDING);if (ret < 0){ERR_print_errors_fp(stdout);free(plaintext);RSA_free(rsa);fclose(file);return std::string();}std::string s(plaintext, ret);free(plaintext);RSA_free(rsa);fclose(file);return s;
}
这两段代码的调用也非常容易,如下代码片段则分别实现了对text
字符串的加密与解密功能,使用公钥加密,使用私钥解密。
int main(int argc, char* argv[])
{std::string text = "hello lyshark";// 公钥加密std::string public_path = "d://rsa_public_key.pem";std::string encry = Public_RsaEncrypt(text, public_path);// std::cout << "加密后文本: " << encry << std::endl;// 私钥解密std::string private_path = "d://rsa_private_key.pem";std::string decry = Private_RsaDecrypt(encry, private_path);std::cout << "解密后文本: " << decry << std::endl;system("pause");return 0;
}
这段代码输出效果如下图所示;
20.2.2 私钥加密公钥解密
在RSA算法中,私钥加密公钥解密并不是一种常见的使用方式,因为私钥是用于签名而不是加密的。通常的使用方式是,使用公钥加密,私钥解密,这样可以保证数据的机密性,只有拥有私钥的人才能解密数据,但在某些时候我们不得不将这个流程反过来,使用私钥加密并使用公钥解密。
私钥加密的封装代码如下所示,其中Private_RsaEncrypt
用于实现私钥加密,该函数同样接受两个参数,分别是待加密字符串以及当前私钥路径,函数的核心部分是RSA_private_encrypt
该函数可用于使用私钥对数据进行加密。
// 私钥加密
std::string Private_RsaEncrypt(const std::string& str, const std::string& path)
{RSA* rsa = NULL;FILE* file = NULL;char* ciphertext = NULL;int len = 0;int ret = 0;file = fopen(path.c_str(), "r");if (file == NULL){return std::string();}rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL);if (rsa == NULL){ERR_print_errors_fp(stdout);fclose(file);return std::string();}len = RSA_size(rsa);ciphertext = (char*)malloc(len + 1);if (ciphertext == NULL){RSA_free(rsa);fclose(file);return std::string();}memset(ciphertext, 0, len + 1);ret = RSA_private_encrypt(str.length(), (unsigned char*)str.c_str(), (unsigned char*)ciphertext, rsa, RSA_PKCS1_PADDING);if (ret < 0){ERR_print_errors_fp(stdout);free(ciphertext);RSA_free(rsa);fclose(file);return std::string();}std::string s(ciphertext, ret);free(ciphertext);RSA_free(rsa);fclose(file);return s;
}
公钥解密的实现方法与加密完全一致,代码中Public_RsaDecrypt
函数用于实现公钥解密,其核心功能的实现依赖于RSA_public_decrypt
这个关键函数。
// 公钥解密
std::string Public_RsaDecrypt(const std::string& str, const std::string& path)
{RSA* rsa = NULL;FILE* file = NULL;char* plaintext = NULL;int len = 0;int ret = 0;file = fopen(path.c_str(), "r");if (file == NULL){return std::string();}rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL);if (rsa == NULL){ERR_print_errors_fp(stdout);fclose(file);return std::string();}len = RSA_size(rsa);plaintext = (char*)malloc(len + 1);if (plaintext == NULL){RSA_free(rsa);fclose(file);return std::string();}memset(plaintext, 0, len + 1);ret = RSA_public_decrypt(str.length(), (unsigned char*)str.c_str(), (unsigned char*)plaintext, rsa, RSA_PKCS1_PADDING);if (ret < 0){ERR_print_errors_fp(stdout);free(plaintext);RSA_free(rsa);fclose(file);return std::string();}std::string s(plaintext, ret);free(plaintext);RSA_free(rsa);fclose(file);return s;
}
有了上述方法,那么调用代码则变得很容易,如下所示,我们将text
字符串使用私钥进行加密,并使用公钥进行解密。
int main(int argc, char* argv[])
{std::string text = "hello lyshark";// 私钥加密std::string private_path = "d://rsa_private_key.pem";std::string encry = Private_RsaEncrypt(text, private_path);// std::cout << "加密后文本: " << encry << std::endl;// 公钥解密std::string public_path = "d://rsa_public_key.pem";std::string decry = Public_RsaDecrypt(encry, public_path);std::cout << "解密后文本:" << decry << std::endl;system("pause");return 0;
}
这段代码输出效果如下图所示;
相关文章:

20.2 OpenSSL 非对称RSA加解密算法
RSA算法是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用…...

MySQL安装『适用于 CentOS 7』
✨个人主页: 北 海 🎉所属专栏: MySQL 学习 🎃操作环境: CentOS 7.6 腾讯云远程服务器 🎁软件版本: MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…...

国家数据局成立,公共数据如何掘金?
国家数据局揭牌:引领新时代数据要素管理和开发的重大举措 筹建7个多月后,10月25日,国家数据局正式揭牌。根据《党和国家机构改革方案》,国家数据局负责协调推进数据基础制度建设,统筹数据资源整合共享和开发利用&…...

PostgreSQL基于Patroni方案的高可用启动流程分析
什么是Patroni 在很多生产环境中,分布式数据库以高可用性、数据分布性、负载均衡等特性,被用户广泛应用。而作为高可用数据库的解决方案——Patroni,是专门为PostgreSQL数据库设计的,一款以Python语言实现的高可用架构模板。该架…...

opencv+yolov8实现监控画面报警功能
项目背景 最近停在门前的车被人开走了,虽然有监控,但是看监控太麻烦了,于是想着框选一个区域用yolov8直接检测闯入到这个区域的所有目标,这样1ms一帧,很快就可以跑完一天的视频 用到的技术 COpenCVYolov8 OnnxRunt…...

基于深度学习的单图像人群计数研究:网络设计、损失函数和监控信号
摘要 https://arxiv.org/pdf/2012.15685v2.pdf 单图像人群计数是一个具有挑战性的计算机视觉问题,在公共安全、城市规划、交通管理等领域有着广泛的应用。近年来,随着深度学习技术的发展,人群计数引起了广泛的关注并取得了巨大的成功。通过系统地回顾和总结2015年以来基于深…...

C++递归实现验证⼆叉搜索树
C递归实现验证⼆叉搜索树 文章目录 C递归实现验证⼆叉搜索树题目链接题目描述解题思路C算法代码: 题目链接 98. 验证二叉搜索树 - 力扣(LeetCode) 题目描述 给你⼀个⼆叉树的根节点root,判断其是否是⼀个有效的⼆叉搜索树。 有效⼆…...

♥ uniapp 环境搭建
♥ uniapp 环境搭建 开发uniapp需要用到的工具有两个: 1、用到的平台和地址: 需要了解的几个平台以及地址: (1)微信公众平台 https://mp.weixin.qq.com/ (2)微信开发文档 https://develo…...

京东商品链接获取京东商品评论数据(用 Python实现京东商品评论信息抓取),京东商品评论API接口,京东API接口
在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取京东多网站上的商品详情页面评论内容。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#…...

docker容器中安装ROS1/ROS2(不用配任何环境,10分钟搞定)
默认电脑已经安装了docker,没安装看这篇文章Docker 安装 (完整详细版) ROS和docker各种结合看官方文档 dockerTutorials 在OSRF中拉取想要的 ROS 版本 docker 镜像 网址为 拉取命令在这里 我是安装noetic版本,因为这个兼容比较多现有的工程 docker pul…...

如何解决ssh登录报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
原因: 当两个设备第一次进行链接时,会在~/.ssh/konwn_hosts 中将被连接设备的公钥信息进行保存,后续再次链接时OpenSSH会核对公钥来进行一个简单的验证 然而有时候被链接的那台设备系统被重装、IP 冲突等原因,会导致公钥信息没…...

Mysql5.7安装配置详细图文教程(msi版本)
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...

运行dl4j-examples的主要一些依赖
直接从git获取dl4j-examples后本地无法用IJ直接运行样例,于是自己新建了一个springboot项目,主要使用了下面的一些依赖用来运行官方样例 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache…...

PSRAM伪静态RAM芯片APS6404L
PSRAM伪静态RAM能结合SRAM和DRAM的优点,即容量大,又接口驱动简单,PSRAM接口和SRAM一样简单,驱动简单;而存储形式则和DRAM一样,容量远大于SRAM,介于SRAM和DRAM之间。 PSRAM厂家也有很多,以AP用的最多。最常…...

低级语言汇编真的各个面不如汇编吗?
今日话题,低级语言汇编真的各个面不如C语言吗?C语言因其可移植性、开发效率和可读性而在各领域广泛使用,市场占有率极高。然而,汇编语言在特定场景下仍然具有独特优势,稳固地占据一席之地。如果你对这方面感兴趣&#…...

PyG edge index 转换回 邻接矩阵
PyG的edge index形式是 [ ( n o d e 1 , n o d e 2 ) , ( n o d e 1 , n o d e 3 ) . . . ] [(node_1,node_2), (node_1, node_3)...] [(node1,node2),(node1,node3)...]这种edge pair。 naive 直接for循环,吧edge index里面的位置填充1: imp…...

JavaSE19——file文件类
file文件类 在 Java File 类是 java.io 包中唯一代表磁盘文件本身的对象 File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。 File(String path):如果 path 是实际存在的路径,则该 File 对象表示的…...

mongodb记录
MongoDB导入导出和备份的命令工具从4.4版本开始不再自动跟随数据库一起安装,而是需要自己手动安装。 mongodump 不是内部或外部命令,也不是可运行的程序 下载mongodb命令工具 下载zip格式,解压后把bin目录下的文件全部复制粘贴到你MongoDB安…...

Go语言:数组和切片
Python中的数组(这里指的是List类型)及其切片Slice基本相同,但在Go语言中这两者差别很大。 1 数组 Go语言中的数组(Array)存放的是长度固定、类型固定并且存储位置连续的一系列元素。 1.1 声明 Go语言中数组的声明方式如下: arr1 : [5]string{"…...

OPENCV 闭运算实验示例代码morphologyEx()函数
void CrelaxMyFriendDlg::OnBnClickedOk() {hdc this->GetDC()->GetSafeHdc();// TODO: 在此添加控件通知处理程序代码string imAddr "c:/Users/actorsun/Pictures/";string imAddr1 imAddr"rice.png";Mat relax, positive;relax imread(imAddr1…...

UE4 体积云制作 学习笔记
首先Noise本来就是一张噪点图 云的扰动不能太大,将Scale调小,并将InputMin调整为0 形成这样一张扰动图 扰动需要根据材质在世界的位置进行调整,所以Position需要加上WorldPosition 材质在不同世界位置,噪点不同 除以一个数&#…...

visual studio编译QtAV
1.1 依赖环境 第一种方法: 下载编译好的ffmpeg-3.4.2-win64-dev和ffmpeg-3.4.2-win64-shared,解压得到 D:\qt-workspace\ffmpeg-3.4.2-win64-dev D:\qt-workspace\ffmpeg-3.4.2-win64-shared 第二种方法: QtAV官方有提供编译好的依赖库 QtAV-depends-windows-x86%2Bx64.7…...

喜报!CACTER邮件安全网关荣获2023鲲鹏应用创新大赛广东赛区三等奖
近期,2023鲲鹏应用创新大赛广东赛区暨广东省信息技术应用创新产业联盟创新大赛圆满落幕,Coremail凭借“基于鲲鹏CPU的邮件网关一体机解决方案”,荣获“金融行业方向”三等奖。 鲲鹏凌粤 展翅湾区 本届大赛广东区域赛以“鲲鹏凌粤 展翅湾…...

Spark On Hive原理和配置
目录 一、Spark On Hive原理 (1)为什么要让Spark On Hive? 二、MySQL安装配置(root用户) (1)安装MySQL (2)启动MySQL设置开机启动 (3)修改MySQL…...

驱动第十天
...

工作中常用的git命令,千万不能忘
1、设置当前分支为默认分支: git branch –set-upstream-toorigin/master 2、To push the current branch and set the remote as upstream, use: git push --set-upstream origin eds_enhancement 3、同步远程分支 git remote update --prune [remote] 4、Remo…...

计组之存储系统
存储器概述 分类 1.按在计算机中的作用(层次)分类 主存储器。CPU可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据。辅助存储器。辅存的内容需要调入主存后才能被CPU访问。高速缓冲存储器。位于…...

【Jenkins】新建任务FAQ
问题1. 源码管理处填入Repository URL,报错:无法连接仓库:Error performing git command: ls-remote -h https://github.com/txy2023/GolangLearning.git HEAD 原因: jenkins全局工具配置里默认没有添加git的路径,如果…...

生产环境使用boost::fiber
简介 boost::fiber是一类用户级线程,也就是纤程。其提供的例子与实际生产环境相距较远,本文将对其进行一定的改造,将其能够投入到生产环境。 同时由于纤程是具有传染性的,使用纤程的代码里也全部要用纤程封装,本文将对…...

TSINGSEE青犀AI视频识别技术+危化安全生产智慧监管方案
一、背景分析 石油与化学工业生产过程复杂多样,涉及的物料易燃易爆、有毒有害,生产条件多高温高压、低温负压,现场危险化学品存储量大、危险源集中,重特大安全事故多发。打造基于工业互联网的安全生产新型能力,提高危…...