C 为什么XOR操作只在文本文件的一半上实现
我正在尝试对文件进行异或运算。我在文件中读到由一行文字组成的“这是一些随机文字”。当我执行XOR操作时,我会输出包含值00的XORD文件。当我再次对文件进行异或运算并输出内容时,文件中的所有内容都是“this is s”。我对所有这些都是新手,所以任何信息都是有用的。我正在计划将其用于.exe文件,我很好奇,如果这对于.txt文件是成功的,它是否也适用于.exeC 为什么XOR操作只在文本文件的一半上实现,c,file-io,xor,C,File Io,Xor,我正在尝试对文件进行异或运算。我在文件中读到由一行文字组成的“这是一些随机文字”。当我执行XOR操作时,我会输出包含值00的XORD文件。当我再次对文件进行异或运算并输出内容时,文件中的所有内容都是“this is s”。我对所有这些都是新手,所以任何信息都是有用的。我正在计划将其用于.exe文件,我很好奇,如果这对于.txt文件是成功的,它是否也适用于.exe #include <stdio.h> #include <stdlib.h> #include <str
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
//XOR key
#define XOR_KEY 0x6F
void XORFile (char *infile, char *outfile){
FILE *fp;
char buf[4096];
fp = fopen (infile, "r");
fgets (buf, sizeof (buf), fp); //Reading from file
printf ("File contents: %s\n", buf);
int i;
//XOR read file buffer
for(i = 0; buf[i] != '\0'; i++){
buf[i] ^= XOR_KEY;
}
FILE *fp2;
fp2 = fopen (outfile, "w");
fprintf (fp2, "%s", buf);
fclose(fp);
fclose (fp2);
}
int main (int argc, char *argv[]) {
if(argc <= 3){
fprintf (stderr, "Usage: %s [CRYPT] [IN FILE] [OUTFILE]\n", argv[0]);
exit(1);
}
XORFile (argv[2], argv[3]);
return 0;
}
#包括
#包括
#包括
#包括
#包括
//异或键
#定义XOR_键0x6F
void XORFile(char*infle,char*outfile){
文件*fp;
char-buf[4096];
fp=fopen(填入“r”);
fgets(buf,sizeof(buf),fp);//从文件读取
printf(“文件内容:%s\n”,buf);
int i;
//异或读取文件缓冲区
对于(i=0;buf[i]!='\0';i++){
buf[i]^=XOR_键;
}
文件*fp2;
fp2=fopen(输出文件,“w”);
fprintf(fp2,“%s”,buf);
fclose(fp);
fclose(fp2);
}
int main(int argc,char*argv[]){
如果(argc要使用fread
而不是fgets
,则需要将输入和输出视为二进制
并且,您希望循环它以获取整个文件
事实上,你只能得到第一行
这看起来像是加密/解密。即使您在fgets
上循环,它也无法用于解密,因为换行符将被XORed,并且不会给出所需的结果
以下是重构版本:
void
XORFile(char *infile, char *outfile)
{
FILE *fp;
FILE *fp2;
int rlen;
char buf[4096];
fp = fopen(infile, "r");
fp2 = fopen(outfile, "w");
while (1) {
rlen = fread(buf,1,sizeof(buf),fp);
if (rlen <= 0)
break;
// XOR read file buffer
for (int i = 0; i < rlen; ++i)
buf[i] ^= XOR_KEY;
fwrite(buf,1,rlen,fp2);
}
fclose(fp);
fclose(fp2);
}
void
XORFile(字符*填充,字符*输出文件)
{
文件*fp;
文件*fp2;
int rlen;
char-buf[4096];
fp=fopen(填入“r”);
fp2=fopen(输出文件,“w”);
而(1){
rlen=fread(buf,1,sizeof(buf),fp);
if(rlen)输入文件中有多少行?因为您只从输入文件中读取一行,所以不要再考虑如果buf[i]^=XOR_KEY
的结果使buf[i]==0
(字符串空终止符恰好有值0
)。请记住,printf
格式%s
写入一个以null结尾的字符串。@sKIMO如果需要xor,至少在写入时应将该文件视为二进制文件,即使用fwrite。可能是xored文本的某个字节变为\x0
。我认为使用fwrite函数写入输出文件会更好用于异或数据的字节为0x6F(“o”),当包含字符“o”的字节与0x6F(“o”)异或时,其内容变为“\x0”。