您的位置:首页 > 编程语言 > C语言/C++

C++加密库botan混合编译和简单使用

2016-04-26 00:54 363 查看
C++加密库botan混合编译和简单使用

最近要用到加密数据,找了半天,有许多加密库:

botan
crypto++
tomcrypt
openssl
MCrypt
Cryptlib
PolarSSL
yaSSL
GnuPG

尝试后发现还是botan简单好用。botan加密库是什么,百度一下就知道,在这里就不多说了。
首先,我不想用lib或者dll,于是乎想直接生成.h和.cpp文件加入工程使用。好在botan支持我的这种想法,我试了其他的几种库,不是使用静态库就是使用动态库,并没有办法直接将.h和.cpp文件加入工程编译。
1.到官网 http://botan.randombit.net/ 下载源文件,我下载的是最新版Botan-1.10.5,解压。
2.下载安装python,我是下载Python2.7.3版本,2.7的应该都行,别下载3.x.x的版本,用来编译botan会失败的,官网有说明,解决办法还没搞懂。
3.找到安装的python目录,复制python.exe的路径,我的是C:\Python27\python.exe,打开vs2008命令提示工具,定位到botan解压后的文件夹根目录下,将复制的python.exe路径粘贴,然后编辑成如下语句:C:\Python27\python.exe configure.py --c=msvc --gen-amalgamation 回车,之后会在botan根目录下生成botan_all.cpp和botan_all.h两个文件,这正是我们需要的。
4.新建控制台工程,将生成的cpp和h文件加入工程中,测试代码如下:
#include "stdafx.h"
#include "botan_all.h"
using namespace Botan;
#include <iostream>
#include <string>
using namespace std;

string cryptoAES(string input,string passphrase/*密码种子,MD5加密后作为密钥*/,Cipher_Dir opt) {//AES加密和解密
HashFunction* hash = get_hash("MD5");
SymmetricKey key = hash->process(passphrase);
SecureVector<byte> raw_iv = hash->process('0'+ passphrase);
InitializationVector iv(raw_iv, 16);
string output="";
if (opt==ENCRYPTION)
{
Pipe pipe(get_cipher("AES-128/CBC", key, iv, opt),new Hex_Encoder);//Hex_Encoder表示加密后转码为十六进制输出
pipe.process_msg(input);
output=pipe.read_all_as_string();
}
else if(opt==DECRYPTION)
{
Pipe pipe(new Hex_Decoder,get_cipher("AES-128/CBC", key, iv, opt));//Hex_Decoder表示以十六进制字符串为输入,转码后进行解密
pipe.process_msg(input);
output=pipe.read_all_as_string();
}
return output;
}

int main(int argc, char* argv[])
{
try
{
Botan::LibraryInitializer init;//初始化

string aes=cryptoAES("57ADD6949178720A6AAC4CD2B740B8BB","0000",DECRYPTION);//AES解密
cout<<aes<<endl;
Botan::Pipe pipe(new Botan::Hash_Filter("MD5"),
new Botan::Hex_Encoder);//MD5加密
pipe.process_msg("11112222");
string md5=pipe.read_all_as_string();
cout<<md5<<endl;
}
catch(std::exception& e)
{
std::cout << "Exception caught: " << e.what() << std::endl;
}
getchar();
return 0;
}

如果编译不通过,在工程宏定义处加入宏NOMINMAX ,可以解决问题。参考资料:
http://www.cppblog.com/everett/archive/2012/07/07/182122.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: