vclyin / OpenSSL / BASE64编解码

0 0

   

BASE64编解码

2009-12-21  vclyin
BASE64编码是一种常用的将十六进制数据转换为可见字符的编码。与ASCII码相比,它占用的空间较小。BASE64编码在rfc3548中定义。
 
1、base64编解码原理
将数据编码成BASE64编码时,以3字节数据为一组,转换为24bit的二进制数,将24bit的二进制数分成四组,每组6bit。对于每一组,得到一个数字:0-63。然后根据这个数字查表即得到结果。表如下:
      Value Encoding  Value Encoding  Value Encoding  Value Encoding
          0         A            17       R            34       i             51        z
          1         B            18       S             35       j             52       0
          2         C            19       T             36      k            53        1
          3         D            20       U             37      l             54        2
          4         E             21       V            38      m            55        3
          5         F             22       W            39     n            56        4
          6         G            23        X            40      o            57        5
          7         H            24        Y            41      p            58        6
          8         I            25          Z            42      q            59        7
          9         J            26         a            43        r            60        8
         10        K            27        b            44       s            61        9
         11        L            28        c            45        t            62        +
         12        M            29       d            46       u            63          /
         13        N            30        e            47       v
         14        O            31        f            48        w         (pad) =
         15        P            32        g            49        x
         16        Q            33       h            50         y

             比如有数据:0x30 0x82 0x02

       编码过程如下:

       1)得到16进制数据: 30 82 02

       2)得到二进制数据: 00110000              10000010       00000010

       3)每6bit分组:       001100    001000    001000    000010

       4)得到数字:            12   8     8     2

       5)根据查表得到结果 M I I C

       BASE64填充:在不够的情况下在右边加0  

       有三种情况:

       1)    输入数据比特数是24的整数倍(输入字节为3字节整数倍),则无填充;

       2)    输入数据最后编码的是1个字节(输入数据字节数除31),即8比特,则需要填充2"==",因为要补齐6比特,需要加200

       3)输入数据最后编码是2个字节(输入数据字节数除32),则需要填充1"=",因为补齐6比特,需要加一个00

       举例如下:

       0x30编码:

       1)    0x30的二进制为:00110000

       2)    分组为:001100    00

       3)    填充200001100   000000

       4)    得到数字:12 0

       5)    查表得到的编码为MA,另外加上两个==

       所以最终编码为:MA==

       base64解码是其编码过程的逆过程。解码时,将base64编码根据表展开,根据有几个等号去掉结尾的几个00,然后每8比特恢复即可。
 
2、base64函数

Openssl中用于base64编解码的函数主要有:

1  编码函数

Ø         EVP_EncodeInit函数

原型:void EVP_EncodeInit(EVP_ENCODE_CTX *ctx);

功能:该函数初始化一个用来进行base64编码的结构,事实上,该函数只是简单设置了结构里面几个常量的长度。

参数:

ctxbase64设备上下文。

Ø         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编码的数据。数据输出总是在下一层输入前完成的。

参数:

ctxbase64设备上下文。

out:存放编码后的数据缓冲区。

outl:编码后的数据长度。

in:编码前的数据。

inl:编码前的数据长度。

Ø         EVP_EncodeFinal函数

原型:void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl);

功能:该函数将结构体ctx里面剩余数据进行BASE64编码并写入到参数out里面去,输出数据的长度保存在outl里面。

参数:

ctxbase64设备上下文。

out:存放编码后的数据。

outl:编码后的数据长度。

Ø         EVP_EncodeBlock函数

原型:int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);

功能:该函数将参数f里面的字符串里面的n个字节的字符串进行BASE64编码并输出到参数t里面。返回数据的字节长度。事实上,在函数EVP_EncodeUpdateEVP_EncodeFinal里面就调用了该函数完成BASE64编码功能。

参数:

t:接收编码后的数据缓冲区。

f:编码前的数据。

n:编码前的数据长度。

 

2  解码函数

Ø         EVP_DecodeInit函数

原型:void EVP_DecodeInit(EVP_ENCODE_CTX *ctx);

功能:该函数初始化一个用来进行BASE64解码的数据结构。

参数:

ctxbase64设备上下文。

Ø         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则表明出错了。

参数:

ctxbase64设备上下文。

out:存放解码后的数据缓冲区。

outl:解码后的数据长度。

in:解码前的数据。

inl:解码前的数据长度。

Ø         EVP_DecodeFinal函数

原型:int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);

功能:该函数将结构体ctx里面剩余的数据进行BASE64解码并输出到参数out指向的内存中,输出数据长度为outl字节。成功返回1,否则返回-1

参数:

ctxbase64设备上下文。

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:解码前的数据长度。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多