OpenSSL 编码和解码.docx_第1页
OpenSSL 编码和解码.docx_第2页
OpenSSL 编码和解码.docx_第3页
OpenSSL 编码和解码.docx_第4页
OpenSSL 编码和解码.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OpenSSL Base64编码和解码一、 编码解码、函数介绍:编码函数:EVP_EncodeInit函数原型:void EVP_EncodeInit(EVP_ENCODE_CTX *ctx);功能:该函数初始化一个用来进行base64编码的结构,事实上,该函数只是简单设置了结构里面几个常量的长度。参数:ctx:base64设备上下文。EVP_EncodeUpdate函数原型:void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl,unsigned char *in,int inl);功能:该函数将参数in里面的inl自己数据拷贝到结构体ctx里面,如果结构体里面有数据,就同时将结构体里面的数据进行BASE64编码并输出到参数out指向的缓存里面,输出数据的长度保存在outl里面。注意,在第一次调用本函数的时候,虽然往结构体里面拷贝数据了,但是结构体ctx里面开始是没有输入数据存在并且输入数据长度不超出ctx内部存储数据的最长限制,就不会有任何数据被进行BASE64编码,也就是说,不会有任何数据输出;但是如果输入数据长度比内部存储的数据长,那么就会输出部分经过BASE64编码的数据。数据输出总是在下一层输入前完成的。参数:ctx:base64设备上下文。out:存放编码后的数据缓冲区。outl:编码后的数据长度。in:编码前的数据。inl:编码前的数据长度。EVP_EncodeFinal函数原型:void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl);功能:该函数将结构体ctx里面剩余数据进行BASE64编码并写入到参数out里面去,输出数据的长度保存在outl里面。参数:ctx:base64设备上下文。out:存放编码后的数据。outl:编码后的数据长度。EVP_EncodeBlock函数原型:int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);功能:该函数将参数f里面的字符串里面的n个字节的字符串进行BASE64编码并输出到参数t里面。返回数据的字节长度。事实上,在函数EVP_EncodeUpdate和EVP_EncodeFinal里面就调用了该函数完成BASE64编码功能。参数:t:接收编码后的数据缓冲区。f:编码前的数据。n:编码前的数据长度。 解码函数:EVP_DecodeInit函数原型:void EVP_DecodeInit(EVP_ENCODE_CTX *ctx);功能:该函数初始化一个用来进行BASE64解码的数据结构。参数:ctx:base64设备上下文。EVP_DecodeUpdate函数原型:int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl,unsigned char *in, int inl);功能:该函数将参数in里面inl字节的数据拷贝到结构体ctx里面。如果结构体里面已经有数据,那么这些数据就会先进行BASE64解码,然后输出到参数out指向的内存中,输出的字节数保存在参数outl里面。输入数据为满行的数据时,返回为1;如果输入数据是最后一行数据的时候,返回0;返回1则表明出错了。参数:ctx:base64设备上下文。out:存放解码后的数据缓冲区。outl:解码后的数据长度。in:解码前的数据。inl:解码前的数据长度。EVP_DecodeFinal函数原型:int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);功能:该函数将结构体ctx里面剩余的数据进行BASE64解码并输出到参数out指向的内存中,输出数据长度为outl字节。成功返回1,否则返回1。参数:ctx:base64设备上下文。out:解码后的数据。outl:解码后的数据长度。EVP_DecodeBlock函数原型:int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n);功能:该函数将字符串f中的n字节数据进行BASE64解码,并输出到t指向的内存中,输出数据长度为outl。成功返回解码的数据长度,返回返回1。参数:t:接收解码后的数据缓冲区。f:解码前的数据。n:解码前的数据长度。二、 数据结构:这些函数声明对应声明在头文件 /usr/include/openssl/evp.h 中。三、 Base64编码实现(1) 定义一些必要的变量:EVP_ENCODE_CTX ctx;/EVP编码结构体unsigned char in1024;/输入数据缓冲区int inl;/输入数据长度char out2048=0;/输出数据缓冲区int outl;/输出数据长度FILE *infp;/输入文件句柄FILE *outfp;/输出文件句柄(2) 使用EVP_EncodeInit函数初始化编码结构体EVP_ENCODE_CTXEVP_EncodeInit(&ctx);(3) 使用EVP_EncodeUpdate函数对数据进行编码,对大数据段可以循环调用。输入待编码的数据,输出编码后的数据。EVP_EncodeUpdate(&ctx,out,&outl,in,inl);(4) 使用EVP_EncodeFinal编码结束,输出最后剩余的编码数据。EVP_EncodeFinal(&ctx,out,&outl);四、 Base64解码实现:(1)定义一些必要的变量:EVP_ENCODE_CTX ctx;/EVP编码结构体char in1024;/输入数据缓冲区int inl;/输入数据长度unsigned char out1024;/输出数据缓冲区int outl;/输出数据长度FILE *infp;/输入文件句柄FILE *outfp;/输出文件句柄(2)使用EVP_DecodeInit函数初始化编码结构体EVP_ENCODE_CTXEVP_DecodeInit(&ctx);(3)使用EVP_DecodeUpdate函数对数据进行编码,对大数据段可以循环调用。输入待编码的数据,输出编码后的数据。EVP_DecodeUpdate(&ctx,out,&outl,in,inl);(5) 使用EVP_DecodeFinal编码结束,输出最后剩余的编码数据。EVP_DecodeFinal(&ctx,out,&outl);五、 处理Base64编码解码的流程图: 六、 程序实例:运行环境,在第三次作业的基础上,Windows平台上Visual C+环境下编译运行即可。EVP_Base64项目代码如下:#include #include #include #include #include /Base64编码void tEVP_Encode()EVP_ENCODE_CTX ctx;/EVP编码结构体unsigned char in1024;/输入数据缓冲区int inl;/输入数据长度char out2048=0;/输出数据缓冲区int outl;/输出数据长度FILE *infp;/输入文件句柄FILE *outfp;/输出文件句柄infp = fopen(base64.dat,rb);/打开待编码的文件if(infp = NULL)printf(Open File base64.dat for Read Err.n);return;outfp = fopen(base64.txt,w);/打开编码后保存的文件if(outfp = NULL)printf(Open File base64.txt For Write Err.n);return;EVP_EncodeInit(&ctx);/Base64编码初始化printf(文件Base64.dat Base64编码后为:n);/循环读取原文,并调用EVP_EncodeUpdate计算Base64编码while(1)inl = fread(in,1,1024,infp);if(inl = 0)break;EVP_EncodeUpdate(&ctx,out,&outl,in,inl);/编码fwrite(out,1,outl,outfp);/输出编码结果到文件printf(%s,out); EVP_EncodeFinal(&ctx,out,&outl);/完成编码,输出最后的数据。fwrite(out,1,outl,outfp);printf(%s,out);fclose(infp);fclose(outfp);printf(对文件Base64.dat Base64编码完成,保存到base64.txt文件.nnn);/Base64解码void tEVP_Decode()EVP_ENCODE_CTX ctx;/EVP编码结构体char in1024;/输入数据缓冲区int inl;/输入数据长度unsigned char out1024;/输出数据缓冲区int outl;/输出数据长度FILE *infp;/输入文件句柄FILE *outfp;/输出文件句柄infp = fopen(base64.txt,r);/打开待解码的文件if(infp = NULL)printf(Open File Base64.txt for Read Err.n);return;outfp = fopen(base_result.dat,wb);/打开解码后保存的文件if(outfp = NULL)printf(Open File base_result.txt For Write Err.n);return;EVP_DecodeInit(&ctx);/Base64解码初始化printf(开始对文件Base64.txt Base64解码.nn);/循环读取原文,并调用EVP_DecodeUpdate进行Base64解码while(1)inl = fread(in,1,1024,infp);if(inl = 0)break;EVP_DecodeUpdate(&ctx,out,&outl,in,inl);/Base64解码fwrite(out,1,outl,outfp);/输出到文件 EVP_DecodeFinal(&ctx,out,&outl);/完成解码,输出最后的数据。fwrite(out,1,outl,outfp);fclose(infp);fclose(outfp);printf(对文件Base64.txt Base64解码完成,保存为base64_result.datnnn); int main() tEVP_Encode();tEVP_Decode();system(pause);return 0;运行结果:经过编码和解吗后内容并未发生改变,打开验证如下:七、 实验总结:本次作业我从不了解什么是Base64编码到对它认识很清晰,从这个工程中查资料,看电子书,一点点纠错,从中收获不少。本程序对文件进行Base64编码和解码,使我明白了该系列函数的用法。程序的功能是调用OpenSSL的EVP系列函数对”base64.dat”文件进行Base64编码,并保存编码后的数据为b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论