当前位置: 首页 > news >正文

C++ CryptoPP使用RSA加解密

Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库。它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto++ 的目标是提供高性能和可靠的密码学工具,以满足软件开发中对安全性的需求。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由三位密码学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年共同提出。RSA算法被广泛应用于信息安全领域,特别是在数字签名和密钥交换等场景中。

以下是RSA加密算法的主要概述:

  1. 非对称加密: RSA是一种非对称加密算法,使用一对公钥和私钥。公钥用于加密,私钥用于解密。这种非对称性质使得RSA在密钥交换和数字签名方面有着重要的应用。
  2. 大数分解: RSA的安全性基于大数分解问题的困难性。具体而言,RSA的安全性取决于将两个大质数相乘得到的结果难以分解为这两个质数的乘积。当前的技术水平下,对大数的分解仍然是一项困难的任务,从而确保了RSA的安全性。
  3. 密钥生成: RSA密钥生成包括选择两个大素数、计算其乘积(模数)和选择与欧拉函数互质的指数。这些步骤最终生成了公钥和私钥。
  4. 加密过程: 加密者使用接收者的公钥对消息进行加密。RSA的加密过程涉及模数的幂运算,其计算复杂度较高。
  5. 解密过程: 只有持有私钥的接收者才能解密消息。解密过程涉及模数的私钥指数的幂运算,从而得到原始消息。
  6. 数字签名: RSA可以用于数字签名,用私钥对消息的哈希值进行签名,而任何人都可以使用相应的公钥验证签名的有效性。这在确保消息完整性和身份验证方面非常有用。
  7. 密钥交换: RSA也广泛用于密钥交换,例如在安全套接字层(SSL/TLS)协议中。两方可以使用对方的公钥加密会话密钥,而只有持有相应私钥的一方才能解密会话密钥。
  8. 安全性: RSA的安全性依赖于大数分解问题的难解性。随着计算能力的增强,密钥长度需要不断增加以保持安全性。一般而言,2048比特或3072比特的密钥长度被认为是安全的。

总体而言,RSA是一种强大而灵活的加密算法,广泛用于保护通信的机密性、完整性和身份验证。由于其非对称性质,RSA在密钥交换和数字签名等场景中发挥着重要作用。

关键特点

  1. 非对称加密: RSA是一种非对称加密算法,使用两个密钥:公钥和私钥。公钥用于加密,私钥用于解密。
  2. 数学基础: RSA的安全性基于数论的难题,主要是大数因子分解。其原理是利用大质数的乘积很容易计算,但给定乘积却难以分解出其质因数。
  3. 密钥生成: RSA的密钥生成包括选择两个大质数,计算它们的乘积作为模数,并选择一个与欧拉函数互质的公钥指数。私钥则是根据公钥指数和模数计算得到的。
  4. 加解密过程:
    • 加密:使用接收者的公钥对消息进行加密。
    • 解密:只有接收者拥有相应的私钥才能解密消息。
  5. 数字签名: 除了加密和解密,RSA还可用于数字签名。发送者使用私钥对消息进行签名,接收者使用发送者的公钥来验证签名的真实性和完整性。
  6. 密钥长度: RSA密钥的长度通常以比特位为单位表示,常见的长度包括1024位、2048位和3072位。较长的密钥长度提供更高的安全性,但也可能导致性能损失。
  7. 应用领域: RSA广泛应用于数据加密、数字签名、密钥交换等场景。它是许多安全通信协议(如TLS、SSH)和数字证书的基础。

加解密流程

  1. 密钥生成: 选择两个大质数(p和q),计算它们的乘积N。选择公钥指数e,满足e与(N)的欧拉函数ϕ(N)互质。计算私钥指数d,使得(e * d) mod ϕ(N) = 1。
  2. 加密与解密过程:

RSA算法的安全性基于大整数因子分解的困难性,因此密钥的长度选择至关重要。随着计算能力的提高,一般建议使用2048位或更长的密钥以确保足够的安全性。

