Openssl的Base64编码及解码

近日需要在C++下面做一些加解密的事情,因为是在Linux下面,首选自然是openssl. 但openssl的文档真是不敢恭维,文档少得可怜不说,在网络上搜索到的东西也是鱼龙混杂.我想我还是总结一下,有益于自己也造福别人.

首先是Base64的编码,openssl提供两种方式,BIO和EVP. BIO是老的方式,比较复杂,EVP则是新的方式,号称比较容易,但其实也不是那么直接.

一些网络上的文章号称使用EVP_EncodeBlock来处理Base64,但他们常常都忽略了一点,EVP_EncodeBlock的结果中没有换行符. openssl的命令行工具使用的是PEM的格式,也就是说,每隔64个字符,就会插入一个换行符.所以,使用EVP_EncodeBlock生成的结果和PEM是不兼容的.换句话说,这个结果使用openssl的命令行工具是读不出来的.这最开始让我非常困惑.

使用下面的代码可以生成正确的PEM编码.

使用openssl base64命令行工具可以确认结果.

/**
* Use EVP to Base64 encode the input byte array to readable text
*/
char* base64(const unsigned char *inputBuffer, int inputLen)
{
EVP_ENCODE_CTX	ctx;
int base64Len = (((inputLen+2)/3)*4) + 1; // Base64 text length
int pemLen = base64Len + base64Len/64; // PEM adds a newline every 64 bytes
char* base64 = new char[pemLen];
int result;
EVP_EncodeInit(&ctx);
EVP_EncodeUpdate(&ctx, (unsigned char *)base64, &result, (unsigned char *)inputBuffer, inputLen);
EVP_EncodeFinal(&ctx, (unsigned char *)&base64[result], &result);
return base64;
}

/**
* Use EVP to Base64 decode the input readable text to original bytes
*/
unsigned char* unbase64(char *input, int length, int* outLen)
{
EVP_ENCODE_CTX	ctx;
int orgLen = (((length+2)/4)*3) + 1;
unsigned char* orgBuf = new unsigned char[orgLen];
int result, tmpLen;
EVP_DecodeInit(&ctx);
EVP_DecodeUpdate(&ctx, (unsigned char *)orgBuf, &result, (unsigned char *)input, length);
EVP_DecodeFinal(&ctx, (unsigned char *)&orgBuf[result], &tmpLen);
result += tmpLen;
*outLen = result;
return orgBuf;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值