Как я мог "вручную" обозначить EOF при записи файла? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть эта функция:

int cipher_file(char *file_path, uint8_t *key, int key_size){

    FILE *file;
    size_t read_char_count, wrote_char_count;

    fpos_t *pos = malloc(sizeof(fpos_t));
    char *block = malloc(16*sizeof(uint8_t));

    if ( !(file = fopen(file_path, "rb+")) ) {
      return EXIT_FAILURE;
    }

    while(!feof(file)){

      while( ( read_char_count = fread(block, 1, 16*sizeof(uint8_t), file) ) > 0 ) {
        block = cipher_block(block, key, key_size);
        fseek(file, -read_char_count, SEEK_CUR);
        wrote_char_count = fwrite(block , 1, 16*sizeof(uint8_t), file);
      }

    }
    fclose(file);
    return EXIT_SUCCESS;
}

(кстати, я знаю, что режим ECB небезопасен)

Который принимает файл, разбивает его на блоки по 128 бит, шифрует их, используяAES и запишите их обратно в файл, эффективно заменив обычный текст зашифрованным текстом.Я также написал функцию decipher_file() для расшифровки файла.

Проблема в том, что, если размер файла не кратен 128 битам, в конце fread () только частично заменяет содержимое "блока" (длиной 16 байт) с успешно прочитанными символами, оставляя кучу мусора из предыдущего зашифрованного блока.

При расшифровке, так как decipher_file () обычно не может узнать размер исходного файла, он расшифровываетвсе содержимое, включая символы мусора, и записать его обратно в файл.

Я также пытался повторно инициализировать «блок» нулями в каждом раунде, но, без особого удивления, они также добавлялись в файл,что может быть очень проблематично.

Итак, мой вопрос, есть ли способ (например, функция) указать, где заканчивается файл, или сказать fwrite () прекратить запись?

1 Ответ

0 голосов
/ 09 декабря 2018

Вы не можете использовать специальный символ, потому что зашифрованные данные могут в конечном итоге выглядеть так.В любом случае, это не будет элегантным решением.

Существует несколько решений:

  1. Префикс файла с длиной расшифрованного содержимого.Это очень чистый и простой в реализации.
  2. Используйте режим шифрования, который сохраняет информацию о длине.ЕЦБ нет.Используйте схемы заполнения или схему, которая сохраняет длину, например режим счетчика.
...