openssl 介绍(二) base64 编码格式

BASE64 编解码原理

将数据编码成 BASE64 编码时, 以 3 字节数据为一组, 转换为 24bit 的二进制数, 将 24bit
的二进制数分成四组,每组 6bit。对于每一组,得到一个数字: 0-63。然后根据这个数字查
表即得到结果。表如下:
在这里插入图片描述
比如有数据: 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 个字节(输入数据字节数除 3 余 1),即 8 比特,则需要填 充 2 个"==",因为要补齐 6比特,需要加 2 个 00;
  3. 输入数据最后编码是 2 个字节(输入数据字节数除 3 余 2),则需要填充 1 个"=",因 为补齐 6 比特,需要加一个 00。

举例如下:
对 0x30 编码:

  1. 0x30 的二进制为: 00110000
  2. 分组为: 001100 00
  3. 填充 2 个 00: 001100 000000
  4. 得到数字: 12 0
  5. 查表得到的编码为 MA,另外加上两个==
    所以最终编码为: MA==

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

主要函数

Openssl 中用于 base64 编解码的函数主要有:
1) 编码函数
EVP_EncodeInit
编码前初始化上下文。
EVP_EncodeUpdate
进行 BASE64 编码,本函数可多次调用。
EVP_EncodeFinal
进行 BASE64 编码,并输出结果。
EVP_EncodeBlock
进行 BASE64 编码
2) 解码函数
EVP_DecodeInit
解码前初始化上下文。
EVP_DecodeUpdate
BASE64 解码,本函数可多次调用。
EVP_DecodeFinal
BASE64 解码,并输出结果。
EVP_DecodeBlock
BASE64 解码,可单独调用。

编程示例

#include <string.h>
#include <openssl/evp.h>
int main(int argc, char const *argv[])
{
	EVP_ENCODE_CTX ectx,dctx;
	unsigned char in[500],out[800],d[500];
	int inl,outl,i,total,ret,total2;
	EVP_EncodeInit(&ectx);
	for(i=0;i<500;i++)
		memset(&in[i],i,1);
	inl=500;
	total=0;
	EVP_EncodeUpdate(&ectx,out,&outl,in,inl);
	total+=outl;
	EVP_EncodeFinal(&ectx,out+total,&outl);
	total+=outl;
	printf("%s\n",out);
	EVP_DecodeInit(&dctx);
	outl=500;
	total2=0;
	ret=EVP_DecodeUpdate(&dctx,d,&outl,out,total);
	if(ret<0)
	{
		printf("EVP_DecodeUpdate err!\n");
		return -1;
	}
	total2+=outl;
	ret=EVP_DecodeFinal(&dctx,d,&outl);
	total2+=outl;
    for(i=0;i<500;i++)
        printf("%d ",d[i]);
    printf("\n");
	return 0;
}

编译方式:gcc *.c -lssl -lcrypto

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值