1. 安装及配置
1.1. 编译
下载下来,将工程导入到vs中,打开,有4个工程。全部编译一遍。如果编译有问题的话,也可以只编译cryptlib工程。至于另外几个工程,不是很清楚。我试了只编译cryptlib的工程,貌似也可以。
编译完了后,在“.\Win32\Output\Debug\”目录下可以找到cryptlib.lib文件。
1.2. 编译选项问题
这里有一点值得提一下的是,编译选项的问题。Cryptopp工程默认的编译选项是/MTd。所以,如果你没有改它的话,把这样编译后的lib用到你自己的工程中去的话,你的工程的编译选项也必须调成/MTd,否则链接的时候可能会报错。
或者,你可以选择,按照你工程的编译选项的需要(如/MDd),在编译Cryptlib的时候,先调整编译选项,再把编译后的lib引入到工程中,这样就没问题了。
调整编译选项:工程->右键->属性->Configuration Properties->C/C++->Code Generation : Runtime Library。
1.3. 引入工程
- 引入相关头文件
在你的工程目录,右键 -> 属性 -> Configuration Properties -> C/C++ -> General :
Additional Include Directories,填入Cryptopp库的源代码所在目录。
如:C:\DevCommon\cryptopp561
- 引入lib库
1).在你的工程目录,右键 -> 属性 -> Configuration Properties -> Linker -> General :
Additional Library Directories,填入cryptlib.lib所在的目录。
2).在下面的 Linker -> Input : Additional Dependencies,填入:cryptlib.lib。
3).在Linker -> Command Line : Additional options中填入:cryptlib.lib。
上面的 2) 或者 3) 任选一个都可以。
2. Hello World
配置完毕后,写个Hello World测试一下,看能不能编译通过。
#include <iostream>
#include <aes.h>
using namespace std;
using namespace CryptoPP;
int main()
{
cout << "hello crypto++" << endl;
cout << "Aes block size is " << AES::BLOCKSIZE << endl;
return 0;
}
3. 二进制数组编码
3.1. 将一个byte数组按16进制编码后输出
string encoded;
StringSource ss(m, sizeof(m), true,
new HexEncoder(new StringSink(encoded))
);
cout << encoded << endl;
3.2. 将一个byte数组按base64编码后输出
string encoded;
StringSource s(m, sizeof(m), true,
new Base64Encoder(new StringSink(encoded))
);
cout << encoded << endl;
4. 哈稀算法签名
4.1. MD5
4.1.1. MD5对字符串签名
bool md5(const string &src, string &digest)
{
byte m[16];
int len = src.length();
byte *msg = new byte[len + 1];
std::stringstream stream;
stream << src;
stream >> msg;
Weak::MD5 md5;
md5.CalculateDigest(m, msg, len); //此一句等于下面两句
//md5.Update(msg, len);
//md5.Final(m);
StringSource ss(m, sizeof(m), true,
new HexEncoder(new StringSink(digest))
);
delete [] msg;
return true;
}
注:
1、
CalculateDigest(m, msg, len) 方法等效于下面两个语句
md5.Update(msg, len);
md5.Final(m);
2、关于数组byte[] m ,用于接收数字签名
数组m的长度16,这个是怎么来的呢?查看API帮助文档可以发现,其实这个是由方法DigestSize()定义的,同时一个静态的常量DIGESTSIZE也定义了该长度。
使用的时候,可以将该值打印出来:
cout << Weak::MD5::DIGESTSIZE;
或者:
bool md5(const string &src, string &digest)
{
Weak::MD5 md5;
StringSource(src, true,
new HashFilter(md5,
new HexEncoder(new StringSink(digest))
)
);
return true;
}
4.1.2. MD5对文件产生签名
bool md5file(const string &filePath, string &digest)
{
std::locale loc1 = std::locale::global(std::locale(".936")); //解决中文文件名问题
Weak::MD5 md5;
FileSource f(filePath.c_str(), true,
new HashFilter(
md5, new HexEncoder(new StringSink(digest))
)
);
std::locale::global(std::locale(loc1));
return true;
}
4.2. SHA-1
4.2.1. SHA-1对字符串签名
bool sha1(const string &src, string &digest)
{
SHA1 sha1;
StringSource(src, true,
new HashFilter(sha1,
new HexEncoder(new StringSink(digest))
)
);
return true;
}
参考:
http://www.mathmagic.cn/bbs/read.php?tid=5152
http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html
http://www.cnblogs.com/cxun/archive/2008/07/30/743541.html
原文链接: https://www.cnblogs.com/jclugia/archive/2011/11/29/2267692.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/37524
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!