У меня есть эта функция:
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 () прекратить запись?