一、背景
为使用AES加密库(AES/CBC加解密),选用Crypto ++库(官网)。
最新Crypto C++库依次为:8.8.0版本(2023-6-25)、8.7.0(2022-8-7)和8.6.0(2021-9-24)。
网上实践的最新版本为8.6.0(2023-1-30),其中提到8.7.0使用有问题,但没有描述具体问题。
二、思路 & 尝试
笔者在其他工程中用到过8.7.0版本(基于vcpkg,较重),但基于上述博主的提示,暂按下8.7.0版本而使用8.6.0。
步骤(有调整和优化)如下:
1. 下载crypto++ 8.6.0代码并unzip生成工程文件夹 → cryptopp860.zip 2. 设置环境变量PATH,添加qmake和mingw32-make到全局路径验证:qmake -v 位置:<QT_HOME>\5.15.2\mingw81_64\bin\qmakeg++ -v 位置:<QT_HOME>\Tools\mingw810_64\bin\mingw32-make.exe3. 创建工程文件(cryptopp860.pro)qmake -project 4. 编辑pro文件(cryptopp860.pro)① TEMPLATE从【app】改为【lib】② 添加定义和标识DEFINES += CRYPTOPPLIB_LIBRARYQMAKE_CXXFLAGS += "-msse4.2"QMAKE_CXXFLAGS += "-mavx"QMAKE_CXXFLAGS += "-mavx2"QMAKE_CXXFLAGS += "-mpclmul"QMAKE_CXXFLAGS += "-maes"QMAKE_CXXFLAGS += "-msha"③ 剔除工程文件中的 TestPrograms/xxx 项5. 删除工程文件夹中的GNUmakefile文件del GNUmakefile 6. 编译qmake mingw32-make all 或 mingw32-make -j4(多线程、编译得快) 或直接使用Qt Creator IDE加载工程进行编译。
编译过程基本正常,将得到两个文件:cryptopp860.dll 和 libcryptopp860.a(请注意文件大小)。如图:
三、问题 & 对策
但是在引用该动态链接库时出现异常,错误信息为:
Crypto++ DLL integrity check may fail. Expected module base address is 0x42900000, but module loaded at 0x6dd40000.
Crypto++ DLL in-memory integrity check failed. This may be caused by debug breakpoints or DLL relocation.
Crypto++ DLL integrity check failed. Actual MAC is: 93318****AE8FF3****41D4****ADECE3****F2D.Exception caught: FileStore: error opening file for reading: TestData/usage.dat
经调试是动态链接库加载的问题,其中【TestData/usage.dat】为测试用数据。
怀疑夹杂了其他的测试代码······继续剔除无用的测试代码单元(并同时从工程文件中剔除):
① 所有含test(不区分大小写)的文件夹(TestData、TestPrograms、TestVectors)。
② 所有含test、bench、validat字样的.cpp和.h文件。
③ 可选,所有vc或vs工程文件(.vcxproj)
再次编译得到的链接库信息如图:
对比可见.a文件“清爽”了不少。再次集成,一切正常。
四、集成引用动态链接库
在demo工程的.pro文件添加引用指令:
INCLUDEPATH += $$PWD/cryptopp870 # 引用工程中新建文件夹cryptopp870,用于存放头文件
LIBS += -L$$PWD -lcryptopp870 # .dll 和 .a 文件放置于工程文件夹中
demo工程结构如下:
自此,Qt编译及集成Crypto++ 8.7.0 的问题已解决。
具体包装Crypto++ 8.7.0库的代码,在后续介绍。
四、结论
虽然基于源代码编译得到动态库的方式比较“透明”,但也考验使用者对代码的掌控能力。
Crypto++ 8.7.0版本代码的编译问题结症在于混杂了测试、验证代码,从而导致动态库无法加载。
相关下载:
8.7.0版本的qt工程版本下载地址,该工程直接可使用Qt Creator IDE打开加载。
8.7.0版本的动态链接库MinGW 64 bit下载地址,该动态链接库可直接集成到其他Qt工程。
有关包装Crypto++ 8.7.0库的代码,在后续介绍。