linux libcrypto 用法,Crypto++ 的使用方法

于从官方网的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 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

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

cout

cout

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

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

[NextPage]

RSAES_OAEP_SHA_Decryptor priv(privFile);

string result;

StringSource(ciphertext, true, new HexDecoder(new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))));

return result; [Page]

}

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

// 定义全局的随机数池

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

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,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中已经定义过。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值