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。(64位的就打开mingw64.exe)
- 打开后先用pacman -Syu指令,更新一下下载列表(防止还是用旧的源)。
- 下载C++编译所需文件。
系统 | 指令 | 程序 |
---|---|---|
32位 | pacman -S mingw-w64-i686-toolchain | 在mingw32.exe下打开输入的指令 |
64位 | pacman -S mingw-w64-x86_64-toolchain | 在mingw64.exe下打开输入的指令 |
- 安装gcc(此处mingw64和mingw32一致)
pacman -S gcc
- 安装make(此处mingw64和mingw32一致)
pacman -S make
编译源码生成动态库
- 打开mingw32.exe(如果要编译64位就打开ming64.exe)
- 进入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加密解密相关推荐
- Android 平台DES IV 加密解密随笔
Android 平台DES IV 加密解密随笔 DES加密接触过好多次了,但总容易忘,和服务器交互时,加出来不一致后面能解密成功但是头部是乱码导致小坑了一会,这次记录下来~ 根据网上资料和自己的理解, ...
- DES的加密解密在ECB上的使用(C语言实现)——大三密码学实验
目录 实验内容 实验原理 DES加密解密 ECB(电码本模式) 代码 DES函数的构建 RE_DES函数的构建 ECB函数的构建 RE_ECB的函数的构建 主函数的构建 总代码 测试结果 实验内容 输 ...
- js des加密 java_java JS DES互相加密解密 通用!!!
如果 出现 异常 javax.crypto.IllegalBlockSizeException 那就看我博客园的 另外一篇 解决这个异常 帮客户整了1天 试了N个JS 的方法 终于找我弄出来了! j ...
- android des ecb加密_Android逆向 | 基础知识篇 01
常见加密算法 编码 Base64 所有的数据都能被编码为只用65个字符就能表示的文本. 标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n).不论每行是否满76个字符,都要添加一 ...
- vue使用DES模式加密解密,包括Java加密解密
前端加密解密 1.安装:npm install crypto-js 2.在utils下创建一个cryptoAES.js import CryptoJS from 'crypto-js';//与后端约定 ...
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- VC实现数据的加密和解密(MD5加密/DES/RSA加密解密)
VC实现数据的加密和解密 由于生产实习的时间有限,加上自己这段时间致力于考研,因此,仅仅是实现了通过MD5/DES/RSA的简单的字符串的加密解密,希望有兴趣的兄弟姐妹能够完善它. 主要的程序如下: ...
- DES 算法加密/解密源码
//复制粘贴即可使用 class Program{static void Main(string[] args){string value = null;string jeiguo = null;wh ...
- Go Nodejs Java Aes 128 ECB加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...
最新文章
- vivo U1正式亮相
- 通俗讲解 RESTful
- 005 vim程序编辑器
- (最短路)HDU Today(hdu2112)
- [java理论篇]--java的面向对象
- 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)...
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- Atitit it法学论 uke协会it刑法attilax总结 目录 1. 法学plus	1 1.1. 替换表	1 2. 第一章 刑法概说	1 2.1. 财产	1 3. Line 65: 第四章 犯
- flask页面中Head标签内容为空问题
- win8普通版连接远程桌面---RDPWrap
- 039.有符号数除法
- 李沐基于Pytorch的深度学习笔记(1)
- 将PNG序列帧图片合成视频
- mac 下搭建paly framework体验(环境搭建)
- chrome插件,常用插件,必备插件,黑科技
- Linux内核变量中per-CPU的使用
- 组合设计会更灵活,速度更快。
- 微软Chromium Edge浏览器发布,附带Edge浏览器下载地址!
- Arcgis操作系列15 - 西安80/wgs84转2000
- 重装win10之后,双系统grub消失,ubuntu无法进入,(ubuntu的grub引导损坏)解决方法