首页 > 其他分享 >Crypto++库实现AES和RSA加密解密

Crypto++库实现AES和RSA加密解密

时间:2023-09-07 14:56:00浏览次数:38  
标签:AES const ++ Crypto char new pubkey 加密

本文介绍使用Crypto++进行AES加密和RSA加密

Crypto++库在VS中配置方法

Crypto++库下载地址:
https://www.cryptopp.com/,
目前已经更新到8.1版本。本文使用的是8.1版本的Crypto++。

下载压缩包后解压,然后用vs中编译cryptopp。生成debug和Realease版本的cryptlib.lib静态库。在使用时只要包含相应功能的头文件。

#include "D:\cryptopp810\randpool.h"
#include "D:\cryptopp810\rsa.h"
#include "D:\cryptopp810\hex.h"
#include "D:\cryptopp810\files.h"
#include "D:\cryptopp810\osrng.h"
#include "D:\cryptopp810\base64.h"
using namespace CryptoPP;

和引入lib包

#pragma comment(lib, "cryptlib.lib")

AES加密

AES加密算法是对称秘钥加密中最流行的算法之一。加密的区块长度是16个字节。

//变量准备
unsigned char aesKey[AES::DEFAULT_KEYLENGTH]; //密钥
unsigned char inBlock[AES::BLOCKSIZE] = "ABCDEF"; //要加密的数据块,小于16字节
unsigned char outBlock[AES::BLOCKSIZE]; //加密后的密文块
unsigned char xorBlock[AES::BLOCKSIZE]; //必须设定为全零
memset(xorBlock, 0, AES::BLOCKSIZE); //置零

//随机生成key
AutoSeededRandomPool rnd;
SecByteBlock key(0x00, AES::DEFAULT_KEYLENGTH);
rnd.GenerateBlock(key, key.size());

//加密
AESEncryption aesEncryptor; 
aesEncryptor.SetKey(key, AES::DEFAULT_KEYLENGTH); 
aesEncryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock);


//解密
AESDecryption aesDecryptor;
unsigned char plainText[AES::BLOCKSIZE];
aesDecryptor.SetKey(key, AES::DEFAULT_KEYLENGTH);
aesDecryptor.ProcessAndXorBlock(outBlock, xorBlock, plainText);

 //打印解密结果
for (int i = 0; i<16; i++)
{
	cout << plainText[i];
}
cout << endl;

RSA加密

RSA加密算法是一种非对称加密算法,是第一个既能用于数据加密也能用于数字签名的算法可用于加密
和签名。该算法需要一对秘钥,即私钥和公钥。其中
私钥由用户保存,不对外公开,公钥公开发布。使用公钥加密的信息,可以使用私钥解密。使用私钥签名的
数据,可以使用公钥验证。

秘钥生成

//根据长度生成公钥和私钥,并分别保存到pubFilename文件和privFilename文件
void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename)
{
	AutoSeededRandomPool rng;
	InvertibleRSAFunction privkey;
	privkey.GenerateRandomWithKeySize(rng, keyLength);

	Base64Encoder privkeysink(new FileSink(privFilename));  //"privkey.txt"
	privkey.DEREncode(privkeysink);
	privkeysink.MessageEnd();

	RSAFunction pubkey(privkey);
	Base64Encoder pubkeysink(new FileSink(pubFilename));  //"pubkey.txt"
	pubkey.DEREncode(pubkeysink);
	pubkeysink.MessageEnd();
}

信息加密(从文件读取公钥)

//把字符串plain中的内容用pubFilename文件中的公钥加密数据并保存到encryptedFilename中。
void Encrypt(const string &plain, const char *pubFilename, const char *encryptedFilename)
{
	RSAES_OAEP_SHA_Encryptor pubkey(FileSource(pubFilename, true, new Base64Decoder));

	SecByteBlock sbbCipherText(pubkey.CiphertextLength(plain.size()));
	//sbbCipherText.begin();
	AutoSeededRandomPool rng;
	pubkey.Encrypt(
		rng,
		(byte const*)plain.data(),
		plain.size(),
		sbbCipherText.begin());

	FileSink(encryptedFilename).Put(sbbCipherText.begin(), sbbCipherText.size());
}

信息加密(公钥写到代码中)

