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<…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
