【crypto++使用】使用crypto++库函数运行RSA非对称加密

news2024/11/26 10:27:14

系列文章目录

1.(全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp


文章目录

  • 系列文章目录
  • 前言
  • 一、RSA加密过程、步骤
      • 可学习的网址
  • 二、代码部分
    • 1.visual studio编程注意
        • 一个标准案例提供给大家
    • 2.RSA密钥生成
      • 思考:
    • 3.关于RSA的五个基本函数
      • 完整代码如下:
  • VS 使用技巧总结
    • 1. VS修改每次新建源文件或头文件时将自动添加写好的注释内容.
    • 2. 一次性修改所有相关命令


前言

crypto++是一个开源密码学函数库,里面含有很多加密函数的库供大家引用,在官网中也能看到许多代码示范样例。
本文将记录如何使用开发环境:visual studio,引用crypto++的库编写RSA加密的代码。


一、RSA加密过程、步骤

RSA的安全性依赖于大数分解,由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。多用于数字签名。下面是数字签名的步骤:

  • 待发送消息(message)利用Hash函数,生成信息的摘要
  • 私钥加密摘要,生成”数字签名”(signature)
  • 发送message+signature
  • 公钥解密签名
  • message重新生成摘要,与发送过来的摘要进行比较

公钥和私钥:公钥和私钥是成对的,它们互相解密。

  1. 加密:公钥加密,私钥解密。
  2. 数字签名:私钥数字签名,公钥验证。

可学习的网址

RSA原理:这个网址讲得详细,可参考学习
crypto++官网中RSA的相关代码:RSA Cryptography
这个博主写的代码很详细:RSA封装代码学习

二、代码部分

1.visual studio编程注意

在visual studio中,仅支持一个main函数,所以使用多个完整的cpp结构编写源代码将无法正确运行。
正确做法:封装。编写一个主函数main。cpp,使用多个头文件xxx.h编写头文件和函数声明部分,使用多个xxx.cpp编写函数定义部分,在main.cpp中集中调用。

一个标准案例提供给大家

如何在VisualStdio中运行一个包含多个源文件的程序

2.RSA密钥生成

void GenerateKeys(AutoSeededRandomPool rng, InvertibleRSAFunction parameters) {
	
	parameters.GenerateRandomWithKeySize(rng, 1024);

	RSA::PrivateKey privateKey(parameters);
	RSA::PublicKey publicKey(parameters);
}

思考:

此处使用void作为函数返回值是不对的,因为我们要产生一对公私钥密钥对。所以我们应该使用什么来接收结果(公钥,私钥)?

需要构造结构体!

struct key
{
	RSA::PrivateKey private_key;
	RSA::PublicKey public_key;
};

MyRSA.h

struct key
{
	RSA::PrivateKey private_key;
	RSA::PublicKey public_key;
};

key generate_key(unsigned int key_size = 2048);

RSA.cpp

#include "MyRSA.h"

/**
 * \brief 生成密钥对
 * \param key_size
 * \return
 */
key generate_key(const unsigned int key_size)	//钥匙的长度,通常是2048以上,越大相对越安全,但相对的运算越久
{
	AutoSeededRandomPool rng;	//伪随机数
	InvertibleRSAFunction params;
	params.GenerateRandomWithKeySize(rng, key_size);
	key keys;
	keys.private_key = params;
	keys.public_key = params;	//根据这个参数产生配对的公钥、密钥并返回这个集合

	return keys;
}

3.关于RSA的五个基本函数

  • 生成密钥对
  • 加密
  • 解密
  • 私钥签名
  • 公钥验证签名

完整代码如下:

initializeCrypto.h

/*
 *
 *  Created on: 2023-8-28
 *      Author: Chen Jingyan
 */

#include "cryptlib.h"
using namespace CryptoPP;


MyRSA.h

#ifndef CRYPTO_RSA_H
#define CRYPTO_RSA_H

#include"initializeCrypto.h"
#include "pssr.h"
#include "rsa.h"
#include "osrng.h"

struct key
{
	RSA::PrivateKey private_key;
	RSA::PublicKey public_key;
};

key generate_key(unsigned int key_size = 2048);

bool rsa_encrypt(const std::string& plain, RSA::PublicKey& public_key, std::string& cipher);

bool rsa_decrypt(const std::string& cipher, RSA::PrivateKey& private_key, std::string& recovered);

bool rsa_signature(const std::string& plain, RSA::PrivateKey& private_key, std::string& signature);

bool rsa_verify(const std::string& cipher_sign, RSA::PublicKey& public_key, std::string& recovered);

#endif

RSA.CPP

#include "MyRSA.h"

/**
 * \brief 生成密钥对
 * \param key_size
 * \return
 */
key generate_key(const unsigned int key_size)	//钥匙的长度,通常是2048以上,越大相对越安全,但相对的运算越久
{
	AutoSeededRandomPool rng;	//伪随机数
	InvertibleRSAFunction params;
	params.GenerateRandomWithKeySize(rng, key_size);
	key keys;
	keys.private_key = params;
	keys.public_key = params;	//根据这个参数产生配对的公钥、密钥并返回这个集合

	return keys;
}

/**
 * \brief RSA加密(OAEP方案) 最佳非对称加密填充(OAEP)
 * \param plain 待加密原文
 * \param public_key 公钥
 * \param cipher 密文
 * \return 加密成功或失败
 */
bool rsa_encrypt(const std::string& plain,  RSA::PublicKey& public_key, std::string& cipher)
{
	try
	{
		 AutoSeededRandomPool rng;
		const  RSAES_OAEP_SHA_Encryptor encrypt(public_key);
		 StringSource ss_1(plain, true, new  PK_EncryptorFilter(rng, encrypt, new  StringSink(cipher)));
	}
	catch (...)
	{
		return false;
	}

	return true;
}

/**
 * \brief RSA解密(OAEP方案)
 * \param cipher 密文
 * \param private_key 密钥
 * \param recovered 恢复的原文
 * \return 恢复成功或失败
 */
bool rsa_decrypt(const std::string& cipher,  RSA::PrivateKey& private_key, std::string& recovered)
{
	try
	{
		 AutoSeededRandomPool rng;
		const RSAES_OAEP_SHA_Decryptor decrypt(private_key);
		 StringSource ss_2(cipher, true, new  PK_DecryptorFilter(rng, decrypt, new  StringSink(recovered)));
	}
	catch (...)
	{
		return false;
	}
	return true;
}

/**
 * \brief:签名
 * \param plain
 * \param private_key
 * \param signature
 * \return
 */
bool rsa_signature(const std::string& plain,  RSA::PrivateKey& private_key, std::string& signature)
{
	try
	{
		 AutoSeededRandomPool rng;
		const  RSASS< PSS,  SHA256>::Signer signer(private_key);
		 StringSource ss_1(plain, true, new  SignerFilter(rng, signer, new  StringSink(signature)));
	}
	catch (...)
	{
		return false;
	}
	return true;
}

/**
 * \brief:公钥验证签名
 * \param cipher_sign
 * \param public_key
 * \param recovered
 * \return true/faluse
 */
bool rsa_verify(const std::string& cipher_sign,  RSA::PublicKey& public_key, std::string& recovered)
{
	try
	{
		const  RSASS< PSS,  SHA256>::Verifier verifier(public_key);
		 StringSource ss_2(cipher_sign, true,
			new  SignatureVerificationFilter(verifier,
				new  StringSink(recovered),  SignatureVerificationFilter::THROW_EXCEPTION |  SignatureVerificationFilter::PUT_MESSAGE));
	}
	catch (...)
	{
		return false;
	}
	return true;
}



main.cpp

#include "timeSpan.h"
#include"MyRsa.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
/*RSA加密*/
	
	key keys = generate_key();

	const string plain = "HelloWorld";
	string cipher, recovered;

	if (rsa_encrypt(plain, keys.public_key, cipher))
	{
		if (rsa_decrypt(cipher, keys.private_key, recovered))
		{
			cout << "Cipher: " << endl;
			for (const auto& x : cipher)
			{
				cout
					<< setfill('0')
					<< setw(2)
					<< setiosflags(ios::uppercase)
					<< hex << static_cast<unsigned int>(static_cast<unsigned char>(x))
					<< " ";
			}
			cout << "Recovered message: " << recovered << endl;
		}
	}
return 0}

