base64是一种基于64个可打印字符来表示二进制数据的方法。核心的方法是38 = 64;该怎么理解这个3 * 8 = 6 *4 呢?一个字节占8位,以3个字节为一组,将其24位拆成4个字节,每个字节填充6位,之后在6位的前面补两个0,形成4个字节形式。当然如果原文不够3个字节怎么办呢?加入还剩一个数,则将该数继续原来的操作,会转换成2个字节,然后不够四个字节,就在剩余的两个字节用’='进行补全。当然这种加密的方法很简单,很容易就会被破解,所以它的功能,主要就是将人们可以直观看到的信息,转换成不能直接理解的信息。
关于这个编码的规则:
- ①.把3个字符变成4个字符。
- ②每76个字符加一个换行符。
- ③.最后的结束符也要处理。
使用openssl进行base64
#include <iostream>
#include <string>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
using namespace std;
//base64编码默认自带换行
char *Base64Encode(const char* input, int length, bool with_new_line);
char *Base64Decode(char* input, int length, bool with_new_line);
int main(int arc, char *argv[])
{
string enc_input = "hello";
char * enc_output = Base64Encode(enc_input.c_str(), enc_input.length(), true);
cout << enc_output << endl;
char* dec_output = Base64Decode(enc_output, strlen(enc_output), true);
cout << dec_output << endl;
free(enc_output);
enc_output = nullptr;
free(dec_output);
dec_output = nullptr;
return 0;
}
char *Base64Encode(const char* input, int length, bool with_new_line)
{
BIO* bmem = NULL;
BIO* b64 = NULL;
BUF_MEM* bptr = NULL;
b64 = BIO_new(BIO_f_base64());
if (!with_new_line)
{
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
}
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, input, length);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
char * buff = (char *)malloc(bptr->length + 1);
memcpy(buff, bptr->data, bptr->length);
buff[bptr->length] = 0;
BIO_free_all(b64);
return buff;
}
char *Base64Decode(char* input, int length, bool with_new_line)
{
BIO * b64 = NULL;
BIO * bmem = NULL;
char * buffer = (char *)malloc(length);
memset(buffer, 0, length);
b64 = BIO_new(BIO_f_base64());
if (!with_new_line)
{
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
}
bmem = BIO_new_mem_buf(input, length);
bmem = BIO_push(b64, bmem);
BIO_read(bmem, buffer, length);
BIO_free_all(bmem);
return buffer;
}