File XOR无法解密某些文件

File XOR无法解密某些文件,file,encryption,c++17,File,Encryption,C++17,下面的代码设法加密我尝试的任何文件,但它只设法解密.txt文件。当我尝试解密已加密的.mp3、.png、.mp4文件时,它无法解密 所以我想知道为什么会这样?如果它成功地解密了.txt文件,为什么我尝试过的其他文件格式(前面提到过)都无法解密呢?因为如果我理解XOR加密正确,它将返回第二次运行它的原始字符串,因此我应该能够重新打开文件,并且它应该正常工作,因为数据应该被解密,对吗 如果我在这里很愚蠢,请随意抨击我 #include <filesystem> #include <

下面的代码设法加密我尝试的任何文件,但它只设法解密.txt文件。当我尝试解密已加密的.mp3、.png、.mp4文件时,它无法解密

所以我想知道为什么会这样?如果它成功地解密了.txt文件,为什么我尝试过的其他文件格式(前面提到过)都无法解密呢?因为如果我理解XOR加密正确,它将返回第二次运行它的原始字符串,因此我应该能够重新打开文件,并且它应该正常工作,因为数据应该被解密,对吗

如果我在这里很愚蠢,请随意抨击我

#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