VS 使用技巧总结

1. VS修改每次新建源文件或头文件时将自动添加写好的注释内容.

步骤:

  1. 根据下面地址找到文件newc++file.cpp
    D:\visual studio\Common7\IDE\VC\VCProjectItems\newc++file.cpp
  2. 将其复制到桌面,然后用记事本方式打开;
  3. 修改注释内容,下面给一个例子:
/*
 *  file name:
 *
 *  Created on: 2023--
 *      Author: 宇宙修理员
 */
  1. 保存后,将桌面文件复制回去步骤1的地址中,将原来文件覆盖。

2. 一次性修改所有相关命令

  1. 选定要修改的命令,ctrl+H,出现下面这个搜索框
    在这里插入图片描述
  2. 输入空格,点击“全部替换”图标。

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

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

相关文章

计算机视觉-卷积神经网络

目录 计算机视觉的发展历程 卷积神经网络 卷积&#xff08;Convolution&#xff09; 卷积计算 感受野&#xff08;Receptive Field&#xff09; 步幅&#xff08;stride&#xff09; 感受野&#xff08;Receptive Field&#xff09; 多输入通道、多输出通道和批量操作 …

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种&#xff0c;直连交换机、广播交换机、主题交换机&#xff1b; 直连交换机中队列与交换机需要约定好routingKey去进行绑定&#xff1b; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可&#xff1b; 主题交换机最大的特…

