《QT从基础到进阶·七十二》基于Qt开发的文件保险柜工具并支持文件各种加密和解密

1、概述
源码放在文章末尾

该项目实现了文件各种加密和解密的功能,能够有效的保障文件的安全,主要包含如下功能:
1、支持所有 AES 密钥长度;
AES_128
AES_192
AES_256
2、支持ECB、CBC、CFB、OFB四种模式;
3、支持ZERO、PKCS7、ISO三种填充方式;
4、支持md5文件损毁检测
5、支持输入任意长度密钥进行加解密;
6、将.bmp格式图片加密后可正常打开图片,不破坏图片格式。

项目截图效果如下所示:
(1)文件加密
在这里插入图片描述
(2)文件解密
在这里插入图片描述

(3)bmp图片加密
在这里插入图片描述

项目部分代码如下所示:

#ifndef FILEENCRYPTION_H
#define FILEENCRYPTION_H#include <QObject>
#include "qaesencryption.h"class FileEncryption : public QObject
{Q_OBJECT
public:explicit FileEncryption(QObject *parent = nullptr);void setFile(const QString& strIn, const QString& strOut);void setKey(const QByteArray& key);void setEncryption(bool flag);void setAESParameter(QAESEncryption::Aes aes, QAESEncryption::Mode mode, QAESEncryption::Padding padding);void stop();                        // 停止signals:void start();                       // 开始void showLog(QString log);          // 日志private:void startEncryption();void encryption();void decrypt();bool readFile(const QString& fileName);void dataOperation();void check();bool writeFile(const QString& fileName);void clear();private:QString m_strIn;          // 输入文件路径QString m_strOut;         // 输出文件路径QString m_fileSuffix;     // 文件后缀QByteArray m_key;         // 密钥QByteArray m_iv;          // 偏移bool m_encryption = true;QAESEncryption::Aes m_aes;QAESEncryption::Mode m_mode;QAESEncryption::Padding m_padding;QByteArray m_dataIn;     // 输入内容QByteArray m_dataOut;    // 输出内容QByteArray m_md5;        // MD5值QByteArray m_head;       // bmp图片的文件信息
};#endif // FILEENCRYPTION_H
#include "fileencryption.h"#include <QDir>
#include <QFileInfo>
#include <QImage>
#include <qcryptographichash.h>
#include <qdebug.h>
#include <qfile.h>
#include <qthread.h>FileEncryption::FileEncryption(QObject *parent) : QObject(parent)
{connect(this, &FileEncryption::start, this, &FileEncryption::startEncryption);for(int i = 0; i < 16; i++){m_iv.append((uchar)i);}
}/*** @brief         设置输入输出文件路径* @param strIn   输入文件路径* @param strOut  输出文件路径*/
void FileEncryption::setFile(const QString& strIn, const QString& strOut)
{if(!strIn.isEmpty() && !strOut.isEmpty()){this->m_strIn = strIn;this->m_strOut = strOut;QFileInfo info(strIn);m_fileSuffix = info.suffix();}
}/*** @brief      设置使用的密钥* @param key*/
void FileEncryption::setKey(const QByteArray &key)
{this->m_key = key;
}/*** @brief        设置加密或者解密* @param flag   true:加密 false:解密*/
void FileEncryption::setEncryption(bool flag)
{this->m_encryption = flag;
}/*** @brief           设置AES加解密参数* @param aes* @param mode* @param padding*/
void FileEncryption::setAESParameter(QAESEncryption::Aes aes, QAESEncryption::Mode mode, QAESEncryption::Padding padding)
{this->m_aes = aes;this->m_mode = mode;this->m_padding = padding;
}/*** @brief 加解密操作*/
void FileEncryption::startEncryption()
{clear();emit showLog("开始输入原文件!");if(readFile(m_strIn)){emit showLog("文件读取完成!");if(m_encryption){encryption();}else{decrypt();}if(writeFile(m_strOut)){emit showLog("数据写入成功!");}clear();}else{emit showLog("输入文件读取失败!");}
}/*** @brief 加密*/
void FileEncryption::encryption()
{QAESEncryption encryption(m_aes, m_mode, m_padding);emit showLog("开始加密!");if(m_mode == QAESEncryption::ECB){m_dataOut.append(encryption.encode(m_dataIn, m_key));}else{m_dataOut.append(encryption.encode(m_dataIn, m_key, m_iv));}m_dataOut.insert(0, m_head);m_dataOut.append(m_md5);emit showLog("加密完成,开始写入!");}/*** @brief  解密*/
void FileEncryption::decrypt()
{QAESEncryption encryption(m_aes, m_mode, m_padding);emit showLog("开始解密!");if(m_mode == QAESEncryption::ECB){m_dataOut.append(encryption.decode(m_dataIn, m_key));}else{m_dataOut.append(encryption.decode(m_dataIn, m_key, m_iv));}m_dataOut = encryption.removePadding(m_dataOut);        // 移除填充数据m_dataOut.insert(0, m_head);emit showLog("解密完成,开始写入!");check();
}/*** @brief           读取文件内容* @param fileName*/
bool FileEncryption::readFile(const QString &fileName)
{QFile file(fileName);if(file.open(QIODevice::ReadOnly)){m_dataIn = file.readAll();file.close();dataOperation();return true;}else{emit showLog(QString("%1打开失败!").arg(fileName));return false;}
}/*** @brief 操作数据内容*/
void FileEncryption::dataOperation()
{// 获取md5值if(m_encryption){m_md5 = QCryptographicHash::hash(m_dataIn, QCryptographicHash::Md5).toHex();}else                  // 解密时读取md5值{m_md5 = m_dataIn.mid(m_dataIn.count() - 32, 32);m_dataIn.remove(m_dataIn.count() - 32, 32);}// 读取bmo文件头信息if(m_fileSuffix.compare("bmp", Qt::CaseInsensitive) == 0){m_head = m_dataIn.mid(0, 54);        // bmp文件头:共14字节;位图信息头:共40字节;m_dataIn.remove(0, 54);}
}/*** @brief  使用md5校验文件是否损毁*/
void FileEncryption::check()
{QByteArray arr = QCryptographicHash::hash(m_dataOut, QCryptographicHash::Md5).toHex();if(arr == m_md5){emit showLog("文件未损毁!");}else{emit showLog("文件存在不同,可能已损毁!");}
}/*** @brief           写文件内容* @param fileName* @param data*/
bool FileEncryption::writeFile(const QString &fileName)
{QFileInfo info(fileName);QString filePath = info.absolutePath();QDir dir;if(!dir.exists(filePath)){dir.mkpath(filePath);}QFile file(fileName);if(file.open(QIODevice::WriteOnly)){file.write(m_dataOut);file.close();return true;}else{emit showLog(QString("%1打开失败!").arg(fileName));return false;}
}/*** @brief 清空数据*/
void FileEncryption::clear()
{m_dataIn.clear();m_dataOut.clear();m_head.clear();m_md5.clear();
}

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的配置文件,即:src->main->resources的配置

