我具有此功能:
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()停止写入?
答案 0 :(得分:1)
您不能使用特殊字符,因为加密的数据可能最终看起来像它。无论如何,这都不是一个优雅的解决方案。
有多种解决方案: