Qt实现DES ECB加密解密
环境:Windows11 64位
工具链:MinGW32
IDE:Qt 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_cblock,8位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::vector<unsigned 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(n>0)个字节才对齐,那么填充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::vector<unsigned 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/125120888
- https://blog.csdn.net/YinShiJiaW/article/details/106220932
- https://www.cnblogs.com/rockyching2009/p/14989873.html
- https://www.codenong.com/cs106278466/
相关文章:
Qt实现DES ECB加密解密
环境:Windows11 64位 工具链:MinGW32 IDE:Qt 5.14 Qt使用DES加密需要用到OpenSSL库,首先要确定当前使用的Qt所支持的SSL版本。编译OpenSSL 查看当前Qt对OpenSSL的支持情况 qDebug() << QSslSocket::supportsSsl();返回 tr…...
拼多多新阶段,透露出不寻常
一个企业的特质,往往由这个企业的领导人所决定。 企业文化本质上就是领导人文化,领导人的风格会决定这个企业当下的现状。一个成功的大企业,往往需要不同的领导人来接替完成其发展使命。 在创业期,企业领导人需要的是勇气、执行…...
使用底层代码(无框架)实现卷积神经网络理解CNN逻辑
首先将数据集放入和底下代码同一目录中,然后导入一些相关函数的文件cnn_utils.py: import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.python.framework import ops def load_data…...
PID单环控制(位置环)
今天我们来聊一聊pid如何控制轮子转动位置 前期准备调试过程 前期准备 需要准备的几个条件: 1.获取实时编码器的计数值 2.写好pid控制算法的函数 3.设定好时间多久执行一次pid计算,并设置限幅输出。 4.多久执行一次pid输出 接下来我们看看这几个部分的…...
内存基础知识
概述 内存可存放数据。程序执行前需要先将外存中的数据放到内存中才能被CPU处理,因为CPU处理速度过快,而从硬盘读取数据较慢,所以内存是为了缓和CPU和硬盘之间的读取速度矛盾 在多道程序环境下,系统中会有多个程序并发执行&…...
快速入门matlab——运算方法
这是一个matlab神经网络的简单应用,主要用于预测光伏出力,输入为温度湿度等因素,输出为光伏出力 基于Matlab和CPLEX的2变量机组组合调度程序 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果 …...
2009.03-2022.06华证ESG季度评级(季度)
2009.03-2022.06华证ESG评级(季度) 1、时间:2009.03-2022.06.15 2、来源:整理自Wind 3、指标:华证ESG(只有综合评级,无细分评级数据) 4、样本数量:A股4800多家公司 …...
【大数据模型】LeonardoAi让心中所想跃然纸上
汝之观览,吾之幸也! 本文主要聊聊LeonardoAi绘图工具 一、注册Discord账号 不管LeonardoAi还是midjourney,都需要注册一个Discord账号,Discord是一个社区软件,在这里可以进行讨论和交流使用心得 LeonardoAi官网地址 …...
如何区别BI、大数据、信息化和数字化转型
商业智能BI可以实现业务流程和业务数据的规范化、流程化、标准化,打通ERP、OA、CRM等不同业务信息系统,整合归纳企业数据,利用数据可视化满足企业不同人群对数据查询、分析和探索的需求,从而为管理和业务提供数据依据和决策支持。…...
ESP32-C2开发板Homekit例程
准备 1.1硬件ESP32 C2开发板,如图1-1所示 图1-1 ESP32 C2开发板 1.2软件 CozyLife APP可以在各大应用市场搜索下载,也可以扫描二维码下载如图1-2所示 HomeKit flash download tool 烧录工具 esp32c2 homkit演示固件 烧录教程 打开flash_download_to…...
快速搭建一个 Kubernetes+Crane 环境,以及如何基于 Crane 优化你的集群和应用初体验
文章目录 一、活动介绍二、环境搭建三、安装本地的 Kind 集群和 Crane 组件四、界面截图五、主要功能六、整体架构七、Crane的优势八、总结参考文献 一、活动介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目,遵循 FinOps 标准,…...
深度学习图像识别模型:递归神经网络
深度学习是一种人工智能技术,它用于解决各种问题,包括自然语言处理、计算机视觉等。递归神经网络(Recurrent Neural Network,RNN)是深度学习中的一种神经网络模型,主要用于处理序列数据,例如文本…...
上门家教预约小程序开发 良师就在你身边
社会的发展科技的进步让人们对教育的重视度也逐渐升高,很多家长可以说是为了孩子的教育操碎了心。在学校还好有老师辅导,节假日在家的时候,很多家长自己本身文化知识有限或者工作繁忙没有时间辅导,送去辅导班来回接送又很麻烦&…...
CMake Practice 学习笔记五--cmake常用变量
这里列举一些cmake常用变量,后面带**表示常用,了解下,不用全部记住。 1、CMAKE_BINARY_DIR PROJECT_BINARY_DIR ** <projectname>_BINARY_DIR 这三个变量指代的内容是一样的,如果是 in source 编译,指的就是工程顶层目…...
Facebook 广告效果越来越差,怎么办?
在如今的数字营销领域中,Facebook作为独立站卖家首选的推广引流平台,具备了许多优势。 一方面,Facebook拥有庞大的用户数量,是全球最大的社交媒体平台之一。另一方面,Facebook的广告算法可以将广告推送给更加精准的受…...
Netty核心组件模块(三)
1.Netty心跳检测机制 1>.编写网络应用的时候,客户端和服务器端需要通过心跳检测机制来判断对方是否还存活,如果发生了异常,那么需要进行相应的处理; 1.1.案例–编程实现Netty的心跳检测机制 1.1.1.需求 ①.当服务器超过3秒没有读时,就提示读空闲; ②.当服务器超过5秒没有…...
k8s 集群搭建详细教程
参考: Kubernetes 文档 / 入门 / 生产环境 / 使用部署工具安装 Kubernetes / 使用 kubeadm 引导集群 / 安装 kubeadm B. 准备开始 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令每…...
国有行面试:掌握这11个测评要素
银行笔试期一结束,面试也接连不断。大家做好拿下offer的准备了吗?回顾过往银行面试,半结构化和无领导题型备受考官喜爱,“有备无患,方能走向远方”,银行面试备考,了解掌握面试本质测评要素&…...
云视如何实现流量转化
云视如何实现流量转化 大家好我是小鱼 小伙伴很好奇 云视除了直播带货 打赏,广告 还有哪些方式 可以实现流量转化 今天我和大家分享一下这个话题 接下来我们要讲讲 我们要用的工具 优惠券 适用于刺激消费回流,构建闭环消费圈。 课程赠送 趣味推广营销&am…...
Metersphere+jar+beanshell+连接linux
Meterspherejarbeanshell连接linux java编写连接linux代码 使用jsch连接linux,下载jsch包或者使用maven <dependencies><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55<…...
Tsung动态变量高级用法:从数据提取到循环测试的完整教程
Tsung动态变量高级用法:从数据提取到循环测试的完整教程 【免费下载链接】tsung Tsung is a high-performance benchmark framework for various protocols including HTTP, XMPP, LDAP, etc. 项目地址: https://gitcode.com/gh_mirrors/ts/tsung Tsung是一款…...
Sparrow App快速上手:5分钟学会API测试和调试
Sparrow App快速上手:5分钟学会API测试和调试 【免费下载链接】sparrow-app Your next-gen API testing and development tool. 项目地址: https://gitcode.com/gh_mirrors/sp/sparrow-app Sparrow App是一款下一代API测试和开发工具,能帮助开发者…...
3月热门科技产品:功能亮点与市场潜力解析
三星Galaxy S26手机壳:轻薄与保护的完美结合在3月的热门产品中,Spigen Tough Armor MagFit三星Galaxy S26手机壳和Pitaka Edge三星Galaxy S26手机壳备受关注。Spigen的这款手机壳足够轻薄,不会让手机显得笨重,同时采用减震衬垫&am…...
SDMatte镜像CI/CD实践:GitOps驱动的模型更新与服务发布
SDMatte镜像CI/CD实践:GitOps驱动的模型更新与服务发布 1. 项目背景与价值 SDMatte是一款面向高质量图像抠图的AI模型,特别擅长处理复杂边缘和半透明物体的提取任务。在电商、设计、内容创作等领域,快速高效的图像抠图能力可以显著提升工作…...
Maomi.In | .NET 全能多语言解决方案八
AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Advan…...
还在手写网页?CMS才是高效建站的正确打开方式
在网站开发的早期阶段,手写网页是主流方式。开发者需手动编写HTML、CSS、JavaScript等代码,从页面结构搭建到内容填充,每个环节都需要逐行编码。这种方式在技术层面具有极高的自主性,适合小型静态页面或对代码细节有极致要求的场景…...
MedGemma应用案例:如何用药企医学影像标注辅助系统提升研究效率?
MedGemma应用案例:如何用药企医学影像标注辅助系统提升研究效率? 1. 医学影像标注的行业痛点 在药物研发和医学研究中,医学影像标注是一项基础但极其耗时的工作。传统标注流程面临三大核心挑战: 人工成本高:需要专业…...
基于springboot林业资源管理系统设计与实现_2595688s_c014
前言 随着全球生态环境保护意识的增强,林业资源管理作为生态保护与可持续发展的重要环节,其信息化、智能化水平直接影响管理效率与决策科学性。传统林业管理依赖人工巡查、纸质记录,存在数据更新滞后、信息孤岛、资源监管困难等问题。基于Spr…...
如何快速掌握TensorFlow模块化架构:开发者终极指南
如何快速掌握TensorFlow模块化架构:开发者终极指南 【免费下载链接】community Stores documents used by the TensorFlow developer community 项目地址: https://gitcode.com/gh_mirrors/community1/community TensorFlow作为全球最流行的机器学习框架&…...
sgayadgsdvwdc
一、OpenAI 1.OpenAI是什么简单来说,OpenAI 大模型 是由美国人工智能公司 OpenAI 开发的一系列大型语言模型(LLMs) 。你可以把它们想象成拥有巨大“知识储备”和“学习能力”的超级大脑,它们被训练用来理解和生成人类语言…...
