购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 纯C++密码开发Crypto++库

每种强大的语言都有相应的密码安全方面的库,比如Java自带了加解密库。那么C++有没有这样的库呢?答案是肯定的,那就是Crypto++。

Crypto++是一个C++编写的密码学类库。读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗?就是Crypto++的作者WeiDai。Crypto++是一个非常强大的密码学库,在密码学界也很受欢迎。虽然网络上有很多密码学相关的代码和库,但是Crypto++有其明显的优点。主要是功能全、统一性好,例如椭圆曲线加密算法和AES在OpenSSL的Crypto库中就还没最终完成,而在Crypto++中就支持得比较好。

基本上密码学中需要的主要功能都可以在里面找得到。Crypto++是由标准的C++写成的,学习C++、密码学、网络安全都可以通过阅读Crypto++的源代码得到启发和提高。

Crypto++是一个开源库,其官方网站是www.cryptopp.com。

2.3.1 Crypto++的编译

我们可以从其官网上下载最新源码,这里下载下来的文件名是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++提供的加解密函数了。

2.3.2 使用Cypto++进行AES加解密

前面我们通过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。 XWcTbtJCpSwj9oHZmidCU/Li9Knua68CJvg1rojd55cQTdP9C8vLZp9J1j7naup5

点击中间区域
呼出菜单
上一章
目录
下一章
×