Помогите найти ошибку в коде, текст из файла шифруется, а вот с дешифровкой проблемы
#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;
}
Во-первых, вы что-то выдумываете. Никакой шифровки текста из файла ваш код не выполняет и выполнять не может. У вас цикл подсчета количества входных символов упирается в конец файла и там навсегда и остается. Сам цикл шифрования, разумеется, читать файл не будет и шифровать ничего не будет.
Чтобы этот код мог что-то шифровать, необходимо как минимум сделать 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 и там, и там.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей