【常见开源库的二次开发】基于openssl的加密与解密——Base的编解码(二进制转ascll)(二)
目录:
目录:
一、 Base64概述和应用场景
1.1 概述
1.2 应用场景
二、Base16
2.1 Base16编码
2.2 Base16编解码
三、Base64
四、OpenSSL BIO接☐
4.1 Filter BIOs:
4.2 Source/Sink BIOs:
4.3 应用场景:
4.4 具体使用:
4.5 进行BIO编码:
4.6进行BIO解密:
1.Base64编码(Base64Encode函数)
2. Base64解码(Base64Decode`函数)
3. main函数
一、 Base64概述和应用场景
1.1 概述
Base64是一种编码方式,用于将二进制数据转换为ASCII字符串,以便在只支持文本的媒体上进行存储和传输。它不是一种加密算法,而是一种数据编码技术。Base64编码是一种简单而有效的数据编码方式,它允许二进制数据在文本环境中安全地传输和存储。尽管它不提供安全性(数据在传输过程中可以被读取),但它确保了数据的完整性和可移植性。
1.2 应用场景
邮件编码(base64)
xml或者json存储二进制内容
网页传递数据URL
数据库中以文本形式存放二进制数据
可打印的比特币钱包地址base58 Check(hash校验)
比特币地址bech32(base32)
二、Base16
2.1 Base16编码
Base16是一种编码方法,它使用16个可打印的ASCII字符来表示二进制数据。这些字符包括数字0到9和字母A到F。每个字符代表4个二进制位,因此Base16有时也称为十六进制编码。
在Base16编码过程中,首先将原始数据(如文本或文件)转换成二进制形式。对于ASCII编码字符,这一步直接涉及将每个字符转换为其对应的8位二进制值。对于UTF-8或其他编码,可能涉及更复杂的转换过程。
接下来,将得到的二进制串按照每4位一组进行切分。由于每组4位可以对应一个0到15之间的十进制数,这个数可以直接映射到上述提到的16个字符之一。例如,二进制组0101对应十进制数5,按Base16编码转换成字符5;二进制组1001对应十进制数9,转换成字符9;二进制组1010对应十进制数10,转换成字符A,依此类推。
由于Base16使用4位二进制表示一个字符,一个字节(8位)被编码为两个Base16字符。因此,Base16编码后的数据大小是原始数据大小的两倍。
#include using namespace std; // 定义一个静态的常量字符数组,用于Base16编码的字符映射表 static const char BASE16_ENC_TAB[] = "123456789ABCDEF"; // 函数:将输入的原始数据按照Base16编码规则编码到输出字符串中 // 参数:in - 指向原始数据的指针;size - 原始数据的字节数;out - 指向输出编码字符串的指针 // 返回值:编码后的字符串长度,即原始数据长度的两倍 int Base16Encode(const unsigned char* in, int size, char* out) { // 遍历原始数据的每个字节 for (int i = 0; i > 4; // 例如:二进制1000 0001通过移位变为0000 1000 // 将当前字节的低四位与0x0F进行与操作,得到低四位的值 char l = in[i] & 0x0F; // 例如:二进制0000 1111与0x0F与操作后得到0000 0001 // 根据高四位的值,在编码表中查找对应的字符,并存入输出字符串 out[i * 2] = BASE16_ENC_TAB[h]; // 映射高四位到编码表对应的字符 // 根据低四位的值,在编码表中查找对应的字符,并存入输出字符串 out[i * 2 + 1] = BASE16_ENC_TAB[l]; // 映射低四位到编码表对应的字符 } // 返回编码后的字符串长度,即原始数据长度的两倍 return size * 2; } int main(int argc, char* argv[]) { cout