当前位置: 首页 > news >正文

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使用的默认源在国外,所以下载东西非常慢,需要自己更改成国内的源。

  1. 打开安装目录下的 \etc\pacman.d 可以看到下图中红框中的三个文件
    在这里插入图片描述
  2. 用记事本打开 mirrorlist.msys ,在文本的最上面加上这句代码
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
  1. 同理使用记事本打开 mirrorlist.mingw32 ,在最上面增加
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
  1. 修改 mirrorlist.mingw64 ,同理在最上面增加
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
  1. 在安装路径下找到msys.exe打开,执行下面指令更新
pacman -Syu

配置msys2的MinGW环境

我需要编译的是32位的OpenSSL,需要安装mingw32的环境。

  1. 在安装目录下打开mingw32.exe。
  2. 打开后先用pacman -Syu指令,更新一下下载列表(防止还是用旧的源)。
  3. 下载C++编译所需文件。
pacman -S mingw-w64-i686-toolchain
  1. 安装gcc
pacman -S gcc
  1. 安装make
pacman -S make

编译源码生成动态库

  1. 进入openssl的文件夹
cd openssl-1.1.1d/
  1. 配置编译环境
./config -shared
  1. 编译(等待个几分钟)
make

编译过程中会有很多警告,无视即可,然后在\openssl-1.1.1d\test就能找到两个动态库(libcrypto-1_1.dll和libssl-1_1.dll)。

使用Qt调用OpenSSL

新建测试项目

  1. 在源码路径下新建libs和openssl文件夹
  2. 复制libcrypto-1_1.dl和libssl-1_1.dll到libs文件夹下
  3. 复制openssl-1.1.1k/include目录到openssl文件夹下

配置工程.pro文件

  1. 添加引用库
LIBS += -L$$PWD/libs/ -llibcrypto-1_1 -llibssl-1_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;
}

在这里插入图片描述

附:项目源码

参考链接:

  1. https://blog.csdn.net/l1206715877/article/details/125120888
  2. https://blog.csdn.net/YinShiJiaW/article/details/106220932
  3. https://www.cnblogs.com/rockyching2009/p/14989873.html
  4. https://www.codenong.com/cs106278466/

相关文章:

Qt实现DES ECB加密解密

环境&#xff1a;Windows11 64位 工具链&#xff1a;MinGW32 IDE&#xff1a;Qt 5.14 Qt使用DES加密需要用到OpenSSL库&#xff0c;首先要确定当前使用的Qt所支持的SSL版本。编译OpenSSL 查看当前Qt对OpenSSL的支持情况 qDebug() << QSslSocket::supportsSsl();返回 tr…...

拼多多新阶段,透露出不寻常

一个企业的特质&#xff0c;往往由这个企业的领导人所决定。 企业文化本质上就是领导人文化&#xff0c;领导人的风格会决定这个企业当下的现状。一个成功的大企业&#xff0c;往往需要不同的领导人来接替完成其发展使命。 在创业期&#xff0c;企业领导人需要的是勇气、执行…...

使用底层代码(无框架)实现卷积神经网络理解CNN逻辑

首先将数据集放入和底下代码同一目录中&#xff0c;然后导入一些相关函数的文件cnn_utils.py&#xff1a; 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如何控制轮子转动位置 前期准备调试过程 前期准备 需要准备的几个条件&#xff1a; 1.获取实时编码器的计数值 2.写好pid控制算法的函数 3.设定好时间多久执行一次pid计算&#xff0c;并设置限幅输出。 4.多久执行一次pid输出 接下来我们看看这几个部分的…...

内存基础知识

概述 内存可存放数据。程序执行前需要先将外存中的数据放到内存中才能被CPU处理&#xff0c;因为CPU处理速度过快&#xff0c;而从硬盘读取数据较慢&#xff0c;所以内存是为了缓和CPU和硬盘之间的读取速度矛盾 在多道程序环境下&#xff0c;系统中会有多个程序并发执行&…...

快速入门matlab——运算方法

这是一个matlab神经网络的简单应用&#xff0c;主要用于预测光伏出力&#xff0c;输入为温度湿度等因素&#xff0c;输出为光伏出力 基于Matlab和CPLEX的2变量机组组合调度程序 基于MATLABCPLEX 的机组最优组合&#xff0c;成功求解表格化&#xff0c;图示化的机组组合结果 …...

