почему моя операция XOR реализована только на половине моего текстового файла - PullRequest
1 голос
/ 26 января 2020

Я пытаюсь XOR файл. Я прочитал в файле, который состоит из 1 строки текста "это какой-то случайный текст". Когда я выполняю операцию XOR, я вывожу файл XORed, который содержит значение 00. Когда я снова XOR файл и выводит содержимое, все, что находится в файле, это «это 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;
}

1 Ответ

2 голосов
/ 26 января 2020

Вы хотите использовать fread вместо fgets. Вам нужно обрабатывать ввод и вывод как двоичный .

И вы хотите l oop на нем, чтобы получить весь файл.

На самом деле вы получите только первую строку.

Это похоже на шифрование / дешифрование. Даже если вы зациклились на 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);
}
...