京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

VC++网络安全编程范例(9)-基于OPENSSL实现对称算法与BASE64编码 ... ... ... ...

2018-4-26 16:18| 发布者: zhaojun917| 查看: 1096| 评论: 0|原作者: 梦想之都-俊月星空

摘要: 对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前 ...
    1.  #include <stdio.h>  
    2.  #include <string.h>  
    3.  #include <openssl/evp.h>  
    4.   
    5. //base64中每行的长度,最后一位是换行符号  
    6. #define CHARS_PER_LINE_BASE64 65  //64+1(\r)  
    7.   
    8. void print(const char *promptStr,unsigned char *data,int len)  
    9. {  
    10.     int i;  
    11.     printf("======%s[长度=%d]======\n",promptStr,len);  
    12.     for(i = 0; i < len; i++) printf("%02x", data[i]);  
    13.     printf("\n===============\n");  
    14. }  
    15.   
    16. //base64编码  
    17. void encode(unsigned char* outData,  
    18.             int * outlen,  
    19.             const unsigned char* data,  
    20.             int datalen)  
    21. {  
    22.     int tmp=0;  
    23.     EVP_ENCODE_CTX base64;  
    24.     EVP_EncodeInit(&base64);//base64编码初始化  
    25.     //编码数据,由于数据不多,所以没有使用循环  
    26.     EVP_EncodeUpdate(&base64,//base64编码上下文对象  
    27.         outData,//编码后的数据  
    28.         outlen, //编码后的数据长度  
    29.         data,   //要编码的数据  
    30.         datalen //要编码的数据长度  
    31.     );  
    32.     tmp=*outlen;  
    33.     //结束base64编码,事实上此时数据已经编码完全  
    34.     EVP_EncodeFinal(&base64,outData+*outlen,outlen);  
    35.     *outlen+=tmp;  
    36.     outData[*outlen]=0;  
    37.     printf("base64编码后:",outData,*outlen);  
    38. }  
    39.   
    40. //base64解码  
    41. bool decode(unsigned char* outData,  
    42.             int * outlen,  
    43.             const unsigned char* data,  
    44.             int datalen)  
    45. {  
    46.     int tmp=0,i=0,lines=0,currpos=0;  
    47.     EVP_ENCODE_CTX base64;  
    48.     EVP_DecodeInit(&base64);//base64解码初始化  
    49.     //假定outData缓冲区能够容纳所有的结果  
    50.     for (;;)  
    51.     {  
    52.         currpos+=CHARS_PER_LINE_BASE64*lines++;  
    53.         //下面函数的返回值中:i=1 表示还有更多行需要解码  
    54.         //i=0 表示没有进一步的数据需要解码  
    55.         i=EVP_DecodeUpdate(&base64,//base64解码上下文对象  
    56.             outData+tmp,     //解码后的数据  
    57.             outlen,          //解码后的数据长度  
    58.             data+currpos,    //要解码的数据  
    59.             datalen-currpos);//要解码的数据长度  
    60.         if (i < 0)  
    61.         {  
    62.             printf("解码错误!\n");  
    63.             return false;  
    64.         }  
    65.         tmp+=*outlen;  
    66.         if (i == 0) break;//数据结束  
    67.     }  
    68.     //结束base64解码  
    69.     EVP_DecodeFinal(&base64,outData+tmp,outlen);  
    70.     *outlen=tmp;  
    71.     outData[*outlen]=0;  
    72.     print("base64解码后:",outData,*outlen);  
    73.     return true;  
    74. }  
    75. 关闭

      站长推荐上一条 /6 下一条

      QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

      GMT+8, 2025-7-2 00:00 , Processed in 0.037662 second(s), 19 queries .

      Powered by Mxzdjyxk! X3.5

      © 2001-2025 Discuz! Team.