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;
}

散列(Hash)和加密(Encryption)

三月 10, 2007 @ 1:43 上午 | 发表在 网络安全 | 留下评论

散列和加密是两个很容易混淆的概念,特别在中文里,我们会通常把它们统称为”加密”.但实际上,这是两个截然不同的东东,虽然他们的目的都是要防止原来的数据被人看到,他们却有两个独特的属性.

  • 散列是单向而加密是双向的.

当数据被Hash的时候,你保证别人无法用别的数据产生同样的结果,这样接收方收到你的数据,它只要运行同样的Hash函数,就可以确认这个数据确实来自于你,而不是某个人假冒你的名义发过来的.但同时,Hash的结果也不能被还原成原来的数据.否则的话,Hash的数据在网络上传递就没法保证安全.

而加密注定是双向的,收到的一方通过使用一个私有的钥匙(Key)就可以把数据还原.

  • 散列的结果是定长的,而加密的长度对应于原来的长度.

散列的结果通常都是定长的.比如说,不管输入的数据是多长,MD5的结果是128位,而SHA-1总是160位.而加密的结果通常是对应于输入长度的,长的数据会输出长的结果,短的则会输出短的结果.

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