每种强大的语言都有相应的密码安全方面的库,比如Java自带了加解密库。那么C++有没有这样的库呢?答案是肯定的,那就是Crypto++。
Crypto++是一个C++编写的密码学类库。读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗?就是Crypto++的作者WeiDai。Crypto++是一个非常强大的密码学库,在密码学界也很受欢迎。虽然网络上有很多密码学相关的代码和库,但是Crypto++有其明显的优点。主要是功能全、统一性好,例如椭圆曲线加密算法和AES在OpenSSL的Crypto库中就还没最终完成,而在Crypto++中就支持得比较好。
基本上密码学中需要的主要功能都可以在里面找得到。Crypto++是由标准的C++写成的,学习C++、密码学、网络安全都可以通过阅读Crypto++的源代码得到启发和提高。
Crypto++是一个开源库,其官方网站是www.cryptopp.com。
我们可以从其官网上下载最新源码,这里下载下来的文件名是cryptopp610.zip,是一个ZIP压缩文件,我们可以把它放到Linux下解压缩:
[root@localhost soft]# unzip cryptopp610.zip -d cryptopp610
加-d是解压到目录cryptopp610下,这个目录会自动建立。
解压完毕后,进入目录cryptopp610,然后用make进行编译:
[root@localhost soft]# cd cryptocpp610/ [root@localhost cryptocpp610]# make
稍等片刻,编译完成,此时会在文件夹cryptocpp610下生成一个静态库libcryptopp.a。有了这个静态库,我们就可以在应用程序中使用Crypto++提供的加解密函数了。
前面我们通过Crypto++源码编译出来了一个静态库libcryptopp.a,现在开始使用它。
首先看一个例子,这个例子是直接用AES加密一个块,AES的数据块(分组)大小为128位,密钥长度可选择128位、192位或256位。直接用AES加密一个块很少用,因为我们平时都是加密任意长度的数据,需要选择CFB等加密模式。但是直接的块加密是对称加密的基础。
【例2.12】一个使用Crypto++库的例子
(1)在Windows下打开UE(或其他编辑器),然后输入代码如下:
代码中有几个地方需要注意一下:
AES并不是一个类,而是类Rijndael的一个typedef。
Rijndael虽然是一个类,但是其用法和Namespace很像,本身没有什么成员函数和成员变量,只是在类体里面定义了一系列的类和数据类型,真正能够进行加密解密的AESEncryption和AESDecryption都是定义在这个类内部的类。
AESEncryption和AESDecryption除了可以用SetKey()这个函数设置密钥外,在构造函数中也能设置密钥,参数和SetKey()是一样的。
ProcessAndXorBlock()可能会让人比较疑惑,函数名的意思是ProcessBlock和XorBlock,ProcessBlock就是对块进行加密或解密,XorBlock在各种加密模式中使用,这里我们不需要使用加密模式,因此把用来Xor操作的XorBlock设置为0,那么Xor操作就不起作用了。
(2)保存代码为test.cpp,上传到Linux,在命令行下编译并运行:
[root@localhost test]# g++ test.cpp -o test -I/root/soft/cryptopp610 -L/root/soft/cryptopp610 -lcryptopp [root@localhost test]# ./test AES Parameters: Algorithm name: AES Block size : 128 Min key length: 128 Max key length : 256 77 6e 2c a5 2 17 7a 5b 19 e4 28 65 26 f3 7e 14 123456789
注意:目录名cryptopp610不要写成cryptoapp610。