linux c ecb 加密解密,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;

}

OpenSSL 的详细介绍:请点这里

OpenSSL 的下载地址:请点这里

相关阅读:

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值