C 为什么XOR操作只在文本文件的一半上实现

C 为什么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

我正在尝试对文件进行异或运算。我在文件中读到由一行文字组成的“这是一些随机文字”。当我执行XOR操作时,我会输出包含值00的XORD文件。当我再次对文件进行异或运算并输出内容时,文件中的所有内容都是“this is s”。我对所有这些都是新手,所以任何信息都是有用的。我正在计划将其用于.exe文件,我很好奇,如果这对于.txt文件是成功的,它是否也适用于.exe

#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”。