首页 > 解决方案 > XOR 无法解密某些文件

问题描述

以下代码设法加密我尝试的任何文件,但它只设法解密 .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;
    }
}
}

标签: fileencryptionc++17

解决方案


推荐阅读