本例是用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; }