XOR在一个非常大的文件上

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

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

感谢您的任何帮助!!

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

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

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

这是bloxor.c

// bloxor.c - by Peter Boström 2009, public domain, use as you see fit. :) #include  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; } 

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

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

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

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

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

一个XOR密码几乎不是孩子的姐妹certificate – 即便如此。

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

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

如果您的问题是如何在不使用磁盘上的额外空间的情况下执行此操作,我将只读取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 

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