dml dql 约束 数据库设计

dml 1.添加数据 *语法 &#xff1a; *insert into 表名&#xff08;列名1&#xff0c;列名2&#xff0c;……..列名n&#xff09;values(值1&#xff0c;值2&#xff0c;…值n) *注意&#xff1a; 1.列名和值要一一对应 2.如果表名后&#xff0c;不写列名&#xff0c;就要给…

QT 获取程序编译时间并且转化格式

前言 有的时候我们要在程序的关于界面加上程序的编译时间等信息。可以通过如下代码实现 QString buildTime QStringLiteral("%1 %2").arg(__DATE__).arg(__TIME__);ui->label->setText(buildTime);QDateTime dateTime QLocale("en_US").toDateTim…

easyx图形库6:实现飞机大战:

飞机大战 一.飞机大战的基本窗体&#xff1a;二.飞机大战的主要战斗场景元素&#xff1a;一.透明图片&#xff1a;二.精灵对象&#xff1a; 三.主游戏场景的元素&#xff1a;1.英雄飞机的结构体定义&#xff1a;2.英雄飞机的代码实现&#xff1a;3.游戏背景的结构体定义&#x…

Day5:react函数组件与类组件

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 「主要面向群体&#xff1a;」前端开发工程师&#xff08;初、中、高级&#xff09;、应届、转行、培训、自学等同学 Day4-今日话题 react「函数组件和类组件」的区别&…

查局域网所有占用IP

查局域网所有占用IP 按&#xff1a;winr 出现下面界面&#xff0c;在文本框中输入 cmd 按确定即可出现cmd命令界面 在cmd命令窗口输入你想要ping的网段&#xff0c;下面192.168.20.%i即为你想要ping的网段&#xff0c;%i代表0-255 for /L %i IN (1,1,254) DO ping -w 1 -n 1…

(动态规划) 剑指 Offer 49. 丑数 ——【Leetcode每日一题】

❓剑指 Offer 49. 丑数 难度&#xff1a;中等 我们把只包含质因子 2、3 和 5 的数称作丑数&#xff08;Ugly Number&#xff09;。求按从小到大的顺序的第 n 个丑数。 示例: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明: 1 是丑数。…

2024年新iPad Pro将实现6年来最大的升级

彭博社的Mark Gurman长期以来一直将iPad Pro的下一次重大更新定在2024年&#xff0c;在最新一期的Power On时事通讯中&#xff0c;他详细阐述了一些细节&#xff0c;这些细节将使其成为“自2018年以来该产品的首次重大更新” 尽管Gurman将最近的iPad升级描述为“最近特别小”&…

word6 图文混排

