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。我应该遍历文件并每次迭代读取一个 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);   
}

这是我在另一篇文章中对此的回答。 OpenSSL AES 256 CBC 通过 C 中的 EVP api

于 2014-07-21T10:37:51.923 回答