本文介绍使用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;

Crypto++库实现AES和RSA加密解密相关推荐

  1. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现

    今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...

  2. Crypto++安装和简单使用RSA加密解密

    Crypto++安装和简单使用 一.前言 二.下载 三.安装 四.使用 五.RSA加密/解密 (一)生成密钥/公钥 (二)OAEP加密/解密 六.RSA加密/解密的源码 一.前言 能搜索这个的估计都知 ...

  3. AES和RSA加密解密(前后台交互)

    一.AES和RSA简单介绍 AES:对称加解密,加密解密使用同一个秘钥. RSA:非对称加解密,使用公钥加密数据,只有对应的私钥才能解密,加密方和解密方各自保存秘钥对中的一个.(这里推荐一个RSA密钥 ...

  4. [crypto]-53-openssl命令行的使用(aes/rsa签名校验/rsa加密解密/hmac)

    常用技巧 如何编写一个二进制规律性的文件, 比如你可以编写一个"0123456789abcdef"的文本文件,记得删除换行符然后用ultraedit打开,ctrl+H就可以看到二进 ...

  5. 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】

    JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...

  6. MacOS下使用C语言基于openssl库进行RSA加密解密

    MacOS下使用C语言基于openssl库进行RSA加密解密 1 安装openssl并生成密钥 首先当然要安装openssl(这里记得看一下安装路径,应该是/usr/local/Cellar/open ...

  7. python下RSA加密解密以及跨平台问题

    项目合作需要,和其他网站通信,消息内容采用RSA加密方式传递.之前没有接触过RSA,于是两个问题出现了: 声明: 环境WIN 7 + python 2.6.6 RSA格式:PEM 一.Python下R ...

  8. Android RSA加密解密的 工具类的使用

    RSA 比较特殊,我们首先要生成私钥和公钥,然后在加密的时候,使用私钥加密,在解密的时候使用公钥解密. //RSA 的初始化,获得私钥和密钥public void rsaInit(){try {Key ...

  9. 使用Crypto++5.5.2完成RSA加解密,真正的把公钥放在字符串内,而不是放在文件内

    本文摘自 小楼一夜听春雨得博客: http://hi.baidu.com/magic475/blog/item/e8b82139020ae622b8998f96.html 使用Crypto++5.5. ...

最新文章

  1. 找不到php的版本,php – 在任何版本中都找不到请求的包…
  2. 获取macos mojave_高仿MacOS教程
  3. Oracle P6培训系列:03设置用户设置
  4. 缅柬泰之色---彩图大串联 一 (缅甸篇)
  5. 踩坑之路---JWT验证
  6. jqGrid实现冻结行和冻结列
  7. 计算机消极影响英语作文,大学英语作文:电脑游戏的危害
  8. svn取消文件夹图标_TortoiseSVN文件夹及文件图标不显示解决方案
  9. 开题报告(1.研究目标)
  10. linux删除除非某某文件,find命令查找比某个文件新或...-linux下删除某一时间段的文件-scp命令在两台服务器直接进行文件传输的方法_169IT.COM...
  11. XSell和Xftp的简单使用方法
  12. BCS2022|“体系化防御,数字化运营” 奇安信终端安全能力再升级
  13. 基于Python实现的实时聊天系统
  14. BIOS中断大全(表格)
  15. 微信小程序:去掉button默认样式
  16. Jackson 自定义序列化和反序列化
  17. 金色传说:SAP-ABAP-SELECT * FORM 内表语法
  18. 解决Excel 2016无法直接打开文件的问题
  19. vue打包上线部分css效果错乱,解决Vue打包上线之后部分CSS不生效的问题
  20. Arctic教程(二)—— AUTOSAR应用程序设计入门

热门文章

  1. (机器学习)随机森林填补缺失值的思路和代码逐行详解
  2. (转)连续信号(八)| 傅里叶变换的性质 | 积分、微分特性 + 时域、频域卷积 + 帕斯瓦尔
  3. 【监控】Prometheus(普罗米修斯)监控概述
  4. SAP中供应商清单输出方法
  5. SQL 全文检索应用
  6. CUDA10.2+cuDNN8+tensorflow-gpu2.3.1安装
  7. APEX包管理器简述(二)
  8. 09. 路由器单臂路由配置
  9. 堆和栈的理解 堆和栈的区别 什么是堆和栈 堆是什么 栈是什么
  10. ai直线怎么变折线_用Illustrator制作简单的折线图