目录 7-1 段落缩进排版7-2 搞定多级列表难题 7-1 段落缩进排版 段落对齐 缩进问题 悬挂缩进&#xff1a;缩进首行以外的段落 段落对齐&#xff1a; 7-2 搞定多级列表难题

k8s 安装 kubernetes安装教程 虚拟机安装k8s centos7安装k8s kuberadmin安装k8s k8s工具安装 k8s安装前配置参数

k8s采用master, node1, node2 。三台虚拟机安装的一主两从&#xff0c;机器已提前安装好docker。下面是机器配置&#xff0c;k8s安装过程&#xff0c;以及出现的问题与解决方法 虚拟机全部采用静态ip, master 30机器, node1 31机器, node2 32机器 机器ip 192.168.164.30 # ma…

【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)

​&#x1f47b;内容专栏&#xff1a; 《数据结构与算法篇》 &#x1f428;本文概括&#xff1a; 利用数据结构栈(Stack)来模拟递归&#xff0c;实现快排的非递归版本&#xff1b;递归版本测试OJ题时&#xff0c;有大量重复元素样例不能通过&#xff0c;导致性能下降&#xff0…

Self-Supervised Learning

Self-Supervised Learning Bert 的数据是 340M parameters 抽象解释&#x1f446; Bert 单个字的预测 把一个字盖住&#xff1a; 1、把一个字替换成特殊字符(MASK)。 2、替换成随机的一个字,进行训练。 next sentence prediction 通过变换两个连起来的句子的顺序&#x…

C. Battle 2023 (ICPC) Jiangxi Provincial Contest -- Official Contest

Problem - C - Codeforces 题目大意&#xff1a;有n堆石子&#xff0c;给出一个数p&#xff0c;A先B后&#xff0c;每个人每次只能取p的幂个石子&#xff08;包括1&#xff09;问A能不能赢 1<n<3e5;1<p<1e18 思路&#xff1a;先递归算出sg函数看看&#xff0c;s…

detour编译问题及导入visual studio

Detours是经过微软认证的一个开源Hook库&#xff0c;Detours在GitHub上&#xff0c;网址为 https://github.com/Microsoft/Detours 注意版本不一样的话也是会出问题的&#xff0c;因为我之前是vs2022的所以之前的detours.lib不能使用&#xff0c;必须用对应版本的x64 Native To…

线性代数的艺术

推荐一本日本网友Kenji Hiranabe写的《线性代数的艺术》。这本书是基于MIT大牛Gilbert Strang教授的《每个人的线性代数》制作的。 虽然《线性代数的艺术》这本书仅仅只有12页的内容&#xff0c;就把线性代数的重点全画完了&#xff0c;清晰明了。 《线性代数的艺术》PDF版本&…

C语言:指针类型的意义

1.指针的类型决定了解引用时访问几个字节 2.指针的类型决定了指针1、-1跳过几个字节 一、指针的类型决定指针解引用时访问几个字节 例如 int 型指针解引用时访问4个字节 char 型指针解引用时访问1个字节 详解代码如下&#xff1a; int b 0x11223344&#xff08;十六进制&…

通过这 5 项 ChatGPT 创新增强您的见解

为什么绝大多数的人还不会使用chatGPT来提高工作效能&#xff1f;根本原因就在还不会循序渐进的发问与chatGPT互动。本文总结了5个独特的chatGPT提示&#xff0c;可以帮助您更好地与Chat GPT进行交流&#xff0c;以获得更清晰的信息、额外的信息和见解。 澄清假设和限制 用5种提…

2023-8-28 n-皇后问题

题目链接&#xff1a;n-皇后问题 第一种搜索顺序 #include <iostream>using namespace std;const int N 20;int n; char g[N][N]; bool row[N], col[N], dg[N], udg[N];void dfs(int x, int y, int s) {if(y n) y 0, x ;if(x n){if(s n){for(int i 0; i < n;…

水源井监控系统整体解决方案

1.1、系统组成水源井远程监控系统主要由监控中心、通信平台、水源井测控终端、现场启动柜设备组成。系统整体结构按功能可划分为采集层、网络层和应用层等三层&#xff0c;水源井测控终端主要实现采集层的功能&#xff0c;数据传输链路主要实现网络层的功能&#xff0c;中心端管…