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

  • 相关阅读:
    select、poll和epoll
    Linux 常用命令之文件和目录
    SmartPlant Review 帮助文档机翻做培训手册
    SmartPlant Foundation 基础教程 3.4 菜单栏
    SmartPlant Foundation 基础教程 3.3 标题栏
    SmartPlant Foundation 基础教程 3.2 界面布局
    SmartPlant Foundation 基础教程 3.1 DTC登陆界面
    SmartPlant Foundation 基础教程 1.4 SPF架构
    SmartPlant Foundation 基础教程 1.3 SPF其他功能
    SmartPlant Foundation 基础教程 1.2 SPF集成设计功能
  • 原文地址:https://www.cnblogs.com/findumars/p/5706025.html
Copyright © 2011-2022 走看看