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

【window QT开发】简易的对称密钥加解密工具(包含图形应用工具和命令行工具)

前言

        项目开发时,配置文件中某些信息不适合直接明文显示,本文提供基于对称密钥的AES-256算法的加解密工具,可集成到项目中。

AES讲解

以下是我分享的一个在国产信创系统(Linux)下使用openssl实现AES加解密的博文

对称加密--AES加解密

本文使用的aes-256是高安全性的算法,对称密钥不泄露,别人很难破解。

QT图形应用效果图

内容和对称密钥都支持中英文。

命令行工具效果图

命令行工具,方便项目中通过调用第三方应用获取打印信息来获取加/解密的结果。

源码讲解

本文的源码引用的是第三方源码QT-AES,只需要把以下两个文件拷贝到QT项目与main.cpp同级目录即可

另外,编写一个实现调用功能的头文件(qaes_openssl.h),如下所示

#ifndef QAES_OPENSSL_H
#define QAES_OPENSSL_H
// qaes_openssl.h
#include <QByteArray>
#include <QCryptographicHash>
#include <QRandomGenerator>
#include "qaesencryption.h"class QAesOpenssl {
public:static QByteArray encrypt(const QByteArray &data, const QString &password) {// 生成随机saltQByteArray salt = generateSalt(8);// 生成密钥和IVKeyIV keyiv = generateKeyIV(password.toUtf8(), salt);// 使用修正后的QAESEncryption接口QAESEncryption aes(QAESEncryption::AES_256, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray encrypted = aes.encode(data, keyiv.key, keyiv.iv);// 组合Salted头return ("Salted__" + salt + encrypted).toBase64();}static QByteArray decrypt(const QByteArray &data, const QString &password) {QByteArray decoded = QByteArray::fromBase64(data);// 提取salt和密文if (!decoded.startsWith("Salted__") || decoded.size() < 16) {return QByteArray();}QByteArray salt = decoded.mid(8, 8);QByteArray cipherData = decoded.mid(16);// 生成密钥和IVKeyIV keyiv = generateKeyIV(password.toUtf8(), salt);QAESEncryption aes(QAESEncryption::AES_256, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray decrypted = aes.decode(cipherData, keyiv.key, keyiv.iv);// 手动移除PKCS#7填充(核心修复)const int AES_BLOCK_SIZE = 16;if (!decrypted.isEmpty()) {char lastChar = decrypted.back();if (lastChar > 0 && lastChar <= AES_BLOCK_SIZE) {if (decrypted.right(lastChar).count(lastChar) == lastChar) {decrypted.chop(lastChar);}}}return decrypted;}private:struct KeyIV {QByteArray key;QByteArray iv;};static QByteArray generateSalt(int length) {QByteArray salt;salt.resize(length);QRandomGenerator::global()->fillRange(reinterpret_cast<quint32*>(salt.data()),length / sizeof(quint32));return salt;}static KeyIV generateKeyIV(const QByteArray &password, const QByteArray &salt) {QByteArray keyivData;QByteArray md5Hash;QCryptographicHash md5(QCryptographicHash::Md5);const int keySize = 32; // AES-256const int ivSize = 16;  // IV for CBCconst int required = keySize + ivSize;while (keyivData.size() < required) {md5.reset();if (!md5Hash.isEmpty()) {md5.addData(md5Hash);}md5.addData(password);md5.addData(salt);md5Hash = md5.result();keyivData.append(md5Hash);}return {keyivData.left(keySize),keyivData.mid(keySize, ivSize)};}
};
#endif // QAES_OPENSSL_H

引用代码如下

#include "qaes_openssl.h"QString password=ui->pwd_lineEdit->text();
QString plainText=ui->src_textEdit->toPlainText();{// 加密QByteArray encrypted = QAesOpenssl::encrypt(plainText.toUtf8(), password);QString encryptedstr = QString::fromUtf8(encrypted);//qDebug() << "Encrypted Base64:" << encryptedstr;}{// 解密QByteArray decrypted = QAesOpenssl::decrypt(plainText.toUtf8(), password);QString decryptedstr = QString::fromUtf8(decrypted);qDebug() << "decrypted Base64:" << decryptedstr;
}
http://www.xdnf.cn/news/8455.html

相关文章:

  • esp32-idf框架学习笔记/教程
  • 力扣509题:斐波那契数列的解法与代码注释
  • pytdx数据获取:在线获取和离线获取(8年前的东西,还能用吗?)
  • RESTful API 在前后端交互中的作用与实践
  • 晶圆隐裂检测提高半导体行业效率
  • Python之PyCharm安装及使用教程
  • MySQL强化关键_015_存储过程
  • YOLOv8检测头代码详解(示例展示数据变换过程)
  • 【信息系统项目管理师】第17章:项目干系人管理 - 43个经典题目及详解
  • PyTorch高阶技巧:构建非线性分类器与梯度优化全解析​
  • 2025电工杯:光伏电站发电功率日前预测问题 第一问基于历史功率的光伏电站发电特性 -完整matlab代码
  • I.MX6ULL_Linux_系统篇(26) buildroot分析
  • Python 大模型知识蒸馏详解,知识蒸馏大模型,大模型蒸馏代码实战,LLMs knowledge distill LLM
  • stm32上拉电阻,1K,4.7K,5.6K,10K怎么选?
  • 职业规划:动态迭代的系统化路径
  • javaScirpt学习第五章(函数)-第一部分
  • 【Web前端】JavaScript入门与基础(一)
  • WebStorm 高效快捷方式全解析
  • 11.5 Python+LangGraph智能代理开发:节点设计与业务流实战全解析
  • 【通用智能体】smolagents/open_deep_research:面向开放式研究的智能体开发框架深度解析
  • Vue3 对象转换
  • 七:操作系统文件系统之目录结构
  • 【Elasticsearch】创建别名的几种方式
  • 算法打卡第五天
  • 三、如何优化opengl在gpu上的渲染性能
  • 「EMD/EEMD/VMD 信号分解方法 ——ECG信号处理-第十四课」2025年5月23日
  • 每日Prompt:虚拟世界游
  • Linux性能监控:工具与最佳实践
  • Vue.js教学第十二章:Vue Router实战指南(二)
  • C++ 日志系统实战第六步:性能测试