我想XOR一个非常大的文件(~50 Go)。
更准确地说,我想通过使用密钥3847611839对明文文件的32个字节的每个块(由于内存不足)进行异或,并创建(块后块)新的密码文件。
感谢您的帮助!!
答案 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个字节的倍数(尽可能大),使用内存中的块,然后将其写出来再次。您应该可以使用ftell
和fseek
函数来执行此操作(假设您的long
类型足够大,当然)。
可以更快地对文件进行内存映射,如果你可以节省大量的地址空间(并且你的操作系统支持它),但我会先尝试最简单的解决方案。
当然,如果空间不是问题,只需读取块并将其写入新文件,如下所示(伪代码):
open infile
open outfile
while not end of infile:
read chunk from file
change chunk
write chunk to outfile
close outfile
close infile
这种读/处理/写入是非常基本的东西。如果您有更复杂的要求,则应该用它们更新您的问题。