Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Проблема с шифрованием XOR

#cpp #c #шифрование


Помогите найти ошибку в коде, текст из файла шифруется, а вот с дешифровкой проблемы

#include 
#include 
#include 
#include 

char XORing(char key, char input);

int main(int argc, char* argv[]){
    setlocale(LC_ALL, "rus");
    if(argv[1][0] == '1'){ //шифровка

        FILE *input;
        FILE *shifr;
        input = fopen("input.txt", "r");
        shifr = fopen("shifr.txt", "w");

        //Ввод ключа с клавиатуры
         char key[30];
        printf("Введите ключ: ");
        gets(key);
        int k = strlen(key);
        //перевод в нижний регистр
        for (int i = 0; i < k; i++){
            key[i] = tolower(key[i]);
        }

        //подсчет кол-ва символов в input
        int inp = 0; //счетчик
        while(fgetc(input) != EOF){
            inp++;
        }

        //шифрование input посимвольно
        for(int i = 0; i < inp; i++){
            char c = fgetc(input);
            c = tolower(c);
            fputc(XORing(key[i%k], c), shifr);
        }

        fclose(input);
        fclose(shifr);

    }
    else if(argv[1][0] == '2'){ //дешифровка

        FILE *key;
        FILE *shifr;
        FILE *deshifr;
        key = fopen("key.txt", "r");
        shifr = fopen("shifr.txt", "r");
        deshifr = fopen("deshifr.txt", "w");

        //создаем массив символов для ключа
        char KeyArr[30];
        fgets(KeyArr, 30, key);
        int k = strlen(KeyArr);
        //перевод в нижний регистр
        for (int i = 0; i < k; i++){
            KeyArr[i] = tolower(KeyArr[i]);
        }

        //подсчет кол-ва символов в shifr
        int sh = 0; //счетчик
        while(fgetc(shifr) != EOF){
            sh++;
        }

        //дешифровка
        for(int i = 0; i < sh; i++){
             char c = fgetc(shifr);
            fputc(XORing(KeyArr[i%k], c), deshifr);
        }

        fclose(key);
        fclose(shifr);
        fclose(deshifr);
    }

    else{
        printf("Error: faulse value");
    }

    return 0;
}

char XORing(char key, char input){
    char c = input ^ key;
    return c;
}

    


Ответы

Ответ 1



Во-первых, вы что-то выдумываете. Никакой шифровки текста из файла ваш код не выполняет и выполнять не может. У вас цикл подсчета количества входных символов упирается в конец файла и там навсегда и остается. Сам цикл шифрования, разумеется, читать файл не будет и шифровать ничего не будет. Чтобы этот код мог что-то шифровать, необходимо как минимум сделать rewind(input) между циклами чтения. Или избавиться совсем от этого ненужного предварительного вычисления размера файла. (Зачем понадобился этот лишний проход по файлу?) Во-вторых, функция gets не включает символ '\n' в прочитанную строку. Функция fgets включает символ '\n' в прочитанную строку, если он наличествует во входе. Это может быть причиной того, почему внешне одинаковые ключи шифровки/дешифровки на самом деле отличаются. Если файл с ключом у вас содержит перевод строки после собственно значения ключа, то этот перевод строки прочитается как часть ключа. Символ '\n' в ключе будет активно участвовать в процессе расшифровки, в то время как на этапе шифровки его там не было. Понятно, что из-за этого все поедет вкривь и вкось. Не забываете "убивать" ненужный '\n' в конце строки char KeyArr[30]; fgets(KeyArr, sizeof KeyArr, key); KeyArr[strcspn(KeyArr, "\n")] = 0; В-третьих, использование типа char, который может быть знаковым, для выполнения побитовых операций - не самая лучшая идея. P.S. Функция gets официально исключена из состава стандартной библиотеки. Пользуйтесь scanf или fgets и там, и там.

Комментариев нет:

Отправить комментарий