简易的遍历文件加密解密

功能描述
将生成的可执行程序放在指定的文件夹内,双击后将该目录下所有文件包括子文件夹内文件全部加密,再次双击运行后将进行解密。
加密解密实现
主要运用了异或与取反操作,异或:两个值不同为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,一经查实,立即删除!

相关文章

oracle 查看用户、权限、角色

查看用户、权限、角色的命令和视图1.查看所有用户&#xff1a; select * from dba_users; select * from all_users; select * from user_users; 2.查看用户系统权限&#xff1a; select * from dba_sys_privs; select * from session_privs; select * from user_sys_privs; 3.…

Java StackTraceElement getClassName()方法与示例

StackTraceElement类的getClassName()方法 (StackTraceElement Class getClassName() method) getClassName() method is available in java.lang package. getClassName()方法在java.lang包中可用。 getClassName() method is used to retrieve the fully qualified name of t…

django post and get?

GET是通过URL传给服务器的,POST是通过HTTP头传给服务器的&#xff0c;post的数据是不跟在请求的url后&#xff0c;而是在http头中&#xff0c;get是在url中 post的安全性比get高&#xff0c;因为有的服务器会缓存get数据&#xff0c;post数据不会被缓存&#xff0c;而且当你再次…

操作系统 测试题

一、单选 1、下面哪项不是常用调度算法 A、FCFS B、SJF C、HRN D、ABC 2、响应比的计算方法是 A、&#xff08;作业等待时间作业执行时间&#xff09;/作业执行时间 B、&#xff08;作业等待时间作业执行时间&#xff09;/作业等待时间 C、&#xff08;作业等待时间&#xf…

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

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

第 6-1 课:Spring 核心 + 面试题

Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot,也是基于 Spring 实现的,SpringBoot 的诞生是为了让开发者更方便地使用 Spring,因此 Spring 在 Java 体系中的地位可谓首屈一指。当然,如果想…

Java SecurityManager getThreadGroup()方法与示例

SecurityManager类的getThreadGroup()方法 (SecurityManager Class getThreadGroup() method) getThreadGroup() method is available in java.lang package. getThreadGroup()方法在java.lang包中可用。 getThreadGroup() method is used to return the thread group into whi…

通知主线程刷新

dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新转载于:https://www.cnblogs.com/ejllen/p/4153118.html

简易花式流水灯

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

数据库 范式

关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式&#xff0c;才能设计出高效率、优雅的数据库&#xff0c;否则可能会设计出错误的数据库.目前&#xff0c;主要有六种范式&…

第 6-4 课:MyBatis 核心和面试题(上)

MyBatis 介绍 MyBatis 是一款优秀的 ORM(Object Relational Mapping,对象关系映射)框架,它可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它是 Apache 提供的一个开源项目,之前的名字叫做 iBatis,2010 年迁移到了 Google Code,并且将名字改为我们…

Java LineNumberReader getLineNumber()方法及示例

LineNumberReader类的getLineNumber()方法 (LineNumberReader Class getLineNumber() method) getLineNumber() method is available in java.io package. getLineNumber()方法在java.io包中可用。 getLineNumber() method is used to return the present line number in this …

STM32——直流电机PI调速

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

JAVA设计模式--简单介绍

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

简单函数

【【【2013-9-13】】】--模糊查询 关键字 like--与通配符联合使用&#xff08;_任意一个字符&#xff1b;%任意长度的字符&#xff1b;转义字符/和关键字escape联用&#xff09;select * from emp where job like %/%% escape /;select * from emp where comm is not null;com…

第 6-3 课:SpringBoot 核心 + 面试题

为什么要用 Spring Boot? Spring Boot 来自于 Spring 大家族,是 Spring 官方团队(Pivotal 团队)提供的全新框架,它的诞生解决了 Spring 框架使用较为繁琐的问题。Spring Boot 的核心思想是约定优于配置,让开发人员不需要配置任何 XML 文件,就可以像 Maven 整合 Jar 包一…

Java ObjectOutputStream writeDouble()方法与示例

ObjectOutputStream类writeDouble()方法 (ObjectOutputStream Class writeDouble() method) writeDouble() method is available in java.io package. java.io包中提供了writeDouble()方法 。 writeDouble() method is used to write the given 8 bytes (i.e. 64 bit) double v…

为什么是PID控制

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

WinForm C#全局错误捕捉处理【整理】

1 static class Program2 {3 /// <summary>4 /// 应用程序的主入口点。5 /// </summary>6 [STAThread]7 static void Main()8 {9 try 10 { 11 12 //添加事件处理…

第 6-6 课:消息队列面试题汇总

1.消息队列的应用场景有哪些? 答:消息队列的应用场景如下。 应用解耦,比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。订单系统与库存系统耦合,这个时候如果使用消息队列,可以返回给用户成功,先把消息持久化…