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加解密相关推荐

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

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

  2. 介绍一个很好用的Rsa加解密的.Net库 Kalix.ApiCrypto

    Rsa非对称加密技术 这个就不说了,大家上网搜索都知道,公钥加密,私钥解密.当然大家也可以自己实现.这里就懒了,就去找一个现成的库,Nuget上搜索,GitHub上搜索,发现.Net的加解密库,下载量 ...

  3. Java中的RSA加解密工具类:RSAUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt;import com.mirana.frame.utils.log.LogUtils; ...

  4. SpringBoot+Vue中使用AES进行加解密(加密模式等对照关系)

    场景 若依前后端分离版本地搭建开发环境并运行项目的教程: 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客 在上面搭建起来前后端架构之后,在前后端分别进行AES方式的 ...

  5. php中base64和js中base64可互相加解密

    php中base64和js中base64可互相加解密 前提:加解密的字符必须转换成UTF-8编码格式. php代码: <?php $str='中国航母辽宁号-歼15战机GOOD=ok'; ech ...

  6. .Net/C# 实现: FlashFXP 地址簿中站点密码的加解密算法

    参阅 CCFer & TLFer : kanbol 的 Java 代码翻译修改而成: kanbol 说: 之前在TLF写过一个程序自动更新flashfxp的地址簿,也就是修改sites.dat ...

  7. Vue项目中的RSA加解密

    前后端使用rsa加密:  一般是客户端初始化时访问登录服务时,服务端面动态生成一对RSA对,公钥传给客户端,客户端拿到后,用户输入密码后,点登录时用公钥加密返回给服务端,服务端用私钥解就行了 一.安装 ...

  8. vue rsa加密 php解密,Vue项目中的RSA加解密

    一.安装jsencrypt 1 npm i jsencrypt node_modules文件夹中出现jsencrypt 二.引入jsencrypt 在main.js中import: 1 import ...

  9. python处理钉钉回调事件中的消息体加解密

    钉钉的回调事件列表: user_add_org : 通讯录用户增加 user_modify_org : 通讯录用户更改 user_leave_org : 通讯录用户离职 org_admin_add : ...

最新文章

  1. Linux机器件拷贝文件
  2. php设计模式之责任链模式
  3. Java MyBaties 映射配置文件 mapper
  4. js 正则中冒号代表什么_是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型...
  5. 背包九讲(例题+代码)
  6. 基于单片机的公交车系统
  7. C# MessageBox用法大全
  8. 计算机推免资源(不定期更新)
  9. 网络发现已关闭。网络计算机和设备不可见。请启用网络和共享中心中的网络发现。
  10. 数据结构分类之什么是线性结构、非线性结构
  11. 短视频平台api接口php源码
  12. ardruino控制继电器_Arduino基础入门篇24—继电器控制
  13. 假设检验:如何理解单侧、双侧检验的拒绝域
  14. 快学Big Data -- Hadoop(十三)
  15. Git创建新分支并提交到github
  16. 神经网络学习小记录45——Keras常用学习率下降方式汇总
  17. k8s中部署grafana
  18. 怎么画动漫人物衣服衣纹
  19. java计算机毕业设计基于安卓Android的教务的校内人员疫情排查系统设计与实现APP
  20. VITA 57 FPGA 夹层卡(FMC)

热门文章

  1. python代码大全表解释-.python3基础之“术语表(1)”
  2. 用python画爱心的代码-Python一行代码画个爱心案例
  3. python3.8安装pip-CentOS7.2安装python3.8与pip
  4. python在财务领域的应用-浅谈财务智能化在实际工作中的运用
  5. python进阶免费-菜鸟世界 -python进阶---生成器
  6. python读取中文-python读取中文txt文本
  7. python安装在什么系统下最好-自学python用什么系统好
  8. guava中的Splitter
  9. LeetCode 464 Can I Win(min-max博弈算法)
  10. UVa1368 - DNA Consensus String(贪心算法)