编译及安装QCA类库及使用

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的安装和配置。先说一下我的开发环境:

  1. 操作系统:windows 7(32位旗舰版)。
  2. C++编译器:MinGW(这里需要注意,一开始我用的是官网最新版本的MinGW,也就是可以在线安装的那个版本,但是最新的MinGW和Qt 4.8.5版本是不匹配的,因此后来从网上下载了一个免安装的MinGW编译器(gcc 3.81版本),这才解决了问题,如果有人需要可以点击这里下载)。
  3. Qt:qt-win-opensource-4.8.5-mingw.exe。
  4. QCA:qca-2.0.3.tar.bz2和qca-ossl-2.0.0-beta3.tar.bz2,前一个文件是QCA框架,后一个是加密算法的提供者。提供者实现了各种加解密算法,以供开发者调用。
  5. OpenSSL:Win32OpenSSL-1_0_0g.exe

由于MinGW是免安装的,所以直接复制到某个目录即可,例如:C:\MinGW,然后在环境变量Path中设置一下bin路径即可。要验证一下gcc是否工作正常,可以打开一个命令行窗口,在命令行提示符下输入make -version命令,如果没有报错,就表示gcc可以正常工作了。

接下去是安装Qt开发库,由于在windows下安装Qt库是最简单的,而且网上的文章也没什么问题,所以我这里就不再赘述了。

下面就是我们的关键内容:

安装和配置QCA

QCA可以去它的官网上下载:http://delta.affinix.com/qca,如下图所示:

编译及安装QCA类库及使用_第1张图片

(图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命令,如下图所示:

编译及安装QCA类库及使用_第2张图片

(图2)

执行configure命令会检查Qt的编译环境和本地证书数据库。

如上图所示QCA检查环境成功,可以执行编译了。如果检查失败

如图:

编译及安装QCA类库及使用_第3张图片

一般是由于没有定义%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打开文件)

例如图:

编译及安装QCA类库及使用_第4张图片

接下去,输入make命令,开始编译和连接QCA库,如下图所示:

编译及安装QCA类库及使用_第5张图片

(图3)

经过大概10分钟左右的滚屏,如果出现图3中所示的内容,则表示make成功。

installwin命令

按照官网的说法,接下去只要执行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等。修改红色框中的部分,如下图所示:

编译及安装QCA类库及使用_第6张图片

