Правильный способ зашифровать файл с 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

Другие вопросы по тегам