File XOR无法解密某些文件
下面的代码设法加密我尝试的任何文件,但它只设法解密.txt文件。当我尝试解密已加密的.mp3、.png、.mp4文件时,它无法解密 所以我想知道为什么会这样?如果它成功地解密了.txt文件,为什么我尝试过的其他文件格式(前面提到过)都无法解密呢?因为如果我理解XOR加密正确,它将返回第二次运行它的原始字符串,因此我应该能够重新打开文件,并且它应该正常工作,因为数据应该被解密,对吗 如果我在这里很愚蠢,请随意抨击我File XOR无法解密某些文件,file,encryption,c++17,File,Encryption,C++17,下面的代码设法加密我尝试的任何文件,但它只设法解密.txt文件。当我尝试解密已加密的.mp3、.png、.mp4文件时,它无法解密 所以我想知道为什么会这样?如果它成功地解密了.txt文件,为什么我尝试过的其他文件格式(前面提到过)都无法解密呢?因为如果我理解XOR加密正确,它将返回第二次运行它的原始字符串,因此我应该能够重新打开文件,并且它应该正常工作,因为数据应该被解密,对吗 如果我在这里很愚蠢,请随意抨击我 #include <filesystem> #include <
#include <filesystem>
#include <cstdio>
#include <Windows.h>
int main() {
const std::filesystem::path& path = "folder\\";
FILE* pFile, *pFile1;
char key = '¤';
//get files in dir
for (const std::filesystem::directory_entry &p : std::filesystem::directory_iterator(path)) {
std::filesystem::path filename = p.path().filename();
std::string tmp = path.string() + filename.string();
fopen_s(&pFile, tmp.c_str(), "rb");
if (pFile) {
//for size purposes
char* buffer = 0;
long size;
fseek(pFile, 0L, SEEK_END);
size = ftell(pFile);
fseek(pFile, 0L, SEEK_SET);
//rewind(pFile);
buffer = new char[size+1];
//set to zero to remove random chars
memset(buffer, 0, size+1);
//get filecontent
fgets(buffer, size+1, pFile);
fclose(pFile);
//XOR-crypt text/data
for (int i = 0; i < size+1; i++) {
buffer[i] ^= key;
}
//open for writing
fopen_s(&pFile1, tmp.c_str(), "wb");
//write back to file
fputs(buffer, pFile);
fclose(pFile1);
delete[] buffer;
}
}
}
#包括
#包括
#包括
int main(){
const std::filesystem::path&path=“folder\\”;
文件*pFile,*pFile1;
字符键=“·”;
//在目录中获取文件
for(const std::filesystem::directory\u entry&p:std::filesystem::directory\u迭代器(path)){
std::filesystem::path filename=p.path().filename();
std::string tmp=path.string()+filename.string();
fopen_s(&pFile,tmp.c_str(),“rb”);
if(pFile){
//出于尺寸目的
char*buffer=0;
长尺寸;
fseek(pFile,0L,SEEK_END);
大小=ftell(pFile);
fseek(pFile,0L,SEEK_SET);
//倒带(pFile);
缓冲区=新字符[大小+1];
//设置为零以删除随机字符
memset(缓冲区,0,大小+1);
//获取文件内容
FGET(缓冲区,大小+1,pFile);
fclose(pFile);
//XOR加密文本/数据
对于(int i=0;i
不能用fgets读取二进制数据。不能用fgets读取二进制数据的原因是,它不报告读取的字符数。您必须搜索表示字符串结尾的0字节,该字节由fgets
放入缓冲区。但是,如果您正在读取二进制数据,那么数据本身可能也包含0个字节,您无法知道0是否表示读取字符串的结尾,或者它是否只是数据中的一个字节。我想您是指“rb”和“wb”?我试着只用“r”和“w”,但还是没用(嗯,你为什么用XOR加密?不,它们不是指“rb”和“wb”。它们是正确的。(“r”和“w”是不正确的。)他们告诉您不能使用fgets
从输入文件收集数据。使用fgets
而不是fgets
,使用fread
。此外,也不能使用fputs
将数据发送到输出文件。使用fwrite
而不是fputs
。