2

私がやろうとしていること:実行可能ファイルを暗号化し、後で復号化します。

私の問題は何ですか: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の読み方を知りたいです。ファイルをループして、反復ごとに 1 つの AES_BLOCK_SIZE を読み取る必要がありますか? これを達成するための適切な方法は何ですか?

4

1 に答える 1

3

これが実際の例です。EVP API は任意の入力サイズを処理するようです。

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);   
}

これに対する私の答えは別の投稿にあります。 CのEVP api経由のOpenSSL AES 256 CBC

于 2014-07-21T10:37:51.923 に答える