void Encrypt2(const string &plain,const char *encryptedFilename)
{
	//RSAES_OAEP_SHA_Encryptor pubkey(FileSource(pubFilename, true, new Base64Decoder));
	string pub = "MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC1f+WV5dAiVb2w1lgf21Wz84Uuou1TwCJ+\
		ivxcpijobsHQLOLMakYSyRonH6SQJtL5CHXycBubA9sS7F2nVG2fMn6z9Ev11nu7J4IPPF9u\
		v / ZqwAIlXwxVPsl4K69rWmdP4i5ezj++I7nC + kX6qjxpcyhnQalKAl2OC8AMNEo0awIBEQ == ";
	RSAES_OAEP_SHA_Encryptor pubkey(StringSource(pub, true, new Base64Decoder));

	SecByteBlock sbbCipherText(pubkey.CiphertextLength(plain.size()));
	//sbbCipherText.begin();
	AutoSeededRandomPool rng;
	pubkey.Encrypt(
		rng,
		(byte const*)plain.data(),
		plain.size(),
		sbbCipherText.begin());

	FileSink(encryptedFilename).Put(sbbCipherText.begin(), sbbCipherText.size());
}

用私钥解密(从文件读取私钥)

//用privFilename文件中的私钥解密encryptedFilename文件中的加密内容,并返回解密内容。
string Decrypt(const char *privFilename, const char *encryptedFilename)
{
	string strContents, recovered;
	FileSource(encryptedFilename, true, new StringSink(strContents));
	AutoSeededRandomPool rng;
	RSAES_OAEP_SHA_Decryptor privkey(FileSource(privFilename, true, new Base64Decoder));
	StringSource(strContents, true, new PK_DecryptorFilter(rng, privkey, new StringSink(recovered)));
	return recovered;
}

 

用私钥解密(私钥写到代码中)

string Decrypt2(const char *encryptedFilename)
{
	string pri = "MIICdAIBADANBgkqhkiG9w0BAQEFAASCAl4wggJaAgEAAoGBALV/5ZXl0CJVvbDWWB/bVbPz\
		hS6i7VPAIn6K / FymKOhuwdAs4sxqRhLJGicfpJAm0vkIdfJwG5sD2xLsXadUbZ8yfrP0S / XW\
		e7sngg88X26 / 9mrAAiVfDFU + yXgrr2taZ0 / iLl7OP74jucL6RfqqPGlzKGdBqUoCXY4LwAw0\
		SjRrAgERAoGAJV4YreuMu8ZbwoZ7jhaRpQx9TV3HcyAHGg2OT09ixnEn5xhMz7uG5b / 92uDe\
		Ha2j5 / o2Zp6cRY / aR6kiVyf4cz / 3FHUW0sGpLRPuE0YePQFg / +z88iNyafOsNXC7XrOUlbP2\
		hK9cNbk / 43L0NXj3cSXPndzI7CP45gB7xl8KB2kCQQC9mFlx7VFYK3fYBrPpsOdwze604m7L\
		v9jRRIDIEGtQKUHwLx0PYOxQnolOliQtALuDsK66dxOsroAWc13 + UlEJAkEA9RGuAIISiIhD\
		yhuP / huoI + Og + cDVVNeeYECGG36hxpDtrHZ0IfpfKsBWoekb6InRgPUC6RkpFKz58vN8 + qKa\
		0wJALJxRR / uaq1WFnD3P + sA2dOUpG4CSiktCEx8tXEAZQAm1KXR / TumhA + kRP6rbVeIOAN5H\
		Ou7Xc + zS2BslLMgTEQJBAMnSUw96LWFhKMSPK0m8bFnKhJFxoKA5GQP45ul3WAzv0spDbrKR\
		9AUW3e6 / +N2erIhRTbDniz40GSJuKrBJrK0CQH/hg5LLpMx80oX6JUfQFfYYZ7FkgBwfEh8v\
		iUmE + zgondETTnULzWU9JxoQxrkRfg0qu9NcTPZQ5oqv+VnUKH4=";
	string strContents, recovered;
	FileSource(encryptedFilename, true, new StringSink(strContents));
	AutoSeededRandomPool rng;
	RSAES_OAEP_SHA_Decryptor privkey(StringSource(pri, true, new Base64Decoder));
	StringSource(strContents, true, new PK_DecryptorFilter(rng, privkey, new StringSink(recovered)));
	return recovered;
}

用私钥签名信息

void sign(const char *privFilename, const char *tobesignedFilename, const char *signedFilename)
{
	RSASSA_PKCS1v15_SHA_Signer privkey(FileSource(privFilename, true, new Base64Decoder));
	AutoSeededRandomPool rng;
	FileSource(tobesignedFilename, true, new SignerFilter(rng, privkey, new HexEncoder(new FileSink(signedFilename))));
}

用公钥验证

