2013-09-26 3 views
1

Ответа: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; 
    } 
} 
+3

Вы должны использовать '' wb '' вместо '' w ''при открытии выходного файла, поскольку он больше не является текстом. – timrau

+2

@timra прав насчет использования «wb». Кроме того, убедитесь, что ваш файл расшифровки открывается с помощью «rb». – chux

ответ

5

Поскольку зашифрованные данные больше не текст больше, вы должны использовать "wb" и "rb" при открытии зашифрованного файла для ввода/вывода.

+0

Только для личной справки, что именно вызвало этот глюк? Было ли представление символа ASCII изменено на символ EOL или EOF? – DevNull

+1

Да, любое значение может существовать в зашифрованных данных, включая 'EOF', который смущает' fgetc() ', если файл открыт в текстовом режиме. – timrau

Смежные вопросы