函数API概述

AutoSeededRandomPool

用于提供安全的伪随机数生成器。这个类会根据系统的熵源自动初始化,以确保生成的随机数足够安全。在 Crypto++ 库中,伪随机数生成器是通过 RandomNumberGenerator 接口实现的。AutoSeededRandomPoolRandomNumberGenerator 接口的一个具体实现。

InvertibleRSAFunction 类。

在 RSA 加密系统中,InvertibleRSAFunction 通常用于存储 RSA 密钥的信息,包括公钥和私钥。这个类通常与 RSA::PublicKeyRSA::PrivateKey 一起使用。InvertibleRSAFunction 存储了 RSA 密钥的模数(modulus)和指数(exponent),而 RSA::PublicKeyRSA::PrivateKey 则分别包含了公钥和私钥的其他相关信息。

RSA::PrivateKey

是 Crypto++ 中用于表示 RSA 私钥的类。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对密钥:公钥和私钥。私钥用于解密或签名,而公钥用于加密或验证签名。

在 Crypto++ 中,RSA::PrivateKey 包含了 RSA 密钥的关键信息,包括模数(Modulus)和私钥指数(Private Exponent)。这些信息是在生成 RSA 密钥对时使用 InvertibleRSAFunction 类生成的。

以下是 RSA::PrivateKey 类的一些关键成员和作用:

  • 构造函数PrivateKey 类的构造函数接受一个 InvertibleRSAFunction 对象作为参数,用于初始化私钥的关键信息。
  • GetModulus() 方法:获取私钥的模数。模数是 RSA 算法中的一个关键参数,用于加密和解密操作。
  • GetPrivateExponent() 方法:获取私钥的指数。私钥指数是 RSA 算法中的另一个关键参数,用于解密和签名操作。

私钥是安全性关键的信息,应当妥善保护。在使用 RSA 进行加密、解密、签名或验证时,相应的密钥对(公钥和私钥)必须配套使用。私钥不应该暴露给不信任的方,而公钥则可以公开分享。

RSA::PublicKey

是 Crypto++ 中用于表示 RSA 公钥的类。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密或验证签名,而私钥用于解密或签名。

RSA::PublicKey 包含了 RSA 密钥的关键信息,包括模数(Modulus)和公钥指数(Public Exponent)。这些信息是在生成 RSA 密钥对时使用 InvertibleRSAFunction 类生成的。

以下是 RSA::PublicKey 类的一些关键成员和作用:

  • 构造函数PublicKey 类的构造函数接受一个 InvertibleRSAFunction 对象作为参数,用于初始化公钥的关键信息。
  • GetModulus() 方法:获取公钥的模数。模数是 RSA 算法中的一个关键参数,用于加密和解密操作。
  • GetPublicExponent() 方法:获取公钥的指数。公钥指数是 RSA 算法中的另一个关键参数,用于加密和验证签名操作。

公钥是用于加密和验证签名的关键信息,通常可以被分享给其他人或实体。然而,私钥仍然应该被妥善保护,因为私钥用于解密和签名,是安全性关键的信息。

**RSAES_OAEP_SHA_Encryptor **

是 Crypto++ 中用于实现 RSA-OAEP(Optimal Asymmetric Encryption Padding)加密的类。RSA-OAEP 是一种非对称加密方案,广泛用于保护信息的机密性。

