非对称加密算法RSA的OpenSSL代码实现Demo

目录

1 RSA简介

1.1 RSA算法介绍

1.2 RSA算法的速度与安全性

1.3 RSA存储格式

1.3.1 PKCS#1 标准主要用于 RSA密钥,其RSA公钥和RSA私钥PEM格式    

1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案,其公钥和私钥PEM格式

2 OpenSSL代码实现

2.1 生成密钥对

 2.2 公钥加密-私钥解密

 2.3 私钥加密-公钥解密

3 演示Demo

3.1 开发环境

3.2 功能介绍

3.3 下载地址


1 RSA简介

1.1 RSA算法介绍

        RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

        RSA加密算法是一种可逆的非对称加密算法,即RSA加密时候用的密钥(公钥)和RSA解密时用的密钥(私钥)不是同一把。基本原理是将两个很大的质数相乘很容易得到乘积,但是该乘积分解质因数却很困难。RSA算法被广泛的用于加密解密和RSA签名/验证等领域。

1.2 RSA算法的速度与安全性

        比起AES等其它对称算法来说,RSA运算更为复杂,所以要慢得多。

        从安全角度来讲,一般建议RSA密钥长度至少为2048位。世界上还没有任何可靠的攻击RSA算法的方式,如果密钥足够长或者没有密钥,想要RSA解密或者破解RSA解密基本是不可能的。RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

1.3 RSA存储格式

        DER是RSA密钥的二进制格式,PEM是DER转码为Base64的字符格式,由于DER是二进制格式,不便于阅读和理解。一般而言,密钥都是通过PEM的格式进行存储的。

1.3.1 PKCS#1 标准主要用于 RSA密钥,其RSA公钥和RSA私钥PEM格式    

// PKCS#1公钥格式
-----BEGIN RSA PUBLIC KEY-----
BASE64 DATA...
-----END RSA PUBLIC KEY-----
// PKCS#1私钥格式
-----BEGIN RSA PRIVATE KEY-----
BASE64 DATA...
-----END RSA PRIVATE KEY-----

1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案,其公钥私钥PEM格式

// PKCS#8公钥格式
-----BEGIN PUBLIC KEY-----
BASE64 DATA...
-----END PUBLIC KEY-----
// PKCS#8私钥格式
-----BEGIN PRIVATE KEY-----
BASE64 DATA...
-----END PRIVATE KEY-----

        经过对比,我们可以明显看到,PKCS #8 格式是没有rsa字样的,因为PKCS#8是一个通用型的密钥格式方案,它不仅为RSA算法所使用,同样也可以被其它加密解密算法所使用。

2 OpenSSL代码实现

2.1 生成密钥对

#include <openssl/rsa.h>
/*功能:生成密钥对参数:rsa  - [out] 这是一个指向 RSA 结构的指针,该结构将用于存储生成的 RSA 密钥对。在调用此函数之前,您应该使用 RSA_new() 初始化此结构。bits - [in]  这指定了 RSA 密钥的长度(以位为单位)。常见的值是 1024、2048、4096 等。较长的密钥提供更高级别的安全性,但也需要更多的计算资源。e    - [in]  这是一个指向 BIGNUM 结构的指针,该结构包含 RSA 公钥的指数 e。在许多情况下,e 被设置为 65537(即 0x10001),因为它是一个常见的选择,并且在加密和解密过程中提供了良好的性能。如果您将此参数设置为 NULL,则 OpenSSL 会自动使用默认值(通常是 65537)。cb    - [out] 这是一个指向 BN_GENCB 结构的指针,该结构可以用于为密钥生成过程提供回调功能。这允许您在密钥生成过程中执行某些操作,例如更新进度条或执行其他任务。如果您不需要此功能,可以将此参数设置为 NULL。返回:如果密钥生成成功,则返回 1。如果发生错误,则返回 0,并设置相应的错误代码(可以使用 OpenSSL 的错误处理函数进行检查)。
*/
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);

 2.2 公钥加密-私钥解密