2009.03-2022.06华证ESG季度评级(季度)

2009.03-2022.06华证ESG评级&#xff08;季度&#xff09; 1、时间&#xff1a;2009.03-2022.06.15 2、来源&#xff1a;整理自Wind 3、指标&#xff1a;华证ESG&#xff08;只有综合评级&#xff0c;无细分评级数据&#xff09; 4、样本数量&#xff1a;A股4800多家公司 …...

【大数据模型】LeonardoAi让心中所想跃然纸上

汝之观览&#xff0c;吾之幸也&#xff01; 本文主要聊聊LeonardoAi绘图工具 一、注册Discord账号 不管LeonardoAi还是midjourney&#xff0c;都需要注册一个Discord账号&#xff0c;Discord是一个社区软件&#xff0c;在这里可以进行讨论和交流使用心得 LeonardoAi官网地址 …...

如何区别BI、大数据、信息化和数字化转型

商业智能BI可以实现业务流程和业务数据的规范化、流程化、标准化&#xff0c;打通ERP、OA、CRM等不同业务信息系统&#xff0c;整合归纳企业数据&#xff0c;利用数据可视化满足企业不同人群对数据查询、分析和探索的需求&#xff0c;从而为管理和业务提供数据依据和决策支持。…...

ESP32-C2开发板Homekit例程

准备 1.1硬件ESP32 C2开发板&#xff0c;如图1-1所示 图1-1 ESP32 C2开发板 1.2软件 CozyLife APP可以在各大应用市场搜索下载&#xff0c;也可以扫描二维码下载如图1-2所示 HomeKit flash download tool 烧录工具 esp32c2 homkit演示固件 烧录教程 打开flash_download_to…...

快速搭建一个 Kubernetes+Crane 环境,以及如何基于 Crane 优化你的集群和应用初体验

文章目录 一、活动介绍二、环境搭建三、安装本地的 Kind 集群和 Crane 组件四、界面截图五、主要功能六、整体架构七、Crane的优势八、总结参考文献 一、活动介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目&#xff0c;遵循 FinOps 标准&#xff0c;…...

深度学习图像识别模型:递归神经网络

深度学习是一种人工智能技术&#xff0c;它用于解决各种问题&#xff0c;包括自然语言处理、计算机视觉等。递归神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是深度学习中的一种神经网络模型&#xff0c;主要用于处理序列数据&#xff0c;例如文本…...

上门家教预约小程序开发 良师就在你身边

社会的发展科技的进步让人们对教育的重视度也逐渐升高&#xff0c;很多家长可以说是为了孩子的教育操碎了心。在学校还好有老师辅导&#xff0c;节假日在家的时候&#xff0c;很多家长自己本身文化知识有限或者工作繁忙没有时间辅导&#xff0c;送去辅导班来回接送又很麻烦&…...

CMake Practice 学习笔记五--cmake常用变量

这里列举一些cmake常用变量&#xff0c;后面带**表示常用&#xff0c;了解下&#xff0c;不用全部记住。 1、CMAKE_BINARY_DIR PROJECT_BINARY_DIR ** <projectname>_BINARY_DIR 这三个变量指代的内容是一样的&#xff0c;如果是 in source 编译,指的就是工程顶层目…...

Facebook 广告效果越来越差,怎么办?

在如今的数字营销领域中&#xff0c;Facebook作为独立站卖家首选的推广引流平台&#xff0c;具备了许多优势。 一方面&#xff0c;Facebook拥有庞大的用户数量&#xff0c;是全球最大的社交媒体平台之一。另一方面&#xff0c;Facebook的广告算法可以将广告推送给更加精准的受…...

Netty核心组件模块(三)

1.Netty心跳检测机制 1>.编写网络应用的时候,客户端和服务器端需要通过心跳检测机制来判断对方是否还存活,如果发生了异常,那么需要进行相应的处理; 1.1.案例–编程实现Netty的心跳检测机制 1.1.1.需求 ①.当服务器超过3秒没有读时,就提示读空闲; ②.当服务器超过5秒没有…...

k8s 集群搭建详细教程

参考&#xff1a; Kubernetes 文档 / 入门 / 生产环境 / 使用部署工具安装 Kubernetes / 使用 kubeadm 引导集群 / 安装 kubeadm B. 准备开始 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令每…...

国有行面试:掌握这11个测评要素

