#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 и там, и там.
Комментариев нет:
Отправить комментарий