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

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

[cpp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4.   
  5. #include "openssl/evp.h"  
  6. #include "openssl/x509.h"  
  7.   
  8.   
  9. static void disp(void * pbuf,int size)  
  10. int i=0;  
  11.     for( i=0;i<size;i++)  
  12.         printf("%02x ",*((unsigned char *)pbuf+i));  
  13.     putchar(' ');  
  14. }  
  15.   
  16. /* 
  17.  * key:加密密钥,一般设置位24,不知为啥 
  18.  * iv:加密初始向量 
  19.  * in_enc:明文数组,输入数组 
  20.  * out_enc:加密后的数组,输出密文数组 
  21.  * in_len:明文长度 
  22.  * out_len:密文长度 
  23.  * */  
  24. //加密函数  
  25. int  EncryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_enc, unsigned char *out_enc,int in_len,int *out_len)  
  26. {  
  27. ;  
  28.     int outl;  //第一次使用update加密的数据长度  
  29.     int outl2; //剩余的字段,经过final填充后的长度  
  30.     int inl;  
  31.     int rv;  
  32.   
  33.     EVP_CIPHER_CTX ctx;  
  34.   
  35.     EVP_CIPHER_CTX_init(&ctx);  //初始化ctx  
  36.   
  37.     rv = EVP_EncryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);   //设置密码算法、key和iv  
  38.     if(rv != 1)  
  39.     {  
  40.         printf("Err ");  
  41.         return -1;  
  42.     }  
  43.   
  44.     inl=in_len;  
  45.      rv = EVP_EncryptUpdate(&ctx,out_enc,&outl,in_enc,in_len);//加密  
  46.     if(rv != 1)  
  47.     {  
  48.         printf("Err ");  
  49.         return -1;  
  50.     }  
  51.   
  52.     //加密结束  
  53.     rv = EVP_EncryptFinal_ex(&ctx,out_enc+outl,&outl2);  
  54.     if(rv != 1)  
  55.     {  
  56.         EVP_CIPHER_CTX_cleanup(&ctx);  
  57.         return -1;  
  58.     }  
  59.   
  60.     *out_len=outl+outl2;  
  61.     EVP_CIPHER_CTX_cleanup(&ctx);   //清除EVP加密上下文环境  
  62.     printf("加密已完成 ");  
  63.   
  64. }  
  65. /* 
  66.  * key:加密密钥,一般设置位24,不知为啥 
  67.  * iv:加密初始向量 
  68.  * in_dec:密文数组,输入数组 
  69.  * out_dec:解密后的数组,输出数组 
  70.  * in_len:密文长度 
  71.  * out_len:明文长度 
  72.  * */  
  73. //解密函数  
  74. int DecryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_dec, unsigned char *out_dec,int in_len,int *out_len)  
  75. {  
  76.     int outl;  //第一次使用update解密的数据长度  
  77.     int outl2; //剩余的字段,经过final解密并去除填充后的长度  
  78.     int rv;  
  79.   
  80.     EVP_CIPHER_CTX ctx;  
  81.     //初始化ctx  
  82.     EVP_CIPHER_CTX_init(&ctx);  
  83.     //设置解密的算法、key和iv  
  84.     rv = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);  
  85.     if(rv != 1)  
  86.     {  
  87.         EVP_CIPHER_CTX_cleanup(&ctx);  
  88.         return -1;  
  89.     }  
  90.   
  91.     //循环读取原文,解密后后保存到明文文件。  
  92.     rv = EVP_DecryptUpdate(&ctx,out_dec,&outl,in_dec,in_len);//解密  
  93.     if(rv != 1)  
  94.     {  
  95.         EVP_CIPHER_CTX_cleanup(&ctx);  
  96.         return -1;  
  97.     }  
  98.   
  99.     //解密结束  
  100.     rv = EVP_DecryptFinal_ex(&ctx,out_dec+outl,&outl2);  
  101.   
  102.      if(rv != 1)  
  103.     {  
  104.         EVP_CIPHER_CTX_cleanup(&ctx);  
  105.         return -1;  
  106.     }  
  107.     *out_len=outl+outl2;  
  108.     EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文环境  
  109.     printf("解密已完成 ");  
  110. }  
  111.   
  112.   
  113. int main()  
  114. {  
  115.     int len=128+4;  
  116.     int dec_len,len2;  
  117.     unsigned char key[EVP_MAX_KEY_LENGTH];  //保存密钥的数组  
  118.     unsigned char iv[EVP_MAX_KEY_LENGTH];   //保存初始化向量的数组  
  119.             //EVP加密上下文环境  
  120.     unsigned char out[len+EVP_MAX_KEY_LENGTH];  //保存加密后明文的缓冲区数组  
  121.     unsigned char dec[len+EVP_MAX_KEY_LENGTH];  //保存解密后明文的缓冲区数组  
  122.     unsigned char in[len+EVP_MAX_KEY_LENGTH];           //保存原文的缓冲区  
  123.   
  124.     int i=0;  
  125.     //设置key和iv  
  126.     for(i=0;i<8;i++)  
  127.     {  
  128.         key[i]=i;  
  129.     }  
  130.   
  131.     for(i=0;i<8;i++)  
  132.     {  
  133.         iv[i]=i;  
  134.     }  
  135.     for(i=0;i<len;i++)  
  136.     {  
  137.         in[i]=i;  
  138.     }  
  139.     disp(in,len);  
  140.     EncryptBuffer(key,iv,in,dec,len,&dec_len);  
  141.     printf("dec_len:%d ",dec_len);  
  142.     disp(dec,dec_len);  
  143.   
  144.     DecryptBuffer(key,iv,dec,out,dec_len,&len2);  
  145.     disp(out,len2);  
  146.     printf("解密候数据长度:%d ",len2);  
  147.     return 0;  
  148. }  

http://blog.csdn.net/xueyushenzhou/article/details/23281675

原文地址:https://www.cnblogs.com/findumars/p/5706025.html