生活随笔
收集整理的這篇文章主要介紹了
简易的遍历文件加密解密
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
功能描述
將生成的可執(zhí)行程序放在指定的文件夾內(nèi),雙擊后將該目錄下所有文件包括子文件夾內(nèi)文件全部加密,再次雙擊運(yùn)行后將進(jìn)行解密。
加密解密實(shí)現(xiàn)
主要運(yùn)用了異或與取反操作,異或:兩個(gè)值不同為1,相同為0。取反就是將該數(shù)的二進(jìn)制按位變?yōu)榕c原相反的數(shù),即1變?yōu)?,0變?yōu)?。例如:
程序:
#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
);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;
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的简易的遍历文件加密解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。