9.2.1 文件加密函数Encrypt_File

来源:互联网 发布:图文旅游攻略 软件 编辑:程序博客网 时间:2024/06/06 06:38

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

函数定义:

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加密上下文环境

 处理过程如图所示:

原创粉丝点击