Если ваша цель - зашифровать файл, прочитайте весь файл в буфер, зашифруйте его и сохраните как двоичный файл. Вы можете найти размер файла, переместив указатель файла в конец. Пример:
int main()
{
FILE *fin;
fin = fopen("pic_original.bmp", "rb");
fseek(fin, 0, SEEK_END);
int filesize = ftell(fin);
rewind(fin);
char *buf = malloc(filesize);
fread(buf, 1, filesize, fin);
fclose(fin);
//encrypt the buffer...
FILE *fout = fopen("output.bmp", "wb");
fwrite(buf, 1, filesize, fout);
fclose(fout);
return 0;
}
Это будет работать с любым файлом. OpenSSL уже имеет функции для непосредственного шифрования файлов.
Если по какой-то причине вы хотите оставить заголовок прежним и изменить только следующие биты, прочитайте заголовок отдельно:
int main()
{
FILE *fin = fopen("input.bmp", "rb");
if(!fin) { printf("cannot open input\n"); return 0; }
FILE *fout = fopen("output.bmp", "wb");
if(!fout) { printf("cannot open output\n"); return 0; }
fseek(fin, 0, SEEK_END);
int filesize = ftell(fin);
if(filesize <= 54)
{
printf("wrong filesize\n");
return 0;
}
rewind(fin);
char *header = malloc(54);
char *buf = malloc(filesize - 54);
//encrypt buf...
fread(header, 1, 54, fin);
fread(buf, 1, filesize - 54, fin);
fclose(fin);
fwrite(header, 1, 54, fout);
fwrite(buf, 1, filesize - 54, fout);
fclose(fout);
free(header);
free(buf);
return 0;
}
Полагаю, это имеет то преимущество, что зашифрованное растровое изображение все равно будет распознаваться как растровое. Но только методы шифрования не добавляют дополнительные байты к выводу.
Обратите внимание, что 8-битные, 4-битные и монохромные растровые изображения имеют палитру, которая идет после заголовка 54 байтов, а затем идет биты изображения.