openssl – 使用EVP函数进行base64编码

三月 23, 2007 @ 12:23 上午 | 发表在 C/C++, 网络安全 | 留下评论

近日需要在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;
}

Advertisements

发表评论 »

RSS feed for comments on this post. TrackBack URI

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

通过访问 WordPress.com 创建免费网站或博客.
Entries评论 feeds.

%d 博主赞过: