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)根据口令、密码算法生成key和iv。
EVP_BytesToKey(cipher,EVP_md5(),NULL,(const unsigned char *)strPass.GetBuffer(0),strPass.GetLength(),1,key,iv);
(6)初始化ctx ,设置密码算法、key和iv。
//初始化ctx
EVP_CIPHER_CTX_init(&ctx);
//设置密码算法、key和iv
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加密上下文环境
处理过程如图所示:
- 9.2.1 文件加密函数Encrypt_File
- 9.1.1 文件加密
- 一个非常简单的文件加密函数
- 加密so文件中指定的函数
- so文件的局部函数加密
- php自定义函数: 加密文件下载地址
- java sha-1加密函数
- 加密函数
- 加密函数
- 文件加密
- 文件加密
- 加密文件
- 加密文件
- 文件加密
- 加密文件
- 文件加密
- 文件加密
- 文件加密
- 数组名不完全等于指针
- 9.2 流程分析
- 最近的研发工作
- 10G美国PHP空间十年360 一天一毛 企业邮箱75G
- 浅谈软件需求
- 9.2.1 文件加密函数Encrypt_File
- IFS新增客户订单内协调人/财务过账设定修改
- Java编程那些事儿11——JDK的获得、安装和配置
- 访问IIS元数据库失败
- 失望
- Chapter 5——Working with Transcat-SQL
- 用免费软件更改你的 Lotus Notes 工作空间 !
- Mysql启动错误解决
- SQL SERVER中一些常见性能问题的总结