安装
安装首页:https://www.cryptopp.com/#download
Github源码:https://github.com/weidai11/cryptopp
简介:Crypto++库是开源的C++数据加密算法库,支持:RSA,MD5,DES,AES,SHA-256等等,其中对于加密有对称加密和非对称加密。
由于我的电脑是MacOS系统,还不知道怎么导入C++第三方库,所以我直接使用了我的Linux虚拟机来完成安装。
Linux安装步骤
获取安装包的名字:
$ sudo apt-get update
$ apt-cache pkgnames | grep -i crypto++
我的终端返回的结果是:
libcrypto++-utils
libcrypto++9v5-dbg
libcrypto++-dev
libcrypto++-doc
libcrypto++9v5
于是用apt命令安装它们:
$ sudo apt-get install libcrypto++-utils libcrypto++9v5-dbg libcrypto++-dev libcrypto++-doc libcrypto++9v5
有哪个地方安装不成功可以参考官方的文档,在本文最上面有超链接。
测试
$ vim test1.cpp
输入:
#include <iostream>
using namespace std;
#include <cryptopp/aes.h>
using namespace CryptoPP;
int main()
{
cout << "hello crypto++" << endl;
cout << "Aes block size is " << AES::BLOCKSIZE << endl;
return 0;
}
编译:
$ g++ -o test1 test1.cpp -lcryptopp
$ ./test1
运行结果如果是:
hello crypto++
Aes block size is16
则说明测试成功。
范例:加密AES的一个数据块
$ vim test1.cpp
#include <iostream>
using namespace std;
#include <cryptopp/aes.h>
using namespace CryptoPP;
int main()
{
//AES中使用的固定参数是以类AES中定义的enum数据类型出现的,而不是成员函数或变量
//因此需要用::符号来索引
cout << "AES Parameters: " << endl;
cout << "Algorithm name : " << AES::StaticAlgorithmName() << endl;
//Crypto++库中一般用字节数来表示长度,而不是常用的字节数
cout << "Block size : " << AES::BLOCKSIZE * 8 << endl;
cout << "Min key length : " << AES::MIN_KEYLENGTH * 8 << endl;
cout << "Max key length : " << AES::MAX_KEYLENGTH * 8 << endl;
//AES中只包含一些固定的数据,而加密解密的功能由AESEncryption和AESDecryption来完成
//加密过程
AESEncryption aesEncryptor; //加密器
unsigned char aesKey[AES::DEFAULT_KEYLENGTH]; //密钥
unsigned char inBlock[AES::BLOCKSIZE] = "123456789"; //要加密的数据块
unsigned char outBlock[AES::BLOCKSIZE]; //加密后的密文块
unsigned char xorBlock[AES::BLOCKSIZE]; //必须设定为全零
memset( xorBlock, 0, AES::BLOCKSIZE ); //置零
aesEncryptor.SetKey( aesKey, AES::DEFAULT_KEYLENGTH ); //设定加密密钥
aesEncryptor.ProcessAndXorBlock( inBlock, xorBlock, outBlock ); //加密
//以16进制显示加密后的数据
for( int i=0; i<16; i++ ) {
cout << hex << (int)outBlock[i] << " ";
}
cout << endl;
//解密
AESDecryption aesDecryptor;
unsigned char plainText[AES::BLOCKSIZE];
aesDecryptor.SetKey( aesKey, AES::DEFAULT_KEYLENGTH );
aesDecryptor.ProcessAndXorBlock( outBlock, xorBlock, plainText );
for( int i=0; i<16; i++ ) { cout << plainText[i]; }
cout << endl;
return 0;
}
编译运行得到的结果是:
AES Parameters:
Algorithm name : AES
Block size : 128
Min key length : 128
Max key length : 256
fa 4b 93 80 4f 64 9b 35 f0 88 ea 11 c8 45 73 68
123456789
解读
Step1: 定义加密器AESEncryption aesEncryptor,这个aesEncryptor就是一个加密器对象,由AESEncryption实例化而来
Step2: 定义一些字符串,主要是四个,aseKey密钥,inBlock明文,outBlock密文,xorBlock初始全0
Step3: 给加密器设置密钥,aesEncryptor.SetKey(aesKey, AES::DEFAULT_KEYLENGTH)
Step4: 进行加密,aesEncryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock),密文便会保存在outBlock中
Step5: 解密,定义解密器AESDecryption aesDecryptor,这个aesDecryptor就是一个解密器对象,由aesDecryption实例化而来
Step6: 设置解密密钥,aesDncryptor.SetKey(aesKey, AES::DEFAULT_KEYLENGTH)
Step7: 开始解密,aesDecryptor.ProcessAndXorBlock(outBlock, xorBlock, plainText), 其中plainText就是定义的一个字符串,保存解密后的明文