本例是用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;
- }
http://blog.****.net/xueyushenzhou/article/details/23281675