最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

Crypto++使用_RSA加解密

来源:动视网 责编:小OO 时间:2025-09-27 11:46:03
文档

Crypto++使用_RSA加解密

Crypto++入门-安装Crypto++是一个C++编写的密码学类库。读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗,就是Crypto++的作者WeiDai。Crypto++是一个非常强大的密码学库,在密码学界很受欢迎,最初还是Rivest(RSA的R)门下的一个博士姐姐把这个库介绍给我的。虽然网络上可以找到很多密码学相关的代码和库,但是Crypto++有其明显的优点。主要是功能全,统一性好。例如椭圆曲线加密算法和AES在OpenSSL的crypto库中就还没最终完成,而在Cr
推荐度:
导读Crypto++入门-安装Crypto++是一个C++编写的密码学类库。读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗,就是Crypto++的作者WeiDai。Crypto++是一个非常强大的密码学库,在密码学界很受欢迎,最初还是Rivest(RSA的R)门下的一个博士姐姐把这个库介绍给我的。虽然网络上可以找到很多密码学相关的代码和库,但是Crypto++有其明显的优点。主要是功能全,统一性好。例如椭圆曲线加密算法和AES在OpenSSL的crypto库中就还没最终完成,而在Cr
Crypto++入门- 安装

Crypto++是一个C++编写的密码学类库。读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗,就是Crypto++的作者Wei Dai。

Crypto++是一个非常强大的密码学库,在密码学界很受欢迎,最初还是Rivest(RSA的R)门下的一个博士姐姐把这个库介绍给我的。虽然网络上可以找到很多密码学相关的代码和库,但是Crypto++有其明显的优点。主要是功能全,统一性好。例如椭圆曲线加密算法和AES在OpenSSL的crypto库中就还没最终完成,而在Crypto++中就支持的比较好。基本上密码学中需要的主要功能都可以在里面找得到。Crypto++是由标准的C++写成的,学习C++、密码学、网络安全都可以通过阅读Crypto++的源代码得到启发和提高。

Crypto++的安装:

首先到www.cryptopp.com上下载最新版本的源代码,如果是windows版的,会得到一个VC的项目,直接用VC打开就可以编译了。这里建议大家使用最新版的C++编译器,因为诸如VC6的编译器是不支持C++的标准的,很多符合C++标准的代码不能编译通过。编译的时间比较长,完成后会生成cryptlib.lib这个库文件。可以将Crypto++源文件的目录命名为cryptopp,拷贝到编译器的include目录(例如:C:\\VS.NET\\VC7\\include),将cryptlib.lib文件拷贝到编译器的lib目录。这样我们只需要说明链接cryptlib.lib即可。例如在VC7中在项目->属性->链接器->命令行->附加选项中添加“cryptlib.lib”。

Hello World

现在写一个hello world程序看看能不能编译通过。

#include

using namespace std;

#include

using namespace CryptoPP;

int main() 

{

cout << "hello crypto++" << endl;

cout << "Aes block size is " << AES::BLOCKSIZE << endl;

          return 0;

}

编译运行,一切OK,哈哈:D,可以用了。 

lib和dll文件的区别和联系     

    

  .dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。   

  .lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib文件,就必须:   

  1   包含一个对应的头文件告知编译器lib文件里面的具体内容   

  2   设置lib文件允许编译器去查找已经编译好的二进制代码   

    

  如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文件,可以用WIN32   API函数LoadLibrary、GetProcAddress。事实上,我们可以在Visual   C++   IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。   

    

  一般我们最主要的关于lib文件的麻烦就是出现unresolved   symble这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含:   

  extern   "C"   

  {   

  #include   "myheader.h"   

  }   

  这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错

  

  C语言中有一些函数不需要进行编译,有一些函数也可以在多个文件中使用。一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。     

    

    不同类型的应用程序将会使用不同的函数库。例如:libdbm库中组包含了对数据库文件进行访问的dbm函数,需要对数据库进行操作的程序就会与该库进行连接。数学应用程序将使用数学库libm,X-Windows应用程序将使用Xlib库,libX11。另外,所有的程序都将使用标准的C函数库。libc,该库中包含了诸好内存管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用的目录中,系统中的任何用户都可以利用这些库。当然用户也可以建立自己专用的库函数,供自己或其它指定的人员使用。     

    

    库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。

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

