我想做什么: 加密可执行文件,然后再解密。
我的问题是: 通过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吗?什么是实现这个目标的正确方法?
答案 0 :(得分: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 via EVP api in C