9.2.1 文件加密函数Encrypt_File

  函数功能:根据输入的密码算法以及口令对文件进行加密,并输出密文到指定的文件。

函数定义:

BOOL Encrypt_File(CString strPlainFilePath, CString strCipherFilePath, int nAlg_ID, CString strPass)

参数说明:

q       strPlainFilePath[IN]待加密的文件路径

q       strCipherFilePath[IN]加密后的密文保存路径

q       nAlg_ID: [IN]密码算法ID

q       strPass:[IN]加密口令

返回值:操作成功返回TRUE,否则返回FALSE

处理过程如下:

1)定义一些必要的变量,包括保存密钥的数组、保存初始化向量的数组、EVP加密上下文环境、保存密文的缓冲区、保存原文的缓冲区、加密算法、输入文件句柄、输出文件句柄等。

        unsigned char key[EVP_MAX_KEY_LENGTH];//保存密钥的数组

        unsigned char iv[EVP_MAX_KEY_LENGTH];    //保存初始化向量的数组

        EVP_CIPHER_CTX ctx;                                         //EVP加密上下文环境

        unsigned char out[1024];                                      //保存密文的缓冲区

        int outl;

        unsigned char in[1024];                                        //保存原文的缓冲区

        int inl;

        const EVP_CIPHER * cipher;                               //加密算法

        int rv;

        FILE *fpIn;                                                                //输入文件句柄

        FILE *fpOut;                                                             //输出文件句柄

        char enchead[128]={0};                                         //保存密文文件头的数组

2)根据算法ID获得EVP_CIPHER算法。

        cipher = EVP_get_cipherbynid(nAlg_ID);

3)打开原文和密文文件。

        //打开待加密的原文文件

        fpIn = fopen(strPlainFilePath.GetBuffer(0),"rb");

        //打开保存密文的文件

        fpOut = fopen(strCipherFilePath.GetBuffer(0),"wb");

4)保存加密算法到文件头。

        //文件头,保存算法信息

        sprintf(enchead,"ALGID:%d/n",nAlg_ID);

        fwrite(enchead,1,128,fpOut);

5)根据口令、密码算法生成keyiv

        EVP_BytesToKey(cipher,EVP_md5(),NULL,(const unsigned char *)strPass.GetBuffer(0),strPass.GetLength(),1,key,iv);

6)初始化ctx ,设置密码算法、keyiv

        //初始化ctx

        EVP_CIPHER_CTX_init(&ctx);

        //设置密码算法、keyiv

        rv = EVP_EncryptInit_ex(&ctx,cipher,NULL,key,iv);

7)循环读取并加密原文。

        for(;;)

        {

                  inl = fread(in,1,1024,fpIn);

                  if(inl <= 0)//读取原文结束

                           break;

                  rv = EVP_EncryptUpdate(&ctx,out,&outl,in,inl);//加密

                  if(rv != 1)

                  {

                           fclose(fpIn);

                           fclose(fpOut);

                           EVP_CIPHER_CTX_cleanup(&ctx);

                           return FALSE;

                  }

                  fwrite(out,1,outl,fpOut);//保存密文到文件

        }

        //加密结束

        rv = EVP_EncryptFinal_ex(&ctx,out,&outl);

        if(rv != 1)

        {

                  fclose(fpIn);

                  fclose(fpOut);

                  EVP_CIPHER_CTX_cleanup(&ctx);

                  return FALSE;

        }

        fwrite(out,1,outl,fpOut);//保密密文到文件

6)清除EVP加密上下文环境。

        EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文环境

 处理过程如图所示:


版权声明:本文为PKI_CA原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。