(图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小工具来验证一下。如下图所示:

编译及安装QCA类库及使用_第7张图片

我们在命令行下输入qcatool2 plugins命令,会显示出当前QCA可用的提供者,由于目前我们还没有安装任何的提供者库,所以在“Available Providers”一栏中是空的。要使用加解密算法,我们必须要安装一个提供者——qca-ossl。


安装qca-oosl

上面我们完成了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文件,如下图所示:

编译及安装QCA类库及使用_第8张图片

(图二)

在执行qmake的时候报错了,提示信息中描述了未找到一个叫“winlocal.prf”的文件。网上有对此问题的解释,不过经过我的测试,网上的那种解决方法还是有点小复杂。所以这里介绍一个比较简单的方法。其实这个错误的根源就是这个提供者库是依赖openssl库的,所以在对其进行编译的时候一定要告诉它openssl的头文件和库文件的路径。之前我们已经安装过OpenSSL了,在我的系统中其安装目录为:C:\OpenSSL,只要先创建一个叫winlocal.prf的文件,然后在该文件中配置一个叫WINLOCAL_PREFIX变量并将OpenSSL的安装路径赋值给这个变量即可(其实只要打开qca-ossl.pro文件看一下就明白是这么回事了)。winlocal.prf文件需要放在%QTDIR%\mkspecs\features目录中。下图为winlocal.prf文件的内容:

编译及安装QCA类库及使用_第9张图片

(图三)

这里要注意一点,就是路径分隔符要使用unix格式的,不能使用windows下的格式。然后继续执行qmake命令,如下图所示:

编译及安装QCA类库及使用_第10张图片

(图四)

这次不再报错了,但是有警告。这是由于路径分隔符的缘故造成的,打开%QTDIR%\mkspecs\features目录下的crypto.prf文件,将第一行和第二行中的windows路径分隔符改成unix路径分隔符(即将“\”改成“/”即可),再次执行qmake命令,如下图所示:

(图五)

这次不再报任何错误和警告了。我们开始编译源代码,输入make命令,如下图所示:

编译及安装QCA类库及使用_第11张图片

(图六)

这次是编译报错,提示信息说“EVP_md2没有定义”。网上查询了一下,的确存在这个问题,原来是我们的OpenSSL版本太高,有些函数名称已经发生变更了。好吧,那我们就用预编译指令来屏蔽它,这里有一个修改之后的源文件,点击这里下载。将其覆盖原来的文件,再次输入make指令,如下图所示:

编译及安装QCA类库及使用_第12张图片

(图七)

如果看到上图中的内容,则表示提供者库编译成功了,会在D:\qca\qca-ossl-2.0.0-beta3\lib目录中生成动态库文件,如下图所示:

编译及安装QCA类库及使用_第13张图片

(图八)

其中包含了release版本和debug版本的动态库文件(文件名中带“d”就是Debug版本)。最后将qca-ossl2.dll和qca-ossld2.dll复制到%QTDIR%\plugins\crypto目录中即可(如果没有crypto目录则自己创建一个),将libqca-ossl2.a和libqca-ossl2d.a文件复制到%QTDIR%\lib目录中即可。

到此,我们就完成了QCA框架以及提供者加密库的编译和安装。接下去,我们仍然用qcatool2工具来测试一下,安装和配置是否正确,如下图所示:

编译及安装QCA类库及使用_第14张图片

(图九)

从上图红框中可以看到,之前这栏是<none>,现在已经有可用的提供者了,这表示QCA已经完全安装和配置成功了。如果要看一下该提供者支持哪些加密算法,我们可以输入:qcatool2 plugins --debug命令,如下图所示:

编译及安装QCA类库及使用_第15张图片

(图十)

红色框中的就是该提供者支持的所有加密算法(由于窗口大小的关系,这里没有显示完全)。另外,我们可以看到其中有个错误,就是在加载qca-ossld2.dll时失败了,这是由于这个DLL是Debug版本的,该工具不支持而已,我们可以忽略之。


方法二:
Follow below steps: 

1. download qca-2.0.3.tar.bz2 and qca-ossl-2.0.0-beta3.tar.bz2
2. open pro file in each project, build them with Qt Creator respectively
(note, build them always in release mode, because we don't want to debug them later and release mode can avoid some build issues)
===build qca:=== 
1) folow instructions in INSTALL file, run command "configure.exe --qtdir=d:\work\cpp\program\QtSDK\Desktop\Qt\4.7.4\mingw\"
2) open pro file by Qt Creator, build
===build qca-ossl(qca-ossl depends on qca project build and OpenSSL head/library)===
0)install microsoft visual c++ redistributable
1)install OpenSSL for windows
http://www.slproweb.com/products/Win32OpenSSL.html
Win32 OpenSSL v1.0.0g16MB Installer
2)create folder local in C:\ root, create sub folder bin,include and lib
3)copy OpenSSL include and lib files to C:\local, rename C:\local\lib\*.a to *.lib
4)create winlocal.prf by command "echo "WINLOCAL_PREFIX = C:/local" > %QTDIR%\mkspecs\features\winlocal.prf"
5) copy %QCADIR%/crypto.prf to  %QTDIR%\mkspecs\features
6) download qca-ossl.cpp from http://www.essentialunix.org/downloads/qca-ossl.cpp, (this version works)
7) open cmd.exe, folow README file, execute command "configwin.bat r" and "qmake"(this will generate moc file)
8) open pro file in Qt Creator, find line "LIBS += -L$$OPENSSL_PREFIX/lib/", add "MinGW" behind this line
9)open pro file by Qt Creator, build
10)Done! you will get qca-ossl2.dll under folder lib
notes:
when you get errors like "cannot find file -lqcad", 
try to edit crypto.prf file find that string and change them to correct one
(note, qca souce debug mode will add letter 'd' after each library name)
3. copy lib/*.dll from each project to D:\work\cpp\program\QtSDK\Desktop\Qt\4.7.4\mingw\plugins\crypto
4. add CONFIG+=crypto.prf in your pro file
5. copy libeay32.dll,ssleay32.dll,qca2.dll,qca-ossl2.dll to your project/debug(or release) folder.
6. copy folder qca-2.0.3\include\QtCrypto to your project folder, you need include QtCrypto header file in your source.
7. Done!

我要说的是上面这两种方法要结合着使用,没有哪种方法保证是一定行得通的!
第二种方法中说的qca-ossl的安装一定要和openssl结合,并且一定要选择合适的版本,如果qca-ossl你选择的qca-ossl-2.0.0-beta3版本,那么安装 OpenSSL 0.9.8y版本在这里http://slproweb.com/products/Win32OpenSSL.html你可以找到已经编译好的openssl,一路next即可,否则在编译qca-ossl时会出错,例如某某函数或变量没有定义之类的错误,这是openssl的版本太高了,要换成低版本。
下面如何使用Qt加密解密类库 QCA (Qt Cryptographic Architecture)

这个类库是基于插件结构开发的,不同的加密方法会使用到不同的插件,而每个插件又需要单独编译,比较麻烦,具体如何编译类库与插件这里就省略了。直接提供给大家编译好的版本;类库会用到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进行初始化

 参考:

  •  Qt Cryptographic Architecture (QCA)
         http://delta.affinix.com/qca/ 
  • Using libraries: QCA (Qt Cryptographic Architecture) 

         http://www.essentialunix.org/index.php?option=com_content&view=article&id=48:qcatutorial&catid=34:qttutorials&Itemid=53 

  •  OpenSSL Project

         http://www.openssl.org/

http://www.cnblogs.com/andy65007/archive/2012/02/27/2370374.html
http://blog.csdn.net/jacktan/article/details/17488731

你可能感兴趣的:(编译及安装QCA类库及使用)