目录 1、properties 标签 1.1 mybatis-config.xml 1.2 db.properties 1.3 在SqlMapConfig.xml 中 引入数据库配置信息 2、typeAliases 标签 2.1 定义别名 2.2 使用别名 3、Mappers标签 作用&#xff1a;用来在核心配置文件中引入映射文件 引入方式&#xff0c;有以下…

AI 已经在污染互联网了。。赛博喂屎成为现实

大家好&#xff0c;我是程序员鱼皮。这两年 AI 发展势头迅猛&#xff0c;更好的性能、更低的成本、更优的效果&#xff0c;让 AI 这一曾经高高在上的技术也走入大众的视野&#xff0c;能够被我们大多数普通人轻松使用&#xff0c;无需理解复杂的技术和原理。 其中&#xff0c;…

爆赞!24年GitHub首本Python开发实战背记手册,标星果然百万名不虚传

Python (发音:[ paiθ(ə) n; (US) paiθɔn ] n. 蟒蛇&#xff0c;巨蛇 )&#xff0c;是一种面向对象的解释性的计算机程序设计语言&#xff0c;也是一种功能强大而完善的通用型语言&#xff0c;已经具有十多年的发展历史&#xff0c;成熟且稳定。Python 具有脚本语言中最丰富…

新火种AI|实属罕见!四大AI顶流同台,有哪些关键信息值得关注?

作者&#xff1a;小岩 编辑&#xff1a;彩云 在有着“AI春晚”之称的2024年智源大会上&#xff0c;非常难得的一幕出现了&#xff1a;当下国内的四大AI顶流公司——月之暗面&#xff0c;百川智能&#xff0c;智谱AI&#xff0c;面壁智能齐聚一堂&#xff0c;十分罕见的同台了…

天地图 uniapp使用笔记

官网地址&#xff1a;天地图API 效果&#xff1a; <template><view><!-- 显示地图的DOM节点 --><view id"container" class"content"></view><!-- END --><!-- 数据显示 --><h3>城市名称(IP属地)&#x…

Fisnar Liquid Control 操作维修手LC Pump Manual Twinmixer Maintenance 中文

Fisnar Liquid Control 操作维修手LC Pump Manual Twinmixer Maintenance 中文

Jquery 正则匹配字母、数字、-

Jquery 正则匹配字母、数字、- Jquery正则方式一Jquery正则方式二 本文主要讲述页面日常开发过程中需要校验输入参数时&#xff0c;采用正则校验的方式的使用方法&#xff0c;一共有两种形式&#xff0c;其中本文用到的正则公式主要是匹配字母、数字、中横线如下 Jquery正则方式…

DAY03 HTML

文章目录 一 表格1. 表格的语法2. 表格的可选标记3. 不规则的单元格&#xff08;合并单元格&#xff09;4. 表格的属性5. 表格的大小 二 列表1. 有序列表2. 无序列表3. 属性4. 列表的嵌套5. 定义列表【了解】 三 表单(重点)1. 表单的语法2. 表单的控件分类3. input元素4. selec…

智慧工地系统源码,支持项目级、公司级、集团级多级权限划分,支持PC端、手机端

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

Deflate内部实现(LZ77无损压缩算法)超详细图解算法版~

无损压缩算法 第一阶段&#xff1a;重复消除 — LZ77无损压缩算法算法介绍举例压缩算法思路图解压缩过程 第二阶段&#xff1a;位减少huffman位减少 概览 Gzip Deflate 编码&#xff08;LZ77哈夫曼&#xff09; Brotli LZ77哈夫曼二阶上下文建模 Deflate 分两个阶段压缩数据…

【Linux】Centos升级到国产操作系统OpenAnolis

一、前言 Anolis OS 7生态上和依赖管理上保持跟CentOS7.x兼容&#xff0c;一键式迁移脚本centos2anolis.py&#xff0c;实现CentOS7.x到Anolis OS 7的平滑迁移 使用迁移脚本前需要注意如下事项&#xff1a; 迁移涉及到软件包的重新安装&#xff0c;是不可逆过程&#xff0c;…

基于SpringBoot的社区医院管理服务系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;Eclipse&#xff0c;Navicat&#xff0c;Maven…

如何提高PMC在异常停线情况下的应急处理能力?

在工业生产中&#xff0c;异常停线是一个常见且令人头疼的问题。它不仅会导致生产进度受阻&#xff0c;还可能造成资源浪费和成本增加。因此&#xff0c;提高PMC&#xff08;生产计划与控制&#xff09;在异常停线情况下的应急处理能力&#xff0c;对于确保生产线的稳定运行和提…

晨持绪科技:抖音小店的前景究竟怎么样

随着移动互联网的迅猛发展&#xff0c;短视频平台快速崛起并逐渐成为人们日常生活中不可或缺的一部分。作为国内领先的短视频平台&#xff0c;抖音在近年推出了“抖音小店”功能&#xff0c;为商家提供了一个新兴的、流量巨大的电商渠道。这一功能的推出不仅改变了传统的购物方…

算法期末整理

一 算法概述 算法的概念 通俗地讲&#xff0c;算法是指解决问题的一种方法或一个过程。更严格地讲&#xff0c;算法是由若干条指令组成的有穷序列。 算法的性质 1.输入&#xff1a;有0个或多个由外部提供的量作为算法的输入。 2.输出&#xff1a;算法产生至少一个量作为输出。…

跨境电商必备?揭秘原生IP的作用

一、什么是原生IP&#xff1f; 原生IP&#xff08;Native IP&#xff09;是指由互联网服务提供商&#xff08;ISP&#xff09;或服务器提供商直接分配给用户的IP地址&#xff0c;这种IP地址直接与用户设备或网络相连&#xff0c;也就是指这个IP的注册地址和服务器机房所在的国…

某宝APP参数通过SDK把APP参数转URL参数链接方法

app里参数无法在电脑端或者在没有XX宝的手机里支付, 所以需要转成H5参数进行代付操作 出某xx宝 支付sdk转h5链接方式算法

爆赞!GitHub首本Python开发实战背记手册,标星果然百万名不虚传

Python (发音:[ paiθ(ə) n; (US) paiθɔn ] n. 蟒蛇&#xff0c;巨蛇 )&#xff0c;是一种面向对象的解释性的计算机程序设计语言&#xff0c;也是一种功能强大而完善的通用型语言&#xff0c;已经具有十多年的发展历史&#xff0c;成熟且稳定。Python 具有脚本语言中最丰富…

安防监控视频平台LntonAIServer视频智能分析平台烟火检测

LntonAIServer烟火检测技术是一种先进的技术&#xff0c;它结合了人工智能的强大能力&#xff0c;专门用于识别和检测烟雾或火焰的存在。这种技术在现代社会的许多领域中都发挥着至关重要的作用&#xff0c;尤其是在安全监控和火警预警系统等关键领域&#xff0c;它的应用更是不…

Advanced RAG 08:使用 Self-RAG 打造高质量、可追溯的 RAG System

编者按&#xff1a; RAG 技术通过检索并利用外部知识源&#xff0c;能够较为有效地提升生成内容的准确性和多样性。然而&#xff0c;经典 RAG 流程也存在一些不足&#xff0c;例如不必要的检索会浪费计算资源&#xff0c;并可能引入无关内容或错误信息&#xff0c;影响生成质量…