Crypto++库在VS 2005中的使用——RSA加解密
Crypto++库在VS 2005中的使用——RSA加解密
源代码:下载
一. 下载Crypto++ Library
Crypto++ Library的官方网:http://www.cryptopp.com/
二. 建立自己使用的Crypto++ Library
由于从官方网下载的Crypto++库是开源的,只有源文件和几个可以生成lib、dll的工程,以及一个使用的例子工程,因此希望生成自己建的工程能使用的SDK。
1. 编译链接生成cryptlib.lib
打开cryptest.sln,分别在Debug模式和Release模式下编译链接cryptlib工程,成功后会在cryptopp54/Win32/output/debug和cryptopp54/Win32/output/release下生成cryptlib.lib文件。作者当时用的是Crypto++ 5.4版本。
Build时方法是,右击Solution Explorer中的cryptlib工程,单击build。第一次时它会报错说“d:/cryptopp54/adler32.cpp(3) : fatal error C1033: cannot open program database 'd:/cryptopp54/win32/cryptlib/debug/vc80.idb'”,没关系,按这样再build一次,就可以build成功了。
2. 建立Crypto++ SDK
在C:/Program Files/中新建文件夹,取名“CryptoPP”,里面新建文件夹“include”、“lib”,在“lib”中新建文件夹“debug”、“release”。将Crypto++库中的所有头文件复制到“include”文件夹中,再将上面生成的两个cryptlib.lib分别复制到“debug”和“release”中。
三. RSA加解密
1.
在VS 2005中新建Win32 Console Application工程,建立空的工程。完成后新建文件main.cpp,里面源码如下:
#include "randpool.h"
#include "rsa.h"
#include "hex.h"
#include "files.h"
#include <iostream>
using namespace std;
using namespace CryptoPP;
#pragma comment(lib, "cryptlib.lib")
//------------------------
// 函数声明
//------------------------
void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed);
string RSAEncryptString(const char *pubFilename, const char *seed, const char *message);
string RSADecryptString(const char *privFilename, const char *ciphertext);
RandomPool & GlobalRNG();
//------------------------
// 主程序
//------------------------
void main()
{
char priKey[128] = {0};
char pubKey[128] = {0};
char seed[1024] = {0};
// 生成 RSA 密钥对
strcpy(priKey, "pri"); // 生成的私钥文件
strcpy(pubKey, "pub"); // 生成的公钥文件
strcpy(seed, "seed");
GenerateRSAKey(1024, priKey, pubKey, seed);
// RSA 加解密
char message[1024] = {0};
cout<<"Origin Text:/t"<<"Hello World!"<<endl<<endl;
strcpy(message, "Hello World!");
string encryptedText = RSAEncryptString(pubKey, seed, message); // RSA 加密
cout<<"Encrypted Text:/t"<<encryptedText<<endl<<endl;
string decryptedText = RSADecryptString(priKey, encryptedText.c_str()); // RSA 解密
cout<<"Decrypted Text:/t"<<decryptedText<<endl<<endl;
}
//------------------------
// 生成RSA密钥对
//------------------------
void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed)
{
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
RSAES_OAEP_SHA_Decryptor priv(randPool, keyLength);
HexEncoder privFile(new FileSink(privFilename));
priv.DEREncode(privFile);
privFile.MessageEnd();
RSAES_OAEP_SHA_Encryptor pub(priv);
HexEncoder pubFile(new FileSink(pubFilename));
pub.DEREncode(pubFile);
pubFile.MessageEnd();
}
//------------------------
// RSA加密
//------------------------
string RSAEncryptString(const char *pubFilename, const char *seed, const char *message)
{
FileSource pubFile(pubFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Encryptor pub(pubFile);
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
string result;
StringSource(message, true, new PK_EncryptorFilter(randPool, pub, new HexEncoder(new StringSink(result))));
return result;
}
//------------------------
// RSA解密
//------------------------
string RSADecryptString(const char *privFilename, const char *ciphertext)
{
FileSource privFile(privFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Decryptor priv(privFile);
string result;
StringSource(ciphertext, true, new HexDecoder(new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))));
return result;
}
//------------------------
// 定义全局的随机数池
//------------------------
RandomPool & GlobalRNG()
{
static RandomPool randomPool;
return randomPool;
}
2. 设置工程属性
选择工程属性(Alt + F7):
(1)“Configuration Properties”→“C/C++” →“General”,右边的“Additional Include Directories”设置为上面建好的Crypto++ SDK的Include文件夹,“C:/Program Files/CyptoPP/include”;
(2) “Configuration Properties”→“Linker” →“General”,右边的“Additional Library Directories”设置为上面建好的Crypto++ SDK的Lib/Debug文件夹,“C:/Program Files/CyptoPP/lib/debug”(Release模式下对应着Release文件夹);
(3) “Configuration Properties”→“C/C++” →“Code Generation”,右边的“Runtime Library”设置为“Multi-threaded Debug (/MTd)”(Release模式下对应着“Multi-threaded (/MT)”)
3. 运行程序(Ctrl + F5)
正常运行的输出结果为:
Origin Text: Hello World!
Encrypted Text: 79C72A482482EF45111F961772456310792AB735ECF72329ECB26292D2B26374
824E0E35D24A63CB03B867DD2C70B001FD4B2B33FBC984BD229A5226F284B889901817976A680322
9E8351372C5E28E8BEBA2A94E7CF61A8A162F0BA2F3E0C35D26842D92EC4866D25E6BF878743E481
84D9F6FF9BA690F953568D017C02D540
Decrypted Text: Hello World!
如果上面的第(3)步没有设置则会出现以下链接错误:
cryptlib.lib(randpool.obj) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in msvcprtd.lib(MSVCP80D.dll)
说在msvcprtd.lib和MSVCRTD.lib中已经定义过。
Crypto++库在VS 2005中的使用——RSA加解密相关推荐
- 使用Crypto++5.5.2完成RSA加解密,真正的把公钥放在字符串内,而不是放在文件内
本文摘自 小楼一夜听春雨得博客: http://hi.baidu.com/magic475/blog/item/e8b82139020ae622b8998f96.html 使用Crypto++5.5. ...
- 介绍一个很好用的Rsa加解密的.Net库 Kalix.ApiCrypto
Rsa非对称加密技术 这个就不说了,大家上网搜索都知道,公钥加密,私钥解密.当然大家也可以自己实现.这里就懒了,就去找一个现成的库,Nuget上搜索,GitHub上搜索,发现.Net的加解密库,下载量 ...
- Java中的RSA加解密工具类:RSAUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt;import com.mirana.frame.utils.log.LogUtils; ...
- SpringBoot+Vue中使用AES进行加解密(加密模式等对照关系)
场景 若依前后端分离版本地搭建开发环境并运行项目的教程: 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客 在上面搭建起来前后端架构之后,在前后端分别进行AES方式的 ...
- php中base64和js中base64可互相加解密
php中base64和js中base64可互相加解密 前提:加解密的字符必须转换成UTF-8编码格式. php代码: <?php $str='中国航母辽宁号-歼15战机GOOD=ok'; ech ...
- .Net/C# 实现: FlashFXP 地址簿中站点密码的加解密算法
参阅 CCFer & TLFer : kanbol 的 Java 代码翻译修改而成: kanbol 说: 之前在TLF写过一个程序自动更新flashfxp的地址簿,也就是修改sites.dat ...
- Vue项目中的RSA加解密
前后端使用rsa加密: 一般是客户端初始化时访问登录服务时,服务端面动态生成一对RSA对,公钥传给客户端,客户端拿到后,用户输入密码后,点登录时用公钥加密返回给服务端,服务端用私钥解就行了 一.安装 ...
- vue rsa加密 php解密,Vue项目中的RSA加解密
一.安装jsencrypt 1 npm i jsencrypt node_modules文件夹中出现jsencrypt 二.引入jsencrypt 在main.js中import: 1 import ...
- python处理钉钉回调事件中的消息体加解密
钉钉的回调事件列表: user_add_org : 通讯录用户增加 user_modify_org : 通讯录用户更改 user_leave_org : 通讯录用户离职 org_admin_add : ...
最新文章
- Linux机器件拷贝文件
- php设计模式之责任链模式
- Java MyBaties 映射配置文件 mapper
- js 正则中冒号代表什么_是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型...
- 背包九讲(例题+代码)
- 基于单片机的公交车系统
- C# MessageBox用法大全
- 计算机推免资源(不定期更新)
- 网络发现已关闭。网络计算机和设备不可见。请启用网络和共享中心中的网络发现。
- 数据结构分类之什么是线性结构、非线性结构
- 短视频平台api接口php源码
- ardruino控制继电器_Arduino基础入门篇24—继电器控制
- 假设检验:如何理解单侧、双侧检验的拒绝域
- 快学Big Data -- Hadoop(十三)
- Git创建新分支并提交到github
- 神经网络学习小记录45——Keras常用学习率下降方式汇总
- k8s中部署grafana
- 怎么画动漫人物衣服衣纹
- java计算机毕业设计基于安卓Android的教务的校内人员疫情排查系统设计与实现APP
- VITA 57 FPGA 夹层卡(FMC)
热门文章
- python代码大全表解释-.python3基础之“术语表(1)”
- 用python画爱心的代码-Python一行代码画个爱心案例
- python3.8安装pip-CentOS7.2安装python3.8与pip
- python在财务领域的应用-浅谈财务智能化在实际工作中的运用
- python进阶免费-菜鸟世界 -python进阶---生成器
- python读取中文-python读取中文txt文本
- python安装在什么系统下最好-自学python用什么系统好
- guava中的Splitter
- LeetCode 464 Can I Win(min-max博弈算法)
- UVa1368 - DNA Consensus String(贪心算法)