一.   下载Crypto++ Library

Crypto++ Library的官方网:http://www.cryptopp.com/

二.   建立自己使用的Crypto++ Library

由于从官方网下载的Crypto++库是开源的,只有源文件和几个可以生成lib、dll的工程,以及一个使用的例子工程,因此希望生成自己建的工程能使用的SDK。

1.       编译链接生成cryptlib.lib

打开cryptest.sln,分别在Debug模式和Release模式(Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

)下编译链接cryptlib工程,成功后会在cryptopp54\\Win32\\output\\debug和cryptopp54\\Win32\\output\\release下生成cryptlib.lib文件。我现在用的是Crypto++ 5.6.2版本。

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

在D:\\Program Files\\visual_studio\\visual_studio-2010中新建文件夹,取名“CryptoPP”,里面新建文件夹“include”、“lib”,在“lib”中新建文件夹“debug”、“release”。将Crypto++库中的所有头文件复制到“include”文件夹中,再将上面生成的两个cryptlib.lib分别复制到“debug”和“release”中。

三.   RSA加解密

1.       

在VS 2010中新建Win32 Console Application工程,建立空的工程。完成后新建文件main.cpp,里面源码如下:

// RSATest.cpp : 定义控制台应用程序的入口点。

// 

#include "stdafx.h"

#include "randpool.h"

#include"rsa.h"

#include"hex.h"

#include"files.h"

#include"stdlib.h"

#include

using namespace std;

//这个是我们刚才 建立Crypto++ SDK

using namespace CryptoPP;

//这个是我们刚才 编译链接生成cryptlib.lib

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

//------------------------

// 函数声明

//------------------------

//生成RSA密钥对的函数声明

void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed);

//RSA加密函数

string RSAEncryptString(const char *pubFilename, const char *seed, const char *message);

//RSA解密函数

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(原文):\"<<"Hello Crypto++!"<    strcpy(message, "Hello Crypto++!");

    string encryptedText = RSAEncryptString(pubKey, seed, message); // RSA 加密

cout<<"Encrypted Text(密文):\"<    string decryptedText = RSADecryptString(priKey, encryptedText.c_str()); // RSA 解密

cout<<"Decrypted Text(解密后文本):\"<    //防止dos对话框立即自动关闭

    system("pause"); 

}

//------------------------

// 生成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));

    /*strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,

    中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\\0'为止,然后返回计数器值。

    */

    //1.首先声明一个字符串来存放编码的结果

    string result;

    //2.接着声明一个编码器对象,并通过 StringSink 类关联两者

    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)

正常运行的输出结果为:

如果上面的第(3)步没有设置则会出现以下链接错误:

cryptlib.lib(randpool.obj) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(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++使用经验总结:

Crypto++是一套关于应用密码学的类库,提供了散列(MD5、SHA)、数据加密(DES、AES)、数字签名(RSA、椭圆曲线签名算法ECDSA)等很多有用的算法,算法安全性已经通过 FIPS 140-2(http://csrc.nist.gov/cryptval/140-2.htm) 验证。 

文档

Crypto++使用_RSA加解密

Crypto++入门-安装Crypto++是一个C++编写的密码学类库。读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗,就是Crypto++的作者WeiDai。Crypto++是一个非常强大的密码学库,在密码学界很受欢迎,最初还是Rivest(RSA的R)门下的一个博士姐姐把这个库介绍给我的。虽然网络上可以找到很多密码学相关的代码和库,但是Crypto++有其明显的优点。主要是功能全,统一性好。例如椭圆曲线加密算法和AES在OpenSSL的crypto库中就还没最终完成,而在Cr
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top