以下是 RSAES_OAEP_SHA_Encryptor 类的一些关键概述:

  • 功能RSAES_OAEP_SHA_Encryptor 类实现了基于 RSA-OAEP 方案的加密功能。它通过 RSA 公钥对输入数据进行加密,使用 OAEP 进行填充。
  • 构造函数:该类的构造函数接受一个 RSA 公钥作为参数,用于初始化加密器。公钥包含了加密操作所需的关键信息,如模数和指数。
  • 加密操作:通过调用 ProcessBlock 方法执行加密操作。这个方法接受待加密的数据块和一个随机数生成器作为参数,并返回加密后的数据块。
  • 数据填充:RSA-OAEP 使用 Optimal Asymmetric Encryption Padding 进行数据填充。这是一种具有良好安全性属性的填充方案,旨在提供对抗各种攻击,包括选择密文攻击。
  • 安全性:RSA-OAEP 是一种安全的加密方案,提供了对抗许多已知攻击的强大保护。然而,它的安全性仍然依赖于正确的实现和使用。

**RSAES_OAEP_SHA_Decryptor **

是 Crypto++ 中用于实现 RSA-OAEP(Optimal Asymmetric Encryption Padding)解密的类。RSA-OAEP 是一种非对称加密方案,广泛用于保护信息的机密性。

以下是 RSAES_OAEP_SHA_Decryptor 类的一些关键概述:

  • 功能RSAES_OAEP_SHA_Decryptor 类实现了基于 RSA-OAEP 方案的解密功能。它通过 RSA 私钥对输入数据进行解密,使用 OAEP 进行填充。
  • 构造函数:该类的构造函数接受一个 RSA 私钥作为参数,用于初始化解密器。私钥包含了解密操作所需的关键信息,如模数和指数。
  • 解密操作:通过调用 ProcessBlock 方法执行解密操作。这个方法接受待解密的数据块和一个随机数生成器作为参数,并返回解密后的数据块。
  • 数据填充:RSA-OAEP 使用 Optimal Asymmetric Encryption Padding 进行数据填充。这是一种具有良好安全性属性的填充方案,旨在提供对抗各种攻击,包括选择密文攻击。
  • 安全性:RSA-OAEP 是一种安全的解密方案,提供了对抗许多已知攻击的强大保护。然而,它的安全性仍然依赖于正确的实现和使用。
#include <Windows.h>
#include <iostream>#include <rsa.h>
#include <files.h>
#include <osrng.h>
#include <base64.h>
#include <hex.h>
#include <randpool.h>using namespace std;
using namespace CryptoPP;#pragma comment(lib,"cryptlib.lib")// 生成RSA密钥对
void GenerateRSAKeyPair(RSA::PrivateKey& privateKey, RSA::PublicKey& publicKey)
{AutoSeededRandomPool rng;InvertibleRSAFunction parameters;parameters.GenerateRandomWithKeySize(rng, 2048);privateKey = RSA::PrivateKey(parameters);publicKey = RSA::PublicKey(parameters);
}// RSA加密
std::string RSAEncrypt(const RSA::PublicKey& publicKey, const std::string& plainText)
{AutoSeededRandomPool rng;RSAES_OAEP_SHA_Encryptor encryptor(publicKey);std::string cipherText;StringSource(plainText, true,new PK_EncryptorFilter(rng, encryptor,new StringSink(cipherText)));return cipherText;
}// RSA解密
std::string RSADecrypt(const RSA::PrivateKey& privateKey, const std::string& cipherText)
{AutoSeededRandomPool rng;RSAES_OAEP_SHA_Decryptor decryptor(privateKey);std::string recoveredText;StringSource(cipherText, true,new PK_DecryptorFilter(rng, decryptor,new StringSink(recoveredText)));return recoveredText;
}

上述代码中GenerateRSAKeyPair用与临时生成密钥对,RSAEncrypt用于对数据加密,RSADecrypt则用于对数据解密操作,如下所示;

