Ответа:Xor шифрование не удается
я должен был сделать отдельную функцию для дешифрования, который использовал «RB», чтобы открыть зашифрованный файл, а затем использовать «термометр» в функции шифрования, чтобы написать зашифрованные данные в файл.
У меня возникла проблема с моим шифром Xor. Шифрование отлично работает при шифровании данных в файле, но когда он терпит неудачу, когда я пытаюсь его расшифровать. Проблема в том, что функция fgetc
только считывает первую строку и вторую строку и не может расшифровать 50% второй строки.
Пример:
Нормальный:
This is a text, This is a text
This is a text, This is a text
Зашифрованный:
a¦_ÖÞ`×ûù‡ûÛ(‹Pñ»FŒ§U®7!¼ªãŸ<çϱ\Î8ðs6Öã`GÒFAªÓV/Ç1t
Расшифрованный:
This is a text, This is a text
This is a text, ±Åãl«åé»–o„ F
Я проверил код с точкой останова и увидел, что проблема заключалась в том, что fgetc
перестал читать файл после второй строки, но я не знаю, почему. Возможно, что-то не так с моим алгоритмом.
Код:
int encrypt_file(const char *filename, const char *key)
{
int i = 0;
size_t key_len = strlen(key);
size_t key_count = 0;
size_t num_bytes = 0;
int *data = NULL;
int byte = 0;
FILE *file;
fopen_s(&file, filename, "r");
if (file != NULL)
{
// get file size/number of bytes
fseek(file, 0L, SEEK_END);
num_bytes = ftell(file);
fseek(file, 0L, SEEK_SET);
// allocate enough memory for the data
data = (int*)malloc(sizeof(int) *num_bytes);
// stores the data from the file in the array
while ((data[i++] = fgetc(file)) != EOF);
// encrypt the data
for (i = 0; i < num_bytes; i++) {
data[i] = data[i]^key[key_count++];
if (key_count == key_len) {
key_count = 0;
}
}
fclose(file);
fopen_s(&file, filename, "w");
// write the data from the array to the same file
for (i = 0; i < num_bytes; i++) {
fputc(data[i], file);
}
fclose(file);
return 0;
}
else
{
return 1;
}
}
Вы должны использовать '' wb '' вместо '' w ''при открытии выходного файла, поскольку он больше не является текстом. – timrau
@timra прав насчет использования «wb». Кроме того, убедитесь, что ваш файл расшифровки открывается с помощью «rb». – chux