zoukankan      html  css  js  c++  java
  • 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 证书
    js 压缩
    身份证认证
    在 Visual Studio 2015 中关闭系统级的 Runtime Exceptions
    在 Visual Studio 2015 中关闭 Browser Link
    List<T>.ForEach()的使用
    使用Microsoft.Practices.EnterpriseLibrary.Validation.dll验证类成员
    jQuery.filter()的强大功能
    jQuery Checkbox Selected
    Get SQL String From Query Object In Entity Framework
  • 原文地址:https://www.cnblogs.com/findumars/p/5706025.html
Copyright © 2011-2022 走看看