openssl对数组加密解密的完整实现代码

来源:互联网 发布:php跟java的区别 商城 编辑:程序博客网 时间:2024/06/06 07:22

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

#include <stdio.h>#include <string.h>#include "openssl/evp.h"#include "openssl/x509.h"static void disp(void * pbuf,int size){ int i=0;    for( i=0;i<size;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<len;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;}
原创粉丝点击