void ver(const char *pubFilename, const char *tobesignedFilename, const char *signedFilename)
{
	RSASSA_PKCS1v15_SHA_Verifier pubkey(FileSource(pubFilename, true, new Base64Decoder));

	AutoSeededRandomPool rng;
	FileSource signatureFile(signedFilename, true, new HexDecoder);

	if (signatureFile.MaxRetrievable() != pubkey.SignatureLength())
	{
		printf("\nNO\n");
		return;
	}
	SecByteBlock signature(pubkey.SignatureLength());
	signatureFile.Get(signature, signature.size());

	SignatureVerificationFilter *verifierFilter = new SignatureVerificationFilter(pubkey);
	verifierFilter->Put(signature, pubkey.SignatureLength());
	FileSource(tobesignedFilename, true, verifierFilter);
	printf("\n%d\n", verifierFilter->GetLastResult());
}

使用方法

	char priKeyFile[128] = { 0 };
	char pubKeyFile[128] = { 0 };
	char encryptedFile[128] = { 0 };

	strcpy(priKeyFile, "privkey.txt");  // 私钥文件名
	strcpy(pubKeyFile, "pubkey.txt");  // 公钥文件名
	strcpy(encryptedFile, "encrypted.dat");

	//生成RSA公钥和私钥
	GenerateRSAKey(1024, priKeyFile, pubKeyFile);

	string str = "123ADS 123ADS 123ADS 123ADS";

	Encrypt(str, pubKeyFile, encryptedFile);
	string re = Decrypt(priKeyFile, encryptedFile);
    cout << re << endl;
 

标签:AES,const,++,Crypto,char,new,pubkey,加密
From: https://www.cnblogs.com/lidabo/p/17684916.html

相关文章

  • Uchardet C++源码编译步骤 文本编码检测命令行工具 Command line
    从官网 https://www.freedesktop.org/wiki/Software/uchardet/下载源码 https://www.freedesktop.org/software/uchardet/releases/=====================================================================================下载编译工具:Cmake和mingw64https://cmake.org......
  • cv2.error: Unknown C++ exception from OpenCV code.报错解决
    问题原因:opencv版本太高,python版本太低解决办法:打开opencv下载网站找到自己的python版本对应的opencv的版本,然后通过下面代码安装pipinstallopencv-python==4.1.2.30-ihttps://pypi.tuna.tsinghua.edu.cn/simple ......
  • 一些C++库的简要说明
    说明:1.**Boost**:提供了许多C++库,如Boost.Asio(网络和异步I/O)、Boost.Filesystem(文件系统操作)、Boost.Thread(多线程支持)、Boost.Serialization(序列化)等。用于增强C++的功能。2.**cpp2sky**:用于与SkyWalkingAPM系统集成的库,提供应用程序性能监视和分析功能。3.**cppzmq**:C++Z......
  • C++学习笔记
    ++--自增自减运算符1++ 赋值运算符,;运算符选择语句if----elseif(表达式1){代码块;//表达式1为真执行该代码块}elseif(表达式2){代码块;//表达式2为真执行该代码块的内容}else{代码块;//以上的表达式都不满足执行该代码块的内容}switch多分支语句#include<st......
  • C++语言学习10
    一、deque双端队列容器#include是下标顺序容器,它允许在首尾两端快速的插入、删除数据deque的元素不是全部相邻存储的:采用单独分配的固定大小数组的序列存储数据,以及额外的登记表(中控数组),该表中记录了所有序列的地址,这表示通过下标访问元素时必须经过两次指针解引用,vect......
  • C++的向上转型
    在C/C++中经常会发生数据类型的转换,例如将int类型的数据赋值给float类型的变量时,编译器会先把int类型的数据转换为float类型再赋值;反过来,float类型的数据在经过类型转换后也可以赋值给int类型的变量。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:inta=......
  • C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛
    AcWing第2场周赛竞赛-AcWing3626三元一次方程AcWing3626.三元一次方程-AcWing两层循环#include<iostream>usingnamespacestd;voidfind(intn){for(intx=0;x<=1000/3;x++){for(inty=0;y<=1000/5;y++){int......
  • C++运算符优先级
    所有(可能)运算符共分为18级。第1级运算符含义::作用域解析运算符第2级运算符含义()函数调用()值构造,即type(expr)[]数组下标->间接成员运算符.直接成员运算符const_cast专用的类型转换dynamic_cast专用的类型转换re......
  • c++中输出浮点数
    flata=1;flatb=3;cout<<a<endl;cout<<showpoint<<b<endl;ANSI C++里一个浮点型若是小数部分为0,直接输出必然是不带小数点的,例如floatb=3;你若想输出3.0,输出代码要这样写:cout << showpoint << a;......
  • C++中的虚函数重载
    在一次修改代码过程中踩的坑,下来研究了一下,发现C++中虚函数重载后会产生很多有意思的情况,在这里总结了一下。C++中有重载(overload)和重写(override)以及重定义这几个概念,1overload:指的是相同作用域中的两个函数的函数名相同,但参数列表的个数、顺序、类型不同。而override指的是子类......