Правильный способ зашифровать файл с OpenSSL с помощью API-интерфейса EVP в C
Что я пытаюсь сделать: зашифровать исполняемый файл, а затем расшифровать его позже.
В чем моя проблема: правильно проходить через exe.
Вот как выглядит мой код:
unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "dontusethisinput";
//Initiate the EVP interface
EVP_CIPHER *c = EVP_aes_256_cbc();
//Initialize symmetric cypher
EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX) malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(ctx);
//Set up cypher contex
EVP_EncryptInit(ctx,c,ckey,ivec);
Конечно, есть лучшие способы настроить ключ и iv (я смотрю на книгу сетевой безопасности с openssl). Это не моя проблема, моя проблема в том, как правильно загрузить exe-файл и зашифровать его. Насколько я понимаю, я должен открыть его в режиме rb и прочитать. Что я не понимаю, так это то, какой размер я должен использовать. Я понимаю, что я должен, при вызове EVP_EncryptUpdate я должен ввести в буфере ввода и длину буфера. Я хотел бы знать, как я должен прочитать входные EXE. Должен ли я перебрать файл и прочитать один AES_BLOCK_SIZE за итерацию? Каков был бы правильный способ достигнуть этого?
1 ответ
Вот рабочий пример. Очевидно, что API-интерфейс EVP будет обрабатывать произвольный размер ввода.
void encrypt(FILE *ifp, FILE *ofp)
{
//Get file size
fseek(ifp, 0L, SEEK_END);
int fsize = ftell(ifp);
//set back to normal
fseek(ifp, 0L, SEEK_SET);
int outLen1 = 0; int outLen2 = 0;
unsigned char *indata = malloc(fsize);
unsigned char *outdata = malloc(fsize*2);
unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "dontusethisinput";
//Read File
fread(indata,sizeof(char),fsize, ifp);//Read Entire File
//Set up encryption
EVP_CIPHER_CTX ctx;
EVP_EncryptInit(&ctx,EVP_aes_128_cbc(),ckey,ivec);
EVP_EncryptUpdate(&ctx,outdata,&outLen1,indata,fsize);
EVP_EncryptFinal(&ctx,outdata + outLen1,&outLen2);
fwrite(outdata,sizeof(char),outLen1 + outLen2,ofp);
}
Вот мой ответ на это в другом посте. OpenSSL AES 256 CBC через API-интерфейс EVP в C