无锡企业如何建网站,怎么申请公司邮箱账号,百度网站优化排行,手机兼职软件功能描述 将生成的可执行程序放在指定的文件夹内#xff0c;双击后将该目录下所有文件包括子文件夹内文件全部加密#xff0c;再次双击运行后将进行解密。 加密解密实现 主要运用了异或与取反操作#xff0c;异或#xff1a;两个值不同为1#xff0c;相同为0。取反就是将该…功能描述 将生成的可执行程序放在指定的文件夹内双击后将该目录下所有文件包括子文件夹内文件全部加密再次双击运行后将进行解密。 加密解密实现 主要运用了异或与取反操作异或两个值不同为1相同为0。取反就是将该数的二进制按位变为与原相反的数即1变为00变为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 retfread(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, pos1);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:queuestring file_queue;//存储所有文件路径的队列
};int main()
{EncryptionAndDecrypt EAD;EAD.GetFilePath();EAD.EncryptionOrDecrypt_File();return 0;
}