int main(int argc, char* argv[])
{try{RSA::PrivateKey privateKey;RSA::PublicKey publicKey;// 生成RSA密钥对GenerateRSAKeyPair(privateKey, publicKey);// 待加密的文本std::string plainText = "Hello, LyShark !";// RSA加密std::string cipherText = RSAEncrypt(publicKey, plainText);std::cout << "Cipher Text: " << cipherText << std::endl;// RSA解密std::string recoveredText = RSADecrypt(privateKey, cipherText);std::cout << "Recovered Text: " << recoveredText << std::endl;}catch (CryptoPP::Exception& e){std::cerr << "Crypto++ Exception: " << e.what() << std::endl;return 1;}system("pause");return 0;
}

运行效果图如下图所示;

相关文章:

C++ CryptoPP使用RSA加解密

Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目&#xff0c;提供了大量的密码学算法和功能&#xff0c;包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具&#xff0c;以满足软件开发中对…...

从实践角度深入探究数据驱动和关键字驱动测试方法!

数据驱动 数据驱动&#xff0c;指在软件测试领域当中的数据驱动测试&#xff08;Data-Driven Testing&#xff0c;简称DDT&#xff09;是⼀种软件测试⽅法&#xff0c;在不同的数据下重复执⾏相同顺序的测试步骤&#xff0c;测试脚本从数据源读取测试数据&#xff0c;⽽不使⽤…...

Unity收费对谁影响最大

Unity的收费政策对以下几类人群影响最大&#xff1a; 游戏开发商&#xff1a;Unity收费政策中最直接的影响对象就是游戏开发商。对于那些使用Unity引擎制作游戏的开发商来说&#xff0c;他们将需要考虑新的许可证费用和服务费用&#xff0c;这可能会对他们的盈利和发展产生影响…...

信号收尾.

sigaction 信号捕捉 它也是信号捕捉&#xff0c;不仅能处理普通信号还能处理实时信号&#xff0c;但我们不管实时信号 我们发现函数名和形参中结构体名一样都是sigaction&#xff0c;这在c/c中允许吗&#xff1f; 不建议&#xff0c;但是可以 signo你要捕捉几号信号 输入型参…...

maven 常用命令解析

目录 maven 是什么 Maven 目录结构 maven 常用命令解析 mvn clean mvn validate mvn compile mvn test mvn package mvn verify mvn install mvn site mvn deploy maven 是什么 Maven 是一个流行的项目管理和构建工具&#xff0c;用于帮助开发人员管理 Java 项目的…...

ESP32-Web-Server编程-JS 基础 1

ESP32-Web-Server编程-JS 基础 1 概述 前述分别在 HTML 基础 和 CSS 基础 中介绍了 HTML、CSS 的基本内容。HTML 定义了网页中包含哪些对象&#xff0c;CSS 定义了对象的显示样式。JavaScript(LiveScript)是一种运行于客户端的解释性脚本语言&#xff0c;使 HTML 页面更具动态…...

代码随想录算法训练营第23天|● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

108. 将有序数组转换为二叉搜索树 简单 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a; …...

UniApp 中的 u-input 属性讲解

在 UniApp 中&#xff0c;u-input 是一个常用的组件&#xff0c;用于接收用户的输入。它具有多种属性&#xff0c;用于控制输入框的样式和行为。下面我将为您讲解一些常用的 u-input 属性。 基本属性 value&#xff1a;表示输入框的初始值&#xff0c;可以使用 v-model 进行双…...

解决方案:新版WPS-右键粘贴值到可见单元格没有了

WPS筛序后复制&#xff0c;并且粘贴到可见单元格 &#xff08;如果直接粘贴数据会乱掉&#xff09; 旧版WPS&#xff0c;右键就能出现 但是新版WPS不是在这里&#xff08;方法1&#xff09; 新版WPS&#xff08;方法2&#xff09; 视频详细教程链接&#xff1a;解决方案&…...

pat模拟题—7-11 两个序列的中位数

一个长度为n(n⩾1)的升序序列S,处在第2n​个位置的数称为序列S的中位数(median number),例如&#xff0c;序列S1{10,13,14,16,18,19}的中位数是14。两个序列的中位数是它们所有元素的升序序列的中位数&#xff0c;例如&#xff0c;S2{2,4,8,9,20,21},则S1和S2的中位数是13。现有…...

Java中的i++是原子操作吗?

我们都知道i分为三步进行&#xff0c;分别是1:取到当前i的值&#xff0c;2&#xff1a;&#xff0c;3&#xff1a;将最终结果赋值 因此我们可通过创建两个线程&#xff0c;对同一个变量count,一个线程对count进行递增操作&#xff0c;另一个线程对count进行递减操作。每个线程…...

git commit message 书写规范

在使用 Git 提交时&#xff0c;遵循良好的提交消息规范可以提高代码的可读性和可维护性。以下是一些常见的 Git 提交消息书写规范&#xff1a; 提交消息格式&#xff1a;一个提交消息通常包含三个部分&#xff1a;标题、空行和正文。它们之间使用空行分隔。 复制 <标题>&…...

sql 注入 ctf wiki

部分转载ctf-wiki 判闭合形式&#xff1a; 哪个报错就是哪种 1,1’,1’‘,1’,1’&#xff08;双引号带括号&#xff09; 万能密码&#xff1a; admin’ – admin’ # admin’/* ’ or 11– ’ or 11# ’ or 11/* ) or ‘1’1– ) or (‘1’1– 数据库名&#xff1a; SEL…...

Flutter创建TabBar

使用TabBar和TabBarView来创建一个包含"首页"、"分类"和"我的"的TabBar。每个Tab对应一个Tab控件&#xff0c;TabBarView中的每个页面对应一个Widget。 1.Tab使用自定义图标和颜色 一般UI设计的图会带渐变色之类的&#xff0c;应该保持图片的原…...

双流网络论文精读笔记

精读视频&#xff1a;双流网络论文逐段精读【论文精读】_哔哩哔哩_bilibili Two-Stream Convolutional Networks for Action Recognition in Videos 传统的神经网络难以学习到物体的运动信息&#xff0c;双流网络则通过光流将物体运动信息抽取出来再传递给神经网络 给模型提供…...

机器人与3D视觉 Robotics Toolbox Python 一 安装 Robotics Toolbox Python

一 安装python 库 前置条件需要 Python > 3.6&#xff0c;使用pip 安装 pip install roboticstoolbox-python测试安装是否成功 import roboticstoolbox as rtb print(rtb.__version__)输出结果 二 Robotics Toolbox Python样例程序 加载机器人模型 加载由URDF文件定义…...

JS之Object.defineProperty方法

给对象添加属性的方法有许多&#xff0c;这次让我为大家介绍一种给对象添加属性的静态方法吧&#xff01; 语法&#xff1a;Objcet.defineProperty(对象的名称&#xff0c;“添加的键名”&#xff0c;{value&#xff1a;键值}) const obj {name:"张三",age:18}// 我…...

卷积神经网络(CNN)注意力检测

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1.加载数据2. 可视化数据4. 配置数据集 三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估1. Accuracy与Loss图2. …...

4. 权限,特权

对数据段特权检查对直接转移的代码段特权检查栈段的检查调用门的检查 权限问题: 由于CPL,DPL 无法完整表达权限的问题. 例如用户程序(CPL3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL0,此时可以为所欲为.因此加入RPL.此参数由操作系统来保证,CPU仅使用 RPL:…...

云原生系列Go语言篇-泛型Part 2

类型推导和泛型 就像在使用​​:​​时支持类型推导一样&#xff0c;在调用泛型函数时Go同样支持类型推导。可在上面对​​Map​​、​​Filter​​和​​Reduce​​调用中看出。有些场景无法进行类型推导&#xff08;如类型参数仅用作返回值&#xff09;。这时&#xff0c;必…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...

简单聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件总结 根据ICANN规则&#xff0c;域名注册商&#xff08;Verisign&#xff09;认定aliyuncs.com域名下的部分网站被用于非法活动&#xff08;如传播恶意软件&#xff09;&#xff1b;顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…...