密码学与网络安全(三)C++加密/解密第三方库Crypto++初探

Oct 7, 2017


安装

安装首页: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就是定义的一个字符串,保存解密后的明文