#include <openssl/rsa.h>
/*功能:公钥加密参数:flen    - [in] 明文数据长度字节数,若padding参数使用RSA_PKCS1_PADDING方式,则该值最大为所使用密钥的位数 / 8 - 11from    - [in] 明文数据to      - [out]存放生成的密文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下rsa     - [in] 公钥padding - [in] 填充方式返回:加密后数据的长度
*/
int RSA_public_encrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);/*功能:私钥解密参数:flen    - [in] 密文数据长度,一般固定为秘钥位数 / 8from    - [in] 密文数据to      - [out]存放解密后的明文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下rsa     - [in] 私钥padding - [in] 填充方式返回:解密后数据的长度
*/                       
int RSA_private_decrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);                       

 2.3 私钥加密-公钥解密

 #include <openssl/rsa.h>/*功能:私钥加密参数:flen    - [in] 明文数据长度字节数,若padding参数使用RSA_PKCS1_PADDING方式,则该值最大为所使用密钥的位数 / 8 - 11from    - [in] 明文数据to      - [out]存放生成的密文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下rsa     - [in] 私钥padding - [in] 填充方式返回:加密后数据的长度
*/
int RSA_private_encrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);/*功能:公钥解密参数:flen    - [in] 密文数据长度,一般固定为秘钥位数 / 8from    - [in] 密文数据to      - [out]存放解密后的明文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下rsa     - [in] 公钥padding - [in] 填充方式返回:解密后数据的长度
*/
int RSA_public_decrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);

3 演示Demo

3.1 开发环境

  • OpenSSL 1.0.2l

  • Visual Studio 2015

  • Windows 10 Pro x64

3.2 功能介绍

        演示程序主界面如下图所示,包括密钥长度设置,公私钥/输入/输出数据格式设置以及公钥加密、私钥解密、私钥加密、公钥解密等功能。

        支持String(文本)、Hex(十六进制)、Base64等多种数据格式。

3.3 下载地址

        开发环境:

  • Windows 10 pro x64

  • Visual Studio 2015

  • OpenSSL 1.0.2l

        下载地址: 非对称加密算法RSA的OpenSSL代码实现Demo

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

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

相关文章

WSL 2 Oracle Linux 9.1 安装配置

文章目录 环境使用体验安装 Oracle Linux 9.1修改默认存储路径默认 root 用户登录启用 systemd启用 SSH 连接WSL 无法 ping 通宿主机和域名WSL 使用主机代理&#xff08;测试通过&#xff09;WSL 常用命令 环境 OS&#xff1a;Win11 24H2 (OS 内部版本26120.1252) wsl --versio…

闭着眼就能学会的装饰器

目录 一&#xff0c;闭包 1&#xff0c;闭包函数含义以及三要素 2&#xff0c;定义一个简单的闭包 二&#xff0c;装饰器 1&#xff0c;装饰器的作用场景以及特点 2&#xff0c;定义一个简单的装饰器 1&#xff0c;需求1 2&#xff0c;需求2 三&#xff0c;装饰器的实…

初学51单片机之指针基础与串口通信应用

开始之前推荐一个电路学习软件&#xff0c;这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本&#xff0c;这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…

华盈生物-“表面等离子共振(SPR)技术如何进行靶点验证:揭秘靶点锁定的科学魔法”

在药物开发和生物研究中&#xff0c;靶点验证是一个至关重要的步骤。表面等离子共振&#xff08;SPR&#xff09;技术以其高灵敏度和实时监测能力&#xff0c;成为了靶点验证的理想工具。今天&#xff0c;我们将揭示SPR技术在靶点验证中的神奇应用&#xff0c;让我们一起看看它…

第九讲:POU与变量基础

POU(Program Organization Unit)的分类 一、定义及分类 POU即程序组成单元 二、三种POU的作用 1、功能/功能快:看作算法 功能块的POU是比较复杂的指令 三、功能块POU和功能POU的区别 1、理解功能POU(对比) 不添加实例名,就不需要去建立变量,所以就不会占到内存。 因…

算法题目整合4

文章目录 122. 大数减法123. 滑动窗口最大值117. 软件构建124. 小红的数组构造125. 精华帖子126. 连续子数组最大和 122. 大数减法 题目描述 以字符串的形式读入两个数字&#xff0c;编写一个函数计算它们的差&#xff0c;以字符串形式返回。输入描述 输入两个数字&#xff…

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网&#xff08;IoT&#xff09;技术的迅猛发展&#xff0c;物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心&#xff0c;已经渗透到社会生活的各个领域&#xff0c;对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

VUE之---slot插槽

