设为首页 加入收藏

TOP

OpenSSL对数组加密解密的完整实现代码
2014-11-24 00:08:09 来源: 作者: 【 】 浏览:7
Tags:OpenSSL 对数 加密解密 完整 实现 代码

本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码。


#include
#include



#include "openssl/evp.h"
#include "openssl/x509.h"



static void disp(void * pbuf,int size)
{ int i=0;
for( i=0;i printf("%02x ",*((unsigned char *)pbuf+i));
putchar('\n');
}


/*
* key:加密密钥,一般设置位24,不知为啥
* iv:加密初始向量
* in_enc:明文数组,输入数组
* out_enc:加密后的数组,输出密文数组
* in_len:明文长度
* out_len:密文长度
* */
//加密函数
int EncryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_enc, unsigned char *out_enc,int in_len,int *out_len)
{
;
int outl; //第一次使用update加密的数据长度
int outl2; //剩余的字段,经过final填充后的长度
int inl;
int rv;


EVP_CIPHER_CTX ctx;


EVP_CIPHER_CTX_init(&ctx); //初始化ctx


rv = EVP_EncryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv); //设置密码算法、key和iv
if(rv != 1)
{
printf("Err\n");
return -1;
}


inl=in_len;
rv = EVP_EncryptUpdate(&ctx,out_enc,&outl,in_enc,in_len);//加密
if(rv != 1)
{
printf("Err\n");
return -1;
}


//加密结束
rv = EVP_EncryptFinal_ex(&ctx,out_enc+outl,&outl2);
if(rv != 1)
{
EVP_CIPHER_CTX_cleanup(&ctx);
return -1;
}


*out_len=outl+outl2;
EVP_CIPHER_CTX_cleanup(&ctx); //清除EVP加密上下文环境
printf("加密已完成\n");


}
/*
* key:加密密钥,一般设置位24,不知为啥
* iv:加密初始向量
* in_dec:密文数组,输入数组
* out_dec:解密后的数组,输出数组
* in_len:密文长度
* out_len:明文长度
* */
//解密函数
int DecryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_dec, unsigned char *out_dec,int in_len,int *out_len)
{
int outl; //第一次使用update解密的数据长度
int outl2; //剩余的字段,经过final解密并去除填充后的长度
int rv;


EVP_CIPHER_CTX ctx;
//初始化ctx
EVP_CIPHER_CTX_init(&ctx);
//设置解密的算法、key和iv
rv = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);
if(rv != 1)
{
EVP_CIPHER_CTX_cleanup(&ctx);
return -1;
}


//循环读取原文,解密后后保存到明文文件。
rv = EVP_DecryptUpdate(&ctx,out_dec,&outl,in_dec,in_len);//解密
if(rv != 1)
{
EVP_CIPHER_CTX_cleanup(&ctx);
return -1;
}


//解密结束
rv = EVP_DecryptFinal_ex(&ctx,out_dec+outl,&outl2);


if(rv != 1)
{
EVP_CIPHER_CTX_cleanup(&ctx);
return -1;
}
*out_len=outl+outl2;
EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文环境
printf("解密已完成\n");
}



int main()
{
int len=128+4;
int dec_len,len2;
unsigned char key[EVP_MAX_KEY_LENGTH]; //保存密钥的数组
unsigned char iv[EVP_MAX_KEY_LENGTH]; //保存初始化向量的数组
//EVP加密上下文环境
unsigned char out[len+EVP_MAX_KEY_LENGTH]; //保存加密后明文的缓冲区数组
unsigned char dec[len+EVP_MAX_KEY_LENGTH]; //保存解密后明文的缓冲区数组
unsigned char in[len+EVP_MAX_KEY_LENGTH]; //保存原文的缓冲区


int i=0;
//设置key和iv
for(i=0;i<8;i++)
{
key[i]=i;
}


for(i=0;i<8;i++)
{
iv[i]=i;
}
for(i=0;i {
in[i]=i;
}
disp(in,len);
EncryptBuffer(key,iv,in,dec,len,&dec_len);
printf("dec_len:%d\n",dec_len);
disp(dec,dec_len);


DecryptBuffer(key,iv,dec,out,dec_len,&len2);
disp(out,len2);
printf("解密候数据长度:%d\n",len2);
return 0;
}


相关阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Octave入门备忘 下一篇OpenSSL 加密文件的完整实现代码

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: