2 次 XOR?文件上的密码加密不会产生相同的文件

pal*_*ium 2 c++ xor

我试图用 C++ 和 XOR?encryption 加密图像文件。它工作得很好,但是当我用相同的代码解密它时,我无法打开图像,我认为它们不一样,但在 XOR?加密中它们必须相同

这是代码

void xor_encrypt(std::string const& path) {
    char key[65] = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08";
    std::ifstream input{ path,std::ios::binary };
    std::ofstream output;
    output = std::ofstream{ path + ".hafnium", /*added*/ std::ios::binary };

    char buffer[64];

    while (input.read(buffer, 64)) {
        for (size_t i = 0; i < 64; i++) {
            buffer[i] ^= key[i];
        }
        output.write(buffer,/*added*/  input.gcount());
    }

    input.close();
    std::remove(path.c_str());
}
Run Code Online (Sandbox Code Playgroud)

这里有 3 个文件:原始图像、加密图像和加密的 2 倍图像

[1] 原始图像:https : //i.stack.imgur.com/VKHKU.jpg [2] 图像加密 1 次:https : //mega.nz/file/BUMG2I7K#G3PsUeYCwtTCOj2cYSH47t67_WafRZQsRHyIims-EW0 [3] 图像加密 2 ?xor 时间:https : //mega.nz/file/FUMywI5I#mvI6Ge2nEw19fDfTEVso7hKMFSggRJcGJ7_g9178LMQ

我看到的文件之间的唯一区别是它们的大小不同

为什么用 xor 加密 2 次的图像不会产生相同的文件?谢谢你的回答

编辑?:感谢您的回答,它适用于图像文件,但是当我使用其他文件(如视频)时,它不再起作用:

原始视频:https : //mega.nz/file/BYU3hQJI#JugOnHZ6_ajnRqHqc18j_j54MqFoIXAUHITSMxbAo48 加密视频:https : //mega.nz/file/JAMFXCRK#DxYqKAvCqda18oC47qOH02Wiec1VeC47qOH02Wiec1V加密/ 加密视频https://mega.nz/file/JAMFXCRK f0vf43PkEssAmoHuPicY722kd1p7nvQheIlIwFkmrzk

dan*_*1st 5

这实际上是某种缓冲区下溢

文件的结尾是问题。

您阅读 usinginput.read(buffer, 64)和最后一次执行此操作时,它可能会读取少于 64 个字符但更少。

然后,您仍然写入 64 个字符(您只需从数组中写入 64 个字符,以及之前的内容)。

使用以下代码,写的和读的一样多:

while (input.read(buffer, 64)) {
        for (size_t i = 0; i < 64; i++) {
            buffer[i] ^= key[i];
        }
        output.write(buffer, input.gcount());
    }
Run Code Online (Sandbox Code Playgroud)

它使用gcount来计算读取的字符数。

如果您也有二进制输入,我也建议您编写二进制文件。

output = std::ofstream{ path + ".hafnium",std::ios::binary };
Run Code Online (Sandbox Code Playgroud)