Qt使用OpenSSL库

一直想找一个Qt能用的加解密库,QCA如雷贯耳,网上资料较少,并且试了很多次支持Qt5-openssl的QCA都编译不出来,Botan据说是Qt自带,然而去Github找Qt 3rdparth下Botan源码的时候发现其似乎只支持到Qt4,强行下载下来进行编译,也出现一堆错误。于是就萌生了自己使用C++加解密库集成到Qt的想法。

首先想到的就是OpenSSL,因为我在VC项目上使用过,有一些应用的经验,并且网上还提供了安装包,不用自己从源码开始编译。

测试环境:windows 10 x64,Qt5.7.0,OpenSSL 1.1.0c

下载地址:这里,选择最新版本的32位完整版,安装很快,主意最后一个安装界面默认勾选了捐献,不差钱的可以选上

测试例子可以参考这里,值得注意的有以下几点:
1. OpenSSL从1.1.0开始已经更改了库的名字,不再是libeay32,ssleay32,而是libcrypto和libssl,pro文件修正为

LIBS += -L"D:/software/OpenSSL-Win32/lib" -llibcrypto
LIBS += -L"D:/software/OpenSSL-Win32/lib" -llibssl;
INCLUDEPATH += $$quote(D:/software/OpenSSL-Win32/include)

2. sha256函数中的string相连语句在Qt5.7.0运行产生不同的结果,修正为newString = newString + std::string(buf);之后正常,完整代码为

std::string sha256(const std::string str) {
    char buf[2];
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, str.c_str(), str.size());
    SHA256_Final(hash, &sha256);
    std::string newString = "";
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        sprintf(buf,"%02x",hash[i]);
        newString = newString + std::string(buf);
    }
    return newString;
}