《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.rhkb.cn/news/360330.html

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

相关文章

java版CRM客户关系管理系统Spring Cloud alibaba Spring Boot成长型企业必备的客户关系管理系统

鸿鹄CRM客户关系管理系统是一款基于Java语言开发的CRM系统&#xff0c;采用了Spring Cloud Alibaba、Spring Boot、MybatisPlus、Redis和VUE3 ElementUI等技术&#xff0c;构建了一个微服务架构。该系统具有以下功能模块&#xff1a; 一、待办事项 1、今日需联系客户&#xf…

python根据excel的文件创建文件夹

这几天要整理一点文档&#xff0c;需要批量生成一些文件夹&#xff0c;&#xff08;其实也可以进一步自动生成各种文档&#xff09;&#xff0c;用到了py的功能&#xff0c;在此记录一下。 1.准备工作 需要两个库支持openpyxl和os 安装 pip install openpyxl2.代码思路 打算…

KubeSphere 在互联网电商行业的应用实践

来自社区用户&#xff08;SRE运维手记&#xff09;投稿 背景 在云原生的时代背景下&#xff0c;Kubernetes 已经成为了主流选择。然而&#xff0c;Kubernetes 的原生操作复杂性和学习曲线较高&#xff0c;往往让很多团队在使用和管理上遇到挑战。因此&#xff0c;市面上出现了…

乌班图Ubuntu 24.04初始化MySQL报错error while loading shared libraries: libaio.so.1

由于乌班图24.04 LTS已经发布了&#xff0c;因此准备新业务逐步往这上面迁移&#xff0c;毕竟支持有效期比22.04更长 准备在24.04上进行MySQL的初始化&#xff0c;因为习惯自定义安装存储目录&#xff0c;所以使用mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz这个最新的二进制版…

【面试实战】# 并发编程之线程池配置实战

1.先了解线程池的几个参数含义 corePoolSize (核心线程池大小): 作用: 指定了线程池维护的核心线程数量&#xff0c;即使这些线程处于空闲状态&#xff0c;它们也不会被回收。用途: 核心线程用于处理长期的任务&#xff0c;保持最低的线程数量&#xff0c;以减少线程的创建和…

【Unity拖拽物体】实现对点中的3D物体进行拖拽的功能

场景结构&#xff0c;两个普通模型 第一种 脚本所挂载的物体才可以被拖拽 【PC鼠标版本】 using UnityEngine;// 这个脚本实现了&#xff0c;本脚本所在的游戏物体能够被拖拽 public class DragObjectT : MonoBehaviour {private Vector3 screenPoint; // 存储物体在屏幕上的位…

docker基础使用教程

1.准备工作 例子&#xff1a;工程在docker_test 生成requirements.txt文件命令&#xff1a;&#xff08;使用参考链接2&#xff09; pip list --formatfreeze > requirements.txt 参考链接1&#xff1a; 安装pipreqs可能比较困难 python 项目自动生成环境配置文件require…

【C语言】解决C语言报错:Invalid Pointer

文章目录 简介什么是Invalid PointerInvalid Pointer的常见原因如何检测和调试Invalid Pointer解决Invalid Pointer的最佳实践详细实例解析示例1&#xff1a;未初始化的指针示例2&#xff1a;已释放的指针示例3&#xff1a;返回局部变量的指针示例4&#xff1a;野指针 进一步阅…

5个wordpress成品站主题

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题&#xff0c;适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外…

汉语翻译藏语软件,这几款软件不妨一试!

在全球化日益加深的今天&#xff0c;语言障碍成为了许多人在文化交流、商务洽谈或旅游探险中不得不面对的问题。特别是对于汉语和藏语这两种语言来说&#xff0c;由于其独特的文化背景和语法结构&#xff0c;翻译起来更是难上加难。不过&#xff0c;好在科技的进步为我们带来了…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

图书管理系统(详解版 附源码)

目录 项目分析 实现页面 功能描述 页面预览 准备工作 数据准备 创建数据库 用户表 创建项目 导入前端页面 测试前端页面 后端代码实现 项目公共模块 实体类 公共层 统一结果返回 统一异常处理 业务实现 持久层 用户登录 用户注册 密码加密验证 添加图书…

Mac 安装HomeBrew(亲测成功)

1、终端安装命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"执行后&#xff0c;没有安装git&#xff0c;会先安装&#xff0c;安装后再执行一下命令。 2、根据中文选择源安装 3、相关命令 查看版本号&a…

本地服务怎么发布成rpc服务

目录 1.引入 2.user.proto 3.userservice.cc 1.引入 example文件夹作为我们框架项目的使用实例&#xff0c;在example文件夹下创建callee和caller两个文件夹 callee是RPC服务的提供者。在callee创建一个文件&#xff1a;userservice.cc 我们有没有这样一个框架&#xff0c;把…

【面试题】MySQL数据库

目录 什么是视图&#xff0c;视图的作用是什么&#xff1f;什么是索引&#xff1f;MySQL中有哪些类型的索引&#xff1f;简述索引设计原则&#xff1f;简述索引的数据结构&#xff1f;简述Hash 和 B 树索引的区别&#xff1f;列出MySQL中导致索引失效的情况&#xff1f;简述数据…

mysql窗口函数排名查询 与 连续出现的数字查询

排名查询 学会这一个查询&#xff0c;我们应该对该类型的查询 方法就能有一个了解&#xff0c;不然 如果下次遇到该类型的查询&#xff0c;我们依然分析不出 给你一张表&#xff0c;里面有id 和score字段&#xff0c;根据score的分数大小 排序 &#xff0c;假如有相同的分数&…

【山东】2024年夏季高考文化成绩一分一段表

文末有图片版&#xff0c;可直接保存下载&#xff01;&#xff01; 2024年夏季高考文化成绩一分一段表分数段全体-选考物理-选考化学-选考生物-选考思想政治-选考历史-选考地理分数段本段人数累计人数本段人数累计人数本段人数累计人数本段人数累计人数本段人数累计人数本段人…

Upload-Labs-Linux1 使用 一句话木马

解题步骤&#xff1a; 1.新建一个php文件&#xff0c;编写内容&#xff1a; <?php eval($_REQUEST[123]) ?> 2.将编写好的php文件上传&#xff0c;但是发现被阻止&#xff0c;网站只能上传图片文件。 3.解决方法&#xff1a; 将php文件改为图片文件&#xff08;例…

毕业生离校系统

摘 要 随着信息技术的快速发展和普及&#xff0c;越来越多的高校开始利用信息化手段来提升管理和服务效率。毕业生离校是高校管理工作中的一个重要环节&#xff0c;涉及到毕业生的个人信息、学业成绩、离校手续等多个方面。传统的离校流程往往繁琐、耗时&#xff0c;且容易出现…

Apple - Framework Programming Guide

本文翻译自&#xff1a;Framework Programming Guide&#xff08;更新日期&#xff1a;2013-09-17 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183i 文章目录 一、框架编程指南简介…