Crypto++ 的使用

转载 2007年10月06日 10:21:00
一.   下载Crypto++ Library
Crypto++ Library    http://www.vrixpzone.com/zone2/CodeRepo/vc/cryptopp552.zip
二.   建立自己使用的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++(CryptoPP)库初始化以及使用注意事项

开篇提示:本文为本人原创,本文欢迎转载,但必须注明本文出处,例如。 “该文引用自 CruiseYoung的:Visual Studio 2013编译libiconv-1.14 http://blog...
  • fksec
  • fksec
  • 2014年11月11日 16:09
  • 4354

Crypto++ 入门(1) 安装

这篇文章主要介绍的是如何安装Crypto++。 以下所有文章基于的软件环境为: Windows 7 64位 Visual Studio 2010 我们首先需要去下载Crypto++,其官网为w...
  • interwish
  • interwish
  • 2013年03月30日 22:22
  • 4817

Crypto++ 入门(1) 安装

这篇文章主要介绍的是如何安装Crypto++。 以下所有文章基于的软件环境为: Windows 7 64位 Visual Studio 2010 我们首先需要去下载Crypto++,其官网为w...
  • interwish
  • interwish
  • 2013年03月30日 22:22
  • 4817

Crypto++库在VS 2008中的使用——RSA加解密

源代码:下载    一.   下载Crypto++ Library   Crypto++ Library的官方网:http://www.cryptopp.com/   二.   建立自...
  • u011676589
  • u011676589
  • 2015年01月19日 09:56
  • 1460

Crypto++(CryptoPP)库初始化以及使用注意事项

开篇提示:本文为本人原创,本文欢迎转载,但必须注明本文出处,例如。 “该文引用自 CruiseYoung的:Visual Studio 2013编译libiconv-1.14 http://blog...
  • fksec
  • fksec
  • 2014年11月11日 16:09
  • 4354

Crypto++学习总结--算法介绍

Crypto++ 算法介绍        Crypto++是开源的C++数据加密算法库,支持如下算法:RSA、MD5、DES、AES、SHA-256等等。对于加密有对称加密和非对称加密。   ...
  • zhu2695
  • zhu2695
  • 2016年04月30日 11:43
  • 774

Crypto++再复习【1】

上两个项目中用到的Crypto内容基本中只是其中的 number theory部分,在群内自己根据密码学协议的内容自己实现了完整的过程,较少的涉及直接使用该library中的基础类。而本次不太可能自己...
  • vingstar
  • vingstar
  • 2013年08月29日 11:11
  • 1892

使用Crypto++加解密类库实现密码管理系统

Crypto++是一个免费的加解密类库,集成了很多的加解密算法,如des, aes, rsa等基础加密算法。本文主要一下本人最近实现的一个密码管理器,编译环境是32位Ubuntu,主要实现了多用户系统...
  • Jeffery_Gong
  • Jeffery_Gong
  • 2016年04月19日 22:26
  • 815

C++利用Crypto++,vs2005环境下的RSA应用

固定生成随机密钥,存储和装载。解决加密时字符串长度问题
  • Yo_Joky
  • Yo_Joky
  • 2015年07月24日 15:02
  • 586

基于crypto++的RSA加密

crypto++刚开始也不知道是什么,只是设计过程中需要用crypto++来实现RSA算法的加解密。 首先应该了解crypto++的基本干什么的,这里不加以赘述,可以找更加官方的描述,当然官网找资料是...
  • zzj806683450
  • zzj806683450
  • 2013年12月19日 20:54
  • 2294
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Crypto++ 的使用
举报原因:
原因补充:

(最多只允许输入30个字)