当前位置: 首页 > 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<…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

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 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...