XOR在一个非常大的文件上

时间:2009-11-01 11:43:00

标签: c file io stream xor

我想XOR一个非常大的文件(~50 Go)。

更准确地说,我想通过使用密钥3847611839对明文文件的32个字节的每个块(由于内存不足)进行异或,并创建(块后块)新的密码文件。

感谢您的帮助!!

4 个答案:

答案 0 :(得分:3)

这听起来很有趣,听起来不像是家​​庭作业。

我没有以前的xor加密文件可以尝试,但如果你前后转换一个,那就没有差异了。

我至少试过了。请享用! :)这个xor的每4个字节有0xE555E5BF,我认为这就是你想要的。

这是bloxor.c

// bloxor.c - by Peter Boström 2009, public domain, use as you see fit. :)

#include <stdio.h>

unsigned int xormask = 0xE555E5BF; //3847611839 in hex.

int main(int argc, char *argv[])
{
    printf("%x\n", xormask);
    if(argc < 3)
    {
        printf("usage: bloxor 'file' 'outfile'\n");
        return -1;
    }

    FILE *in = fopen(argv[1], "rb");
    if(in == NULL)
    {
        printf("Cannot open: %s", argv[2]);
        return -1;
    }

    FILE *out = fopen(argv[2], "wb");

    if(out == NULL)
    {
        fclose(in);
        printf("unable to open '%s' for writing.",argv[2]);
        return -1;
    }
    char buffer[1024]; //presuming 1024 is a good block size, I dunno...

    int count;

    while(count = fread(buffer, 1, 1024, in))
    {
        int i;
        int end = count/4;
        if(count % 4)
            ++end;

        for(i = 0;i < end; ++i)
        {
            ((unsigned int *)buffer)[i] ^= xormask;
        }
        if(fwrite(buffer, 1, count, out) != count)
        {
            fclose(in);
            fclose(out);

            printf("cannot write, disk full?\n");

            return -1;
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}

答案 1 :(得分:3)

正如评论中提到的星蓝,“请注意,这最好是混淆,而不是加密”。它甚至可能都不会混淆。

XOR的一个属性是(Y xor 0) == Y。这对你的算法意味着,对于你的大文件中存在零运行的任何地方(看起来很可能是文件的大小),你的密钥将显示在密码文件中。平淡无奇。

XOR加密内容的另一个不错的功能是,如果有人同时拥有明文和密文,那么对这些项进行异或,就会为您输出一个输出,该输出具有用于执行重复重复密码的密钥。如果该人知道这2个文件是明文/密文对,则他们已经学会了如果该密钥用于多个加密则该密钥是坏的。如果攻击者不确定明文和密文是否相关,那么在此之后他们就有了一个很好的主意,因为密钥是输出中的重复模式。这对于一次性填充来说都不是问题,因为密钥的每个位只使用一次,因此一个人从这次攻击中学到了新的东西。

很多人错误地认为,因为一次性打击垫可以证明是不可破坏的,所以如果做得好,XOR加密可能没问题,因为执行的基本操作是相同的。不同之处在于,一次性密钥只使用密钥的每个随机位一次。因此,除了其他方面,如果明文有一连串的零,那么关键是没有学到任何东西,这与简单的固定密钥XOR密码不同。

正如Bruce Schneier所说:“这个世界上有两种密码学:密码学将阻止你的孩子姐妹阅读你的文件,密码学将阻止主要政府阅读你的文件。”

XOR密码几乎不是小妹妹的证据 - 即便如此。

答案 2 :(得分:1)

您需要围绕流体系结构制定解决方案:您在“流”中读取输入文件,修改它,并将结果写入输出文件。

这样,您不必一次读取所有文件。

答案 3 :(得分:1)

如果您的问题是如何在不占用磁盘空间的情况下进行操作,我只需要读取32个字节的倍数(尽可能大),使用内存中的块,然后将其写出来再次。您应该可以使用ftellfseek函数来执行此操作(假设您的long类型足够大,当然)。

可以更快地对文件进行内存映射,如果你可以节省大量的地址空间(并且你的操作系统支持它),但我会先尝试最简单的解决方案。

当然,如果空间不是问题,只需读取块并将其写入新文件,如下所示(伪代码):

open infile
open outfile
while not end of infile:
    read chunk from file
    change chunk
    write chunk to outfile
close outfile
close infile

这种读/处理/写入是非常基本的东西。如果您有更复杂的要求,则应该用它们更新您的问题。