写入文件时如何 "manually" 表示 EOF?
How could I "manually" signify EOF when writing a file?
我有这个功能:
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() 只会用成功读取的字符部分替换 "block"(16 字节长)的内容,从之前的加密块中留下一堆垃圾。
解密时由于decipher_file()通常无法知道原始文件的大小,它会解密所有内容,包括垃圾字符,并将其写回文件。
我也尝试在每一轮都用零重新初始化 "block",但毫不奇怪,它们也被添加到文件中,这可能会带来很大的问题。
所以我的问题是,有没有一种方法(如函数)来表示文件结束的位置,或者告诉 fwrite() 停止写入?
您不能使用特殊字符,因为加密数据最终可能看起来像它。无论如何,这都不是一个优雅的解决方案。
有多种解法:
- 在文件前加上解密后的内容长度。这非常干净且易于实施。
- 使用保留长度信息的密码模式。欧洲央行没有。使用填充方案或保留长度的方案,例如计数器模式。
我有这个功能:
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() 只会用成功读取的字符部分替换 "block"(16 字节长)的内容,从之前的加密块中留下一堆垃圾。
解密时由于decipher_file()通常无法知道原始文件的大小,它会解密所有内容,包括垃圾字符,并将其写回文件。
我也尝试在每一轮都用零重新初始化 "block",但毫不奇怪,它们也被添加到文件中,这可能会带来很大的问题。
所以我的问题是,有没有一种方法(如函数)来表示文件结束的位置,或者告诉 fwrite() 停止写入?
您不能使用特殊字符,因为加密数据最终可能看起来像它。无论如何,这都不是一个优雅的解决方案。
有多种解法:
- 在文件前加上解密后的内容长度。这非常干净且易于实施。
- 使用保留长度信息的密码模式。欧洲央行没有。使用填充方案或保留长度的方案,例如计数器模式。