openssl中的base64

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

参考:https://blog.csdn.net/yasi_xi/article/details/9040793

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值