银行笔试期一结束&#xff0c;面试也接连不断。大家做好拿下offer的准备了吗&#xff1f;回顾过往银行面试&#xff0c;半结构化和无领导题型备受考官喜爱&#xff0c;“有备无患&#xff0c;方能走向远方”&#xff0c;银行面试备考&#xff0c;了解掌握面试本质测评要素&…...

云视如何实现流量转化

云视如何实现流量转化 大家好我是小鱼 小伙伴很好奇 云视除了直播带货 打赏&#xff0c;广告 还有哪些方式 可以实现流量转化 今天我和大家分享一下这个话题 接下来我们要讲讲 我们要用的工具 优惠券 适用于刺激消费回流&#xff0c;构建闭环消费圈。 课程赠送 趣味推广营销&am…...

Metersphere+jar+beanshell+连接linux

Meterspherejarbeanshell连接linux java编写连接linux代码 使用jsch连接linux&#xff0c;下载jsch包或者使用maven <dependencies><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55<…...

物联网与云技术赋能咖啡后处理:CeriTech 的实时监控系统实践

1. 项目概述&#xff1a;用物联网与云技术重塑咖啡后处理在印尼的咖啡农场里&#xff0c;传统的发酵与干燥过程很大程度上依赖“感觉”和“经验”。一位有经验的农人可能会用手触摸、用鼻子闻&#xff0c;或者根据天气和日照时间来估算发酵是否完成、干燥是否均匀。这种方法固然…...

6款高效降AI率工具 改写实力出众

写论文时反复检测出的AI痕迹总让你提心吊胆&#xff1f;别担心&#xff0c;这里整理了6款真正好用的论文降AI率工具&#xff0c;堪称应对AI生成特征的“得力助手”。它们能有效识别并消除AI生成的痕迹&#xff0c;改写能力出众&#xff0c;帮你快速降低查重率&#xff0c;顺利通…...

半导体元件(二极管/三极管/MOS管/IC)损坏诊断全解

半导体元件&#xff08;二极管、三极管、MOS 管、集成电路&#xff09;是 PCB 的核心功能单元&#xff0c;对过压、过流、ESD、高温极度敏感&#xff0c;损坏后直接导致电路功能失效、短路烧板。很多工程师维修时盲目更换芯片&#xff0c;不仅成本高&#xff0c;还易误判。​一…...

rk35xx 通过recovery升级问题

Firefly 的 recovery 库是一个核心组件&#xff0c;它构建了一个独立的微型 Linux 系统&#xff0c;专门用于在设备主系统之外执行高可靠性的固件升级。简单来说&#xff0c;它的工作流程是&#xff1a;主系统通过命令触发&#xff0c;将升级指令写入特定分区并重启&#xff1b…...

Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路

Python UiAutomation实战&#xff1a;打通数据采集全链路的智能解决方案 在数据驱动的商业环境中&#xff0c;企业常常面临跨平台数据采集的挑战——财务系统里的交易记录需要与网站后台的报表进行交叉分析&#xff0c;销售数据要从桌面软件导出后上传到云端处理系统。传统的人…...

PCL 法向量夹角剔除错误匹配点对【2026最新版】

目录 一、 算法简介 1、主要函数 2、参考文献 二、 代码实现 三、 结果展示 四、 参考链接 博客长期更新,本文最新更新时间为:2026年5月24日。代码在PCL1.15.1中测试通过 一、 算法简介 在三维点云配准中,对应点(correspondence)的准确性直接决定了配准算法的精度和鲁棒性…...

独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何利用Taotoken Token Plan&#xff0c;以更低成本启动AI项目 对于独立开发者或小型团队而言&#xff0c;启动一个集成…...

PS5 NOR Modifier深度解析:如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版

PS5 NOR Modifier深度解析&#xff1a;如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版 【免费下载链接】PS5NorModifier The PS5 Nor Modifier is an easy to use Windows based application to rewrite your PS5 NOR file. This can be useful if your NOR is corru…...

Hermes Agent工具如何自定义接入Taotoken提供商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent工具如何自定义接入Taotoken提供商 Hermes Agent 是一款功能强大的AI智能体开发框架&#xff0c;它支持通过自定义提供…...

利用 Taotoken 多模型能力为智能客服场景提供备份路由

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用 Taotoken 多模型能力为智能客服场景提供备份路由 智能客服系统是许多企业与用户交互的关键入口&#xff0c;其响应能力和服务…...