西乡移动网站建设,seo网站排名全选,wordpress 文章id,怎么发外链环境#xff1a;Windows11 64位 工具链#xff1a;MinGW32 IDE#xff1a;Qt 5.14 Qt使用DES加密需要用到OpenSSL库#xff0c;首先要确定当前使用的Qt所支持的SSL版本。编译OpenSSL
查看当前Qt对OpenSSL的支持情况
qDebug() QSslSocket::supportsSsl();返回 tr… 环境Windows11 64位 工具链MinGW32 IDEQt 5.14 Qt使用DES加密需要用到OpenSSL库首先要确定当前使用的Qt所支持的SSL版本。编译OpenSSL
查看当前Qt对OpenSSL的支持情况
qDebug() QSslSocket::supportsSsl();返回 true 则表示系统支持OpenSSL返回 false 表示系统不支持OpenSSL。
查看Qt所支持的OpenSSL版本
OpenSSL在版本兼容性问题上是出了名的所以必须要搞清楚自己所用Qt版本所支持的OpenSSL版本。用如下代码进行OpenSSL版本查看 qDebug() QSslSocket::sslLibraryBuildVersionString();下载对应版本的OpenSSL
根据自己操作系统的种类以及位数下载对应的OpenSSL版本下载地址如下
OpenSSL官网下载地址
编译源码
本篇文章主要讲解的是MinGW编译方法需要用到msys2。
下载安装msys2
推荐使用清华的镜像网站下载速度快。 官网网址不推荐 清华镜像推荐 选择一个版本下载我选择的是20220503的版本。 下载源码后将源码解压到 msys\home\用户名\路径下。
更改msys2的下载源
刚下载的msys2使用的默认源在国外所以下载东西非常慢需要自己更改成国内的源。
打开安装目录下的 \etc\pacman.d 可以看到下图中红框中的三个文件 用记事本打开 mirrorlist.msys 在文本的最上面加上这句代码
Server https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch同理使用记事本打开 mirrorlist.mingw32 在最上面增加
Server https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686修改 mirrorlist.mingw64 同理在最上面增加
Server https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64在安装路径下找到msys.exe打开执行下面指令更新
pacman -Syu配置msys2的MinGW环境
我需要编译的是32位的OpenSSL需要安装mingw32的环境。
在安装目录下打开mingw32.exe。打开后先用pacman -Syu指令更新一下下载列表防止还是用旧的源。下载C编译所需文件。
pacman -S mingw-w64-i686-toolchain安装gcc
pacman -S gcc安装make
pacman -S make编译源码生成动态库
进入openssl的文件夹
cd openssl-1.1.1d/配置编译环境
./config -shared编译等待个几分钟
make编译过程中会有很多警告无视即可然后在\openssl-1.1.1d\test就能找到两个动态库libcrypto-1_1.dll和libssl-1_1.dll。
使用Qt调用OpenSSL
新建测试项目
在源码路径下新建libs和openssl文件夹复制libcrypto-1_1.dl和libssl-1_1.dll到libs文件夹下复制openssl-1.1.1k/include目录到openssl文件夹下
配置工程.pro文件
添加引用库
LIBS -L$$PWD/libs/ -llibcrypto-1_1 -llibssl-1_1添加头文件路径
INCLUDEPATH $$PWD/openssl/include编写代码
我测试的是DES ECB方式解密解密需要引用相应的头文件
#include openssl/des.h// 加密函数
// 加密 ecb模式
QByteArray DesEcb::des_encrypt(const std::string clearText, const std::string key)
{// DES加密分为两个阶段// 第一阶段是设置密钥从密钥生成DES_key_schedule// 第二阶段是实际加密std::string cipherText; // 密文// 第一阶段设置密钥// DES的密钥类型是DES_cblock8位DES_cblock keyEncrypt;memset(keyEncrypt, 0, 8);// 构造补齐后的密钥if(key.length() 8)memcpy(keyEncrypt, key.c_str(), key.length());elsememcpy(keyEncrypt, key.c_str(), 8);// 密钥置换DES_key_schedule keySchedule;DES_set_key_unchecked(keyEncrypt, keySchedule);//DES_set_key_checked(keyEncrypt, keySchedule);// 第二阶段实际加密// 循环加密每8字节一次const_DES_cblock inputText; // 加密前的输入8字节DES_cblock outputText; // 加密后的输出std::vectorunsigned char vecCiphertext; // 加密后的密文unsigned char tmp[8]; // 记录加密过程中的数据块的数据for(int i 0; i clearText.length() / 8; i) {memcpy(inputText, clearText.c_str() i * 8, 8);DES_ecb_encrypt(inputText, outputText, keySchedule, DES_ENCRYPT);memcpy(tmp, outputText, 8);for(int j 0; j 8; j)vecCiphertext.push_back(tmp[j]);}// PkCs5padding填充模式// 数据块大小固定为8数据长度// 需要填充n(n0)个字节才对齐那么填充n个字节每个字节都是n// 如果数据本身就已经对齐了则填充一块长度为块大小的数据每个字节都是块大小8if(clearText.length() % 8 0) {//PkCs5paddingmemset(inputText, 8, 8);// 加密函数DES_ecb_encrypt(inputText, outputText, keySchedule, DES_ENCRYPT);memcpy(tmp, outputText, 8);for(int j 0; j 8; j)vecCiphertext.push_back(tmp[j]);}if(clearText.length() % 8 ! 0) {// PkCs5paddingint tmp1 clearText.length() / 8 * 8;int tmp2 clearText.length() - tmp1;int padNumber 8 - tmp2;//最后一个需要补齐的数据块需要补齐的位数memset(inputText, padNumber, 8);memcpy(inputText, clearText.c_str() tmp1, tmp2); //最后一个补齐的数据块// 加密函数DES_ecb_encrypt(inputText, outputText, keySchedule, DES_ENCRYPT); //DES_ENCRYPT代表加密memcpy(tmp, outputText, 8);for(int j 0; j 8; j)vecCiphertext.push_back(tmp[j]);}cipherText.clear();cipherText.assign(vecCiphertext.begin(), vecCiphertext.end());QByteArray tempArray;foreach (auto var, vecCiphertext) {tempArray.append(var);}return tempArray;
}// 解密
std::string DesEcb::des_decrypt(const std::string cipherText, const std::string key)
{std::string clearText; // 明文DES_cblock keyEncrypt;memset(keyEncrypt, 0, 8);if(key.length() 8)memcpy(keyEncrypt, key.c_str(), key.length());elsememcpy(keyEncrypt, key.c_str(), 8);DES_key_schedule keySchedule;DES_set_key_unchecked(keyEncrypt, keySchedule);const_DES_cblock inputText;DES_cblock outputText;std::vectorunsigned char vecCleartext;unsigned char tmp[8];for(int i 0; i cipherText.length() / 8; i) {memcpy(inputText, cipherText.c_str() i * 8, 8);DES_ecb_encrypt(inputText, outputText, keySchedule, DES_DECRYPT); //DES_DECRYPT代表解密memcpy(tmp, outputText, 8);for (int j 0; j 8; j) {if(tmp[j] 31) //31是什么意思vecCleartext.push_back(tmp[j]);}}if(cipherText.length() % 8 ! 0) {int tmp1 cipherText.length() / 8 * 8;int tmp2 cipherText.length() - tmp1;memset(inputText, 0, 8);memcpy(inputText, cipherText.c_str() tmp1, tmp2);// 解密函数DES_ecb_encrypt(inputText, outputText, keySchedule, DES_DECRYPT);memcpy(tmp, outputText, 8);for(int j 0; j 8; j)vecCleartext.push_back(tmp[j]);}clearText.clear();clearText.assign(vecCleartext.begin(), vecCleartext.end());return clearText;
}附项目源码
参考链接
https://blog.csdn.net/l1206715877/article/details/125120888https://blog.csdn.net/YinShiJiaW/article/details/106220932https://www.cnblogs.com/rockyching2009/p/14989873.htmlhttps://www.codenong.com/cs106278466/