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

306
11 июля 2017, 21:44

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

#include <stdio.h>
#include <cstring>
#include <clocale>
#include <cctype>
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;
}
Answer 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 и там, и там.

READ ALSO
Наследование шаблонного класса

Наследование шаблонного класса

Есть шаблонный класс BaseMatrix Кусок заголовочного файла:

340
Обращение к элементу в векторе структур

Обращение к элементу в векторе структур

У меня есть структура Words

244
Как объединить два exe файла в один

Как объединить два exe файла в один

Имеется программа в виде одного исполняемого файла, доступа к ее исходникам нетТакже есть вспомогательная программа, которая, исходя из особенностей...

577