QCA是C++ GUI Qt中的一个第三方插件,为Qt提供了一个针对安全性方面编程的框架。从QCA的名称不难发现,它的设计在很多方面借鉴了JCE(Java Cryptography Extension)——QCA定义了一组公共接口,并由不同的提供者提供加解密算法实现。开发者通过调用简单的API,就可以轻松的实现对称加解密、非对称加解密以及数字证书等功能。QCA是跨平台的,可以运行在Windows、Unix和MacOSX等不同的平台上。
当然,在C++下有很多其他的安全性函数库,比如:Botan、Cryptlib、Crypto++等,都是一些不错的加解密函数库。但是从某种角度看,Qt并不属于pure C++的范畴,它虽然使用C++做为开发语言,但是在整个SDK的框架设计上却又非常的类似于Java(有些类的设计思想和实现方法都完全一样),所以Qt一直以来都是我作为弥补Java GUI编程缺憾的一个非常强有力的工具。
继续回到我们的QCA上,之所以我选择了QCA,是因为QCA的API设计沿袭了Qt的数据类型和编程习惯,所以对于Qt开发者来说是最具亲和力的,而且和Qt SDK的结合紧密度也是最高的。网上有不少写QCA的文章,但是总体质量都不是很高,也没有一个比较系统完整的讲解QCA使用过程的,更没有实际的使用范例。因此在我开发的过程中遇到了不少麻烦。也正因为这样,才有了我的用武之地,我想把我最近的一个Qt项目中有关QCA部分截取出来,做为一个比较完整系统的QCA中文教程,并采用一个数字证书加密的例子作为具体实践的例程。
QCA的安装还是比较简单的,和一般的C/C++函数库安装方法大致相同(configure、make && make install)。QCA的安装和配置是网上写的最多的文章,但是又是写的最不好的。大部分都是抄袭官网上的,更有甚者直接复制官网的说明作为自己的文章内容!大概是由于环境的缘故或是其他什么原因,按照网上的那些文章去安装和配置QCA,我总是以失败告终。因此最后还是通过自己阅读官方的说明文档才成功的完成了QCA的安装和配置。先说一下我的开发环境:
由于MinGW是免安装的,所以直接复制到某个目录即可,例如:C:\MinGW,然后在环境变量Path中设置一下bin路径即可。要验证一下gcc是否工作正常,可以打开一个命令行窗口,在命令行提示符下输入make -version命令,如果没有报错,就表示gcc可以正常工作了。
接下去是安装Qt开发库,由于在windows下安装Qt库是最简单的,而且网上的文章也没什么问题,所以我这里就不再赘述了。
下面就是我们的关键内容:
QCA可以去它的官网上下载:http://delta.affinix.com/qca,如下图所示:
(图1 QCA的官网下载)
从上图中可以看到,QCA是需要依赖OpenSSL的。也就是说,QCA是OpenSSL的一个Qt版本封装。因此我们必须先安装OpenSSL,我安装的是Win32OpenSSL-1_0_0g.exe。可以点击这里下载(由于加密算法是被美国军方严格管控出口的,所以我们用的都是一些公开的加密算法且密钥强度级别都是很低的,但是对于我们民用来说已经足够了)。OpenSSL的安装超级简单,不再赘述。
下载之后,我们拿到了2个文件:qca-2.0.3.tar.bz2和qca-ossl-2.0.0-beta3.tar.bz2。我们先安装qca-2.0.3.tar.bz2,首先解压缩,并将其放在任意的目录中,这里需要注意,不要将其放到Qt的安装目录中进行编译,否则make的时候会报错。例如,我将其放在D:\qca\qca-2.0.3。打开命令行窗口,将目录切换到qca-2.0.3目录下。然后执行configure.exe命令,如下图所示:
(图2)
执行configure命令会检查Qt的编译环境和本地证书数据库。
如上图所示QCA检查环境成功,可以执行编译了。如果检查失败
如图:
一般是由于没有定义%QTDIR%环境变量或是make命令不可执行所致,所以应该去检查一下自己系统的Qt和gcc编译器的环境变量设置。最简单的方法,比如你的QTDIR为:c:\Qt\4.8.5
方法一:那么输入:set QTDIR=c:\Qt\4.8.5
方法二:修改installwin.bat文件,将其中的QTDIR改为c:\Qt\4.8.5(用utraledit打开文件)
例如图:
接下去,输入make命令,开始编译和连接QCA库,如下图所示:
(图3)
经过大概10分钟左右的滚屏,如果出现图3中所示的内容,则表示make成功。
按照官网的说法,接下去只要执行installwin命令即可,但是在实际开发中还是发现了一些小问题,故需要进行一些额外的工作。
1. 修改qca-2.0.3目录下的installwin.bat文件,用任意的文本编辑器打开此文件,例如:EditPlus等。将其中的QTDIR改为你的qt目录(例如c:\Qt\4.8.5),当然,如果你已经设置了set QTDIR=c:\Qt\4.8.5那么就什么都不用做了!
2. 修改qca-2.0.3目录下的crypto.prf.in文件,用任意的文本编辑器打开此文件,例如:EditPlus等。修改红色框中的部分,如下图所示:
(图5)
将其修改成“-lqca2”,否则在链接动态库时会报错。好了,现在可以继续执行installwin.bat命令了,如下图所示:
(图6)
该命令会在%QTDIR%\mkspecs\features目录中生成一个crypto.prf文件,该文件是一个Qt插件配置文件,以后在我们开发代码的时候会用到它。
至此QCA框架基本安装完成,接下去将头文件、库文件以及动态链接库复制到Qt的安装目录中即可,如下:
1. 将D:\qca\qca-2.0.3\lib目录中的libqca2.a和qca.prl文件复制到%QTDIR%\lib目录中;
2. 将D:\qca\qca-2.0.3\bin目录中的qca2.dll和qcatool2.exe文件复制到%QTDIR%\bin目录中(qcatool2是QCA的一个小工具,之后我们会用到它);
3. 将D:\qca\qca-2.0.3\include目录下的QtCrypto目录整个的复制到%QTDIR%\include目录中。
终于,QCA框架安装完成。接下去,我们用qcatool2小工具来验证一下。如下图所示:
我们在命令行下输入qcatool2 plugins命令,会显示出当前QCA可用的提供者,由于目前我们还没有安装任何的提供者库,所以在“Available Providers”一栏中是空的。要使用加解密算法,我们必须要安装一个提供者——qca-ossl。
上面我们完成了QCA框架的安装,接下去我们开始安装一个加密算法库的提供者,以便我们可以开发实际的应用。之前我们已经下载了提供者——qca-ossl-2.0.0-beta3.tar.bz2。将其解压缩,放在我们之前QCA框架的目录中,例如:D:\qca\qca-ossl-2.0.0-beta3。然后我们打开一个命令行窗口,将当前目录切换到qca-ossl-2.0.0-beta3下。按照官方的文档,我们执行configwin.bat rd,如下图所示:
(图一)
其中的参数rd表示,我们要生成该提供者库的release和debug版本,并且同时生成动态链接库。接着我们执行qmake命令,让其生成makefile文件,如下图所示:
(图二)
在执行qmake的时候报错了,提示信息中描述了未找到一个叫“winlocal.prf”的文件。网上有对此问题的解释,不过经过我的测试,网上的那种解决方法还是有点小复杂。所以这里介绍一个比较简单的方法。其实这个错误的根源就是这个提供者库是依赖openssl库的,所以在对其进行编译的时候一定要告诉它openssl的头文件和库文件的路径。之前我们已经安装过OpenSSL了,在我的系统中其安装目录为:C:\OpenSSL,只要先创建一个叫winlocal.prf的文件,然后在该文件中配置一个叫WINLOCAL_PREFIX变量并将OpenSSL的安装路径赋值给这个变量即可(其实只要打开qca-ossl.pro文件看一下就明白是这么回事了)。winlocal.prf文件需要放在%QTDIR%\mkspecs\features目录中。下图为winlocal.prf文件的内容:
(图三)
这里要注意一点,就是路径分隔符要使用unix格式的,不能使用windows下的格式。然后继续执行qmake命令,如下图所示:
(图四)
这次不再报错了,但是有警告。这是由于路径分隔符的缘故造成的,打开%QTDIR%\mkspecs\features目录下的crypto.prf文件,将第一行和第二行中的windows路径分隔符改成unix路径分隔符(即将“\”改成“/”即可),再次执行qmake命令,如下图所示:
(图五)
这次不再报任何错误和警告了。我们开始编译源代码,输入make命令,如下图所示:
(图六)
这次是编译报错,提示信息说“EVP_md2没有定义”。网上查询了一下,的确存在这个问题,原来是我们的OpenSSL版本太高,有些函数名称已经发生变更了。好吧,那我们就用预编译指令来屏蔽它,这里有一个修改之后的源文件,点击这里下载。将其覆盖原来的文件,再次输入make指令,如下图所示:
(图七)
如果看到上图中的内容,则表示提供者库编译成功了,会在D:\qca\qca-ossl-2.0.0-beta3\lib目录中生成动态库文件,如下图所示:
(图八)
其中包含了release版本和debug版本的动态库文件(文件名中带“d”就是Debug版本)。最后将qca-ossl2.dll和qca-ossld2.dll复制到%QTDIR%\plugins\crypto目录中即可(如果没有crypto目录则自己创建一个),将libqca-ossl2.a和libqca-ossl2d.a文件复制到%QTDIR%\lib目录中即可。
到此,我们就完成了QCA框架以及提供者加密库的编译和安装。接下去,我们仍然用qcatool2工具来测试一下,安装和配置是否正确,如下图所示:
(图九)
从上图红框中可以看到,之前这栏是<none>,现在已经有可用的提供者了,这表示QCA已经完全安装和配置成功了。如果要看一下该提供者支持哪些加密算法,我们可以输入:qcatool2 plugins --debug命令,如下图所示:
(图十)
红色框中的就是该提供者支持的所有加密算法(由于窗口大小的关系,这里没有显示完全)。另外,我们可以看到其中有个错误,就是在加载qca-ossld2.dll时失败了,这是由于这个DLL是Debug版本的,该工具不支持而已,我们可以忽略之。
这个类库是基于插件结构开发的,不同的加密方法会使用到不同的插件,而每个插件又需要单独编译,比较麻烦,具体如何编译类库与插件这里就省略了。直接提供给大家编译好的版本;类库会用到OpenSSL一些功能,所以在使用前需要先下载OpenSSL,建议大家到http://www.slproweb.com/products/Win32OpenSSL.html下载(Win32 OpenSSL v1.0.0g, 16MB那个版本)
下载:
类库与插件:crypto拷贝到:Qt安装目录\Desktop\Qt\4.7.4\mingw\plugins\crypto
Qt feautre:feature拷贝到:Qt安装目录\Desktop\Qt\4.7.4\mingw\mkspecs\features
使用类库时,需要:
1. 在你的Qt项目文件pro中添加"CONFIG += crypto"
2. 拷贝"OpenSSL-Win32\bin\"目录下ssleay32.dll和libeay32.dll到你项目的debug或release目录
3. 拷贝"qca-2.0.3\lib"目录与"qca-ossl-2.0.0-beta3\lib"目录下qca2.dll和qca-ossl2.dll到你项目的debug或release目录
4. 在程序中使用QCA之前先使用语句QCA::Initializer init对QCA进行初始化
参考:
http://www.essentialunix.org/index.php?option=com_content&view=article&id=48:qcatutorial&catid=34:qttutorials&Itemid=53
http://www.openssl.org/
http://www.cnblogs.com/andy65007/archive/2012/02/27/2370374.html