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

这篇具有很好参考价值的文章主要介绍了【crypto++使用】使用crypto++库函数运行RSA非对称加密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

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



前言

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修改每次新建源文件或头文件时将自动添加写好的注释内容.

步骤:文章来源地址https://www.toymoban.com/news/detail-679494.html

  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,出现下面这个搜索框
    【crypto++使用】使用crypto++库函数运行RSA非对称加密,密码学,密码学
  2. 输入空格,点击“全部替换”图标。

到了这里,关于【crypto++使用】使用crypto++库函数运行RSA非对称加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 密码学之对称加密体系(2):AES、SM4的 S 盒具体算法的实现

    🔥点击进入【硬件安全】社区,查看更多精彩内容🔥 🔥点击查看《硬件安全》系列文章🔥 📢  声明 : 🥭 作者主页:【摆渡沧桑的CSDN主页】。 ⚠️ 未经作者允许,禁止转载。 ⚠️ 本文为非盈利性质,目的为个人学习记录及知识分享。因能力受限,存在知识点分析不

    2024年02月16日
    浏览(51)
  • AES(对称加密)和RSA(非对称加密)使用详情

          待加密的明文以16字节分组进行加密,如果数据字节长度不是16的倍数,最后的一组则需要在有效数据后面进行填充,使得数据长度变为16字节,AES填充方式分为NoPadding、PKCS5(PKCS7)、ISO10126、Zeros。 NoPadding :不填充,那就只能加密长度为16倍数的数据,一般不使用; Zero

    2024年02月08日
    浏览(97)
  • 【RSA加密/解密】PKCS1_OAEP和PKCS1_v1_5两种填充方案【python RSA密钥对生成、密码加密、密文解密、pycharm安装Crypto】

    一、PKCS1_OAEP和PKCS1_v1_5是公钥加密标准中的两种填充方案。 PKCS1_OAEP(Optimal Asymmetric Encryption Padding)是一种更安全的填充方案,它提供了更好的安全性和抗攻击性。它使用随机数进行填充,并引入了哈希函数来增加安全性。 PKCS1_v1_5是较旧的填充方案,它使用固定的填充字节序

    2024年02月06日
    浏览(61)
  • JS使用RSA非对称加密方式加密传输数据

    场景:出于安全考虑,要求对页面提交的关键信息进行加密,在网络传输过程中使用密文传递,在服务器端解密后使用。这样不管在浏览器端还是网络传输中截获了数据,都无法获取实际的信息。 方法:使用非对称加密算法,在前端页面使用公钥进行加密,在后端服务使用密

    2023年04月08日
    浏览(38)
  • 使用非对称加密(RSA) 实现前端加密后端解密

    数据加密方式有: 单向加密、对称加密、非对称加密、加密盐、散列函数、数字签名。 1、单向加密 单向加密通过对数据进行摘要计算生成密文,密文不可逆推还原。只能加密,不能解密,常用于提取数据的指纹信息以此来验证数据的完整性。但是会引发雪崩效应(雪崩效应

    2024年02月08日
    浏览(69)
  • 密码学概念科普(加密算法、数字签名、散列函数、HMAC)

    密码散列函数 (Cryptographic hash function),是一个单向函数,输入消息,输出摘要。主要特点是: 只能根据消息计算摘要,很难根据摘要反推消息 改变消息,摘要一定会跟着改变 对于不同的消息,计算出的摘要几乎不可能相同 根据散列函数的上述特点,可以应用在保存密码、数

    2024年02月10日
    浏览(55)
  • Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

    1.1、生成RSA公私钥对命令 1.2、公钥 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfNHu9aoeNUTAZH3GCP2CQaSOg XNx0tImsIaCWBEQK3/fvUx8f17hIOtttCMrrTPWefUdcUxLIZ+xzqeU/eISsz9Ym kguImd1+bMkGIYiHBKmF5Uww2jGSU738c+AUuRKpixZP+VPekLY+KbOH7NkE2U/L XGbDeMXeiqQ22UmOSQIDAQAB -----END PUBLIC KEY----- 1.3、私钥 -----BEGIN RSA PRIVATE KEY--

    2024年02月03日
    浏览(43)
  • CRYPTO 密码学-笔记

            替换法的加密方式:一种是单表替换,另一种是多表替换         单表替换:原文和密文使用同一张表         abcde---》sfdgh         多表替换:有多涨表,原文和密文进行对比         表单1:abcde---》sfdgh  表单2:abcde---》chfhk   表单3:abcde---》jftou        原文

    2024年02月12日
    浏览(39)
  • CTF CRYPTO 密码学-4

    描述:oss先生将三个培根的中间一只移到了左边,然后咬了一小口最后一根,说真好吃,真是个奇怪的先生! 密文:VlM5WnlXc0ZibEhmMmE1ZHYxMDlhVkdmMlk5WmtRPT0= 分析 应该是根据题目提示解出压缩包的密码,查看flag。 第一次: 第二次: 分析 发现第二次解密失败,查看题目描述。三只培

    2024年01月19日
    浏览(53)
  • CTF CRYPTO 密码学-3

    题目给出一个pyc后缀的文件,需要使用uncompyle6模块去还原成py文件 uncompyle6 是一个 Python 反编译器,它能够将 Python 字节码(.pyc 文件)转换回源代码(.py 文件)。 注意 版本问题 uncompyle6默认只支持3.8及以下版本 如何修改?(我这里是python3.11.3) Python311Libsite-packagesuncompy

    2024年01月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包