简易的遍历文件加密解密

功能描述
将生成的可执行程序放在指定的文件夹内,双击后将该目录下所有文件包括子文件夹内文件全部加密,再次双击运行后将进行解密。
加密解密实现
主要运用了异或与取反操作,异或:两个值不同为1,相同为0。取反就是将该数的二进制按位变为与原相反的数,即1变为0,0变为1。例如:
在这里插入图片描述
程序:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <queue>
#include <windows.h>
#include <string.h>#define DATASIZE 4096
#define XOR      0xab
#define TEMP_FILE "a_b_c_d.txt"   //临时文件using namespace std;class EncryptionAndDecrypt 
{
public:EncryptionAndDecrypt(){fp_src = nullptr;fp_tar = nullptr;memset(file_data, 0, DATASIZE);file_path = new char[MAX_PATH];}~EncryptionAndDecrypt(){delete[] file_path;}void GetFilePath(){char str[MAX_PATH] = { 0 };GetCurrentDirectory(MAX_PATH, file_path);//将路径存放在file_path中GetModuleFileName(NULL, str, MAX_PATH);//获取当前可执行程序文件名(绝对路径)EXE_Path = str;int pos = EXE_Path.rfind('\\');EXE_Path = EXE_Path.substr(pos + 1, EXE_Path.size() - pos - 1);//提取可执行程序文件名findFile(file_path);}void findFile(char* pathName)//查找文件{char findFileName[MAX_PATH] = { 0 };sprintf(findFileName, "%s\\*.*", pathName);WIN32_FIND_DATA findData;HANDLE hFile = FindFirstFile(findFileName, &findData);if (INVALID_HANDLE_VALUE == hFile){cout << "没有文件!" << endl;return;}int ret = 1;char temp[MAX_PATH];while (ret){if (findData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)//判断是否为文件夹{if (findData.cFileName[0] != '.'){//进入文件夹中遍历里面的文件memset(temp, 0, MAX_PATH);//清空数组sprintf(temp, "%s\\%s", pathName, findData.cFileName);cout << "文件夹:" << temp << endl;//遍历文件夹里面的文件findFile(temp);}}else      //是普通文件{memset(temp, 0, MAX_PATH);if ((strstr(findData.cFileName, EXE_Path.c_str()) == NULL) && (strstr(findData.cFileName, TEMP_FILE) == NULL))//将本执行程序文件与临时文件除外{sprintf(temp, "%s\\%s", pathName, findData.cFileName);cout << "文件:" << temp << endl;file_queue.push(temp);//将文件的绝对路径入队}}//继续找下一个文件,没有找到则退出循环ret = FindNextFile(hFile, &findData);}}void EncryptionOrDecrypt_File()//加密文件或解密文件{while (!file_queue.empty())//判断当前队列中是否有数据{FilePath = file_queue.front();//获取队列数据cout << "开始处理文件:" << FilePath << endl;GenerateTargetFile();fp_src = fopen(FilePath.c_str(), "rb");//二进制读原文件fp_tar = fopen(FilePath_Target.c_str(), "wb");//二进制写临时文件while (!feof(fp_src)){int ret=fread(file_data,1,DATASIZE, fp_src);//从原文件中读取数据for (int i = 0;i < DATASIZE;i++){file_data[i] = ~(file_data[i] ^ XOR);//将读到的每一个数据进行异或取反}fwrite(file_data,1,ret, fp_tar);//将加密或解密后的数据写入临时文件memset(file_data, 0, ret);}DealFile();file_queue.pop();//出队}}void GenerateTargetFile()//生成一个临时文件{int pos = FilePath.rfind('\\');FilePath_Target = FilePath.substr(0, pos+1);FilePath_Target.append(TEMP_FILE);}void DealFile()//处理掉临时文件{fclose(fp_src);fclose(fp_tar);remove(FilePath.c_str());//删除原文件rename(FilePath_Target.c_str(), FilePath.c_str());//将临时文件改名为原文件名}
private:char file_data[DATASIZE];//读出数据存储区string FilePath;//原文件路径string FilePath_Target;//临时文件路径string EXE_Path;//可执行程序文件名FILE *fp_src;//原文件指针FILE *fp_tar;//临时文件指针char *file_path;//当前目录路径(绝对路径)
protected:queue<string> file_queue;//存储所有文件路径的队列
};int main()
{EncryptionAndDecrypt EAD;EAD.GetFilePath();EAD.EncryptionOrDecrypt_File();return 0;
}

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

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

相关文章

安卓手机使用linux(含图形界面)——Aid Learning

以前再安卓手机上使用linux系统都是使用Termux&#xff0c;安装上很麻烦&#xff0c;而且还是黑乎乎的窗口&#xff0c;没有图形界面&#xff0c;对于初学linux者来说并不友好&#xff0c;而Aid Learning就更人性化了&#xff0c;他是一种模拟的linux,其安装十分简易&#xff0…

简易花式流水灯

先看看效果 具体思路 实现流水灯的效果其实就是控制相应的I/O口&#xff0c;以P2为例&#xff0c;通过有规律的改变P2各I/O口的状态就可实现相应规律的流水灯效果&#xff0c;这其中需要用到与、或、异或、左移、右移等操作。   流水灯向左闪烁点亮就是将P2最低位的1不断左移…

STM32——直流电机PI调速

所需元件 STM32F103开发板、L298N一个、带编码器的直流电机一个&#xff08;如下图所示&#xff0c;淘宝上有很多&#xff09; 系统框图 通过系统框图&#xff0c;我们需要做两件事&#xff0c;一是要测速&#xff0c;二是要调节。测速目前流行的就是通过编码器测速&#xff…

JAVA设计模式--简单介绍

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;一、简介 Design pattern 是众多软件开发人员经过漫长的试验和错误总结出来的在软件开发过程中面临一般问题的解决方案&#xff0c;代表着最佳实践。使用设计模式是为了重用代码、让代码更容易被他人理解、保…

为什么是PID控制

在进入正式话题之前需要引入四个概念&#xff1a;稳态误差、终值定理、幅角条件和系统稳定的充要条件。 稳态误差&#xff1a;系统达到稳定状态后&#xff0c;系统的实际输出量与系统希望的输出量之间的偏差。 终值定理&#xff1a;设有连续函数f(t)f(t)f(t)&#xff0c;当t趋于…

卡尔曼滤波器推导

注&#xff1a;受控制领域大牛CAN博士启发&#xff0c;受益匪浅&#xff0c;作此文以为笔记。 简介 设 卡尔曼滤波器是从测量值ZZZk的平均数开始的。开始推导&#xff1a; 由上式可知   也就是说随着kkk的增大&#xff0c;测量结果Zk不在重要&#xff0c;因为已经获得了足…

cocos2dx3.2文件结构和代码结构

既然选定了cocos2dxlua的原生方式来开发&#xff0c;首先要确定的是使用哪个版本的cocos2dx&#xff0c;先看看github上的changelog和releasenote&#xff0c;然后在google里搜索一下&#xff0c;参考了jacky的博客http://zengrong.net/post/2100.htm&#xff0c;最终选择了coc…

改进的PID算法

位置式PID算法 位置式PIDPIDPID算法是一种比较直观的的PIDPIDPID算法&#xff0c;如系统框图中所示&#xff0c;ininin表示设定值&#xff0c;errorerrorerror表示差值&#xff0c;uuu表示控制器输出值&#xff0c;outoutout表示被控量。算法表达式如下&#xff1a; 增量式PI…

几种简单电路知识汇总

这篇文章用于记录平时设计电路或者在书中遇到的一些电路方面的知识&#xff0c;会不定期更新。就先从运算放大器开始&#xff0c;对此做个简单的介绍。 运算放大器 说到运算放大器就不得不说两个概念&#xff0c;虚短与虚断。 虚短&#xff1a; 在理想情况下&#xff0c;运算…

51单片机——交通灯

原理图 功能描述 1、基本功能就是如同红绿灯一般&#xff0c;不做赘述。   2、红灯时长和绿灯时长可通过按键设置&#xff0c;即按键列中的上面4个&#xff0c;当这4个按键有一个按下后便进入时长设置功能&#xff0c;设置完成后按最下面两个按键&#xff08;紧急控制按钮&am…

设置TextField内文字距左边框的距离

2019独角兽企业重金招聘Python工程师标准>>> //设置文本框左边的viewUITextField *textField [[UITextField alloc]init];textField.frame CGRectMake(10, 30, 300, 30);[self.view addSubview:textField];textField.leftView [[UIView alloc]initWithFrame:CGRe…

类的三大特性

类有三大特性&#xff1a;继承&#xff0c;封装&#xff0c;多态&#xff0c;这个也是介绍类的时候&#xff0c;必须提到的话题&#xff0c;那么今天就来看一下OC中类的三大特性&#xff1a; 一、封装 学习过Java中类的同学可能都知道了&#xff0c;封装就是对类中的一些字段&a…

操作系统抢占式优先级调度_操作系统中的优先级调度(非抢先)

操作系统抢占式优先级调度Priority scheduling is a type of scheduling algorithm used by the operating system to schedule the processes for execution. The priority scheduling has both the preemptive mode of scheduling and the non-preemptive mode of scheduling…

数据结构pta选择判断复习

第一章绪论 1-3数据的逻辑结构是指数据的各数据项之间的逻辑关系。 错 是数据元素之间的逻辑关系 2-4以下属于逻辑结构的是&#xff08; &#xff09;。 (2分) 顺序表 散列表 有序表 单链表 有序表 2-12以下关于数据结构的说法中正确的是____。 (2分) A数据结构的逻辑结构独立于…

粗略的看JFinal的基于AOP的拦截器的实现

2019独角兽企业重金招聘Python工程师标准>>> 简单的说一下AOP的实现&#xff0c;所谓AOP&#xff0c;即&#xff08;Aspect Oriented Programming&#xff09;的缩写&#xff0c;体现在程序中就是你可以通过配置在任意的代码块前后插入你想插入的执行代码。例如日志…

大二上数据结构复习

目录 第一章绪论练习 第二章线性表 第三章栈和队列 第四章串 第五章数组和广义表 第六章树和二叉树 第七章图 第九章查找 第十章排序 第一章绪论练习 1-8 数据结构的抽象操作的定义与具体实现有关。 (1分) T F 1-14 数据结构包括数据对象集以及它们的逻辑结构和物理结构&#…

大二上数据结构复习2

第二章线性表 综合 一、在什么情况下用顺序表比用链表好 表长度确定&#xff0c;很少进行插入删除操作且经常访问元素 二、2-4 顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下, 对有 127 个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素…

操作系统(王道笔记第二章)

目录第二章 2.1_1进程的定义、组成、组成形式、特征 2.1_2进程的状态与转换 2.1_3进程的控制 2.1_4进程通信 2.1_5线程概念和多线程模型 2.2_1处理机调度的概念层次 2.2_2处理机调度的时机、切换与过程、方式 2.2_3调度算法的评价指标 2.2_4FCFS、SJF、HRRN调度算法 2.2_5时间片…

C语言画图形(图形库graphics的使用)

目录 工具 c语言基本绘图 文字输出 c语言基本贴图 获取鼠标、键盘信息 工具 &#xff08;1&#xff09;环境&#xff1a;VC &#xff08;2&#xff09;库函数&#xff1a;graphics.h&#xff08;因为不是标准库函数&#xff0c;所以需下载EASYX&#xff09; &#xff08;3&am…

关于DDD中Domain的思考

2019独角兽企业重金招聘Python工程师标准>>> 本文既不推销UML&#xff0c;也不推广DDD&#xff0c;更不涉及各种论战。-- 作者 某天又一次打开关于DDD(领域驱动设计)的PDF文档时&#xff0c;自己有了个疑问&#xff1a;什么是领域(Domain)&#xff1f;译文中是这样描…