什么是插槽 slot 【插槽】&#xff0c; 是 Vue 的内容分发机制&#xff0c; 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素&#xff0c; 而这一个标签元素是否显示&#xff0c; 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

Postman的高级功能

Postman是一款功能强大的API测试工具&#xff0c;它提供了许多高级功能来帮助开发者和测试人员更高效地进行API测试和开发。以下是Postman在API测试中的一些高级功能&#xff1a; 1. 集合和文件夹 集合&#xff1a;用于组织相关的API请求。文件夹&#xff1a;在集合内部进一步…

Huffman编码和译码

Huffman编码(Huffman Coding),又称霍夫曼编码或赫夫曼编码,是一种用于无损数据压缩的熵编码(权编码)算法,由大卫霍夫曼(David A. Huffman)在1952年发明。Huffman编码属于可变字长编码(VLC)的一种,其基本思想是根据字符在数据中出现的频率来分配不同长度的编码,出现…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接&#xff0c;问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单&#xff0c;于是说我抽空看看。然后就分析目标网页&#xff0c;试图从网页源码里找出连接&#xff0c;有的源代码直接有,但是有的没有…

(二)C++之类与对象

一.类的申明 class 类名 { private: 私有的数据和成员函数; public: 公用的数据和成员函数; protected: 保护的数据和成员函数 };二.类的成员函数 构造函数&#xff08;类的初始化&#xff0c;创建类时自动调用&#xff1b;初始化表,this指针&#xff09; 默认构造函数 A();…

语法糖的setup和onMounted

遇到的问题&#xff1a;利用:style绑定响应式变量并结合css来动态更换颜色&#xff0c;绑定的响应式变量无法正常渲染 结论&#xff1a;本人将:style绑定响应式变量的值写在onMounted里面了&#xff0c;一个大失误&#xff0c;记录一下&#xff0c;利用setup语法糖默认初始化阶…

Redisson常用的数据结构及应用场景

Redisson 提供了一系列高级数据结构&#xff0c;这些数据结构封装了 Redis 的原生数据类型&#xff0c;提供了 Java API 的便利性和分布式特性。以下是 Redisson 中一些常用的数据结构&#xff0c;场景还在不断完善中&#xff1a; RBucket&#xff1a;这是一个简单的键值对存储…

Java二十三种设计模式-代理模式模式(8/23)

代理模式&#xff1a;为对象访问提供灵活的控制 引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代替或占位符&#xff0c;以控制对它的访问。 基础知识&#xff0c;java设计模式总体来说设计模式分为三大类&#…

Carefree为高性能设计仿真及人工智能提供一站式解决方案

在当今数字化转型的浪潮中&#xff0c;程易科技作为行业领先的科技创新企业&#xff0c;致力于为客户提供高效、安全、智能的研发资源服务。我们的研发资源服务平台集成了四大核心组件——研发资源统一门户、HPC高性能计算平台、远程可视化前后处理平台以及AI人工智能及算法平台…

Qt 实战(7)元对象系统 | 7.6、Q_DECLARE_METATYPE详解

文章目录 一、Q_DECLARE_METATYPE详解1、基本概念2、使用场景3、使用方法4、示例&#xff1a;QVariant使用自定义类型5、总结 前言&#xff1a; 在Qt框架的C开发中&#xff0c;Q_DECLARE_METATYPE是一个重要且常用的宏&#xff0c;它扮演着连接自定义类型与Qt元对象系统&#x…

Varjo XR-4系列现已获得达索3DEXPERIENCE平台官方支持

近日&#xff0c;全球领先的工业虚拟和混合现实解决方案提供商Varjo宣布&#xff0c;Varjo XR-4系列现已获得达索3DEXPERIENCE平台的本地支持。这种集成为工程师和设计师带来了先进的虚拟和混合现实功能&#xff0c;他们可以通过沉浸式技术创新并简化他们的3D工作流程。 在达索…

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer&#xff1f;引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理&#xff08;TagData分析&#xff09;关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…

堆的相关知识点

目录 大小堆 堆的实现 堆的创建 堆的销毁 交换 向上调整 向下调整 弹出首个元素 取出首个元素 判空 堆插入 大小堆 大堆&#xff1a;最上面的数字是最小的&#xff0c;越往下越大 小堆&#xff1a;最上面的数字是最大的&#xff0c;越往下越小 堆的复杂程度&#…