Openssl-BIO接口

  • BIO包含了多种接口,用于控制在BIO_METHOD中的不同实现函数,包括6种filter型和8种source/sink型。
    应用场景:
  • BIO_new创建一个BIO对象
  • 数据源:source/sink类型的BIO是数据源BIO_new(BIO_s_mem())
  • 过滤:filter BIO就是把数据从一个BIO转换到另外一个BIO或应用接口
    • BIO_new(BIO_f_base64())
  • BIO链:一个BIO链通常包括一个source BIO和一个或多个filter BIO
    • BIO_push(b64_bio, mem_bio);
  • 写编码,读编码 BIO_write BIO_read_ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<iostream>
#include<openssl/rand.h>
#include<openssl/evp.h>
#include<openssl/buffer.h>
using namespace std;
int Base64Decode(const char* in, int len, unsigned char* out_data) {
if (!in || len <= 0 || !out_data) {
return 0;
}
//内存源
auto mem_bio = BIO_new_mem_buf(in, len);
if (!mem_bio)return 0;
//base64过滤器
auto b64_bio = BIO_new(BIO_f_base64());
if (!b64_bio) {
BIO_free(mem_bio);
return 0;
}
//形成BIO链(会形成一个链表)
BIO_push(b64_bio, mem_bio);
//读取到Base64 filter 进行解码,结果会传递到链表的下一个节点
//默认会读取换行符认为结束
BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL); //设置不加换行符
size_t size = 0;
BIO_read_ex(b64_bio,out_data,len, & size);

BIO_free_all(b64_bio); //释放整个链表
return size;
}
int Base64Encode(const unsigned char* in, int len, char* out_base64) {
if (!in || len <= 0 || !out_base64) {
return 0;
}
//内存源
auto mem_bio = BIO_new(BIO_s_mem());
if (!mem_bio)return 0;

auto b64_bio = BIO_new(BIO_f_base64());
if (!b64_bio) {
BIO_free(mem_bio);
return 0;
}
//形成BIO链(会形成一个链表)
BIO_push(b64_bio, mem_bio);
BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL); //设置不加换行符
//写入到Base64 filter 进行编码,结果会传递到链表的下一个节点
//到mem种读取结果(链表头部代表了整个链表)
//BIO write编码 3字节->4字节
//BIO read解码 4字节->3字节

//编码数据每64字节会加\n换行符
int re = BIO_write(b64_bio, in, len);
if (re <= 0) {
//清空了整个链表节点
BIO_free_all(b64_bio);
return 0;
}
//刷新BIO链表,写入链表的mem
BIO_flush(b64_bio);
int outsize = 0;
//从链表源内存读取数据
BUF_MEM* p_data = 0;

BIO_get_mem_ptr(b64_bio, &p_data);
if (p_data) {
memcpy(out_base64, p_data->data,p_data->length);
outsize = p_data->length;
}
BIO_free_all(b64_bio); //释放整个链表
return outsize;
}
int main() {
cout << "Test openssl BIO base64!" << endl;
unsigned char data[] = "测试Base64数据1234325443154154324132432142e32143211ewe32erqwerewq rewq feewqfwe32r32414532r";
int len = sizeof(data);
unsigned char out[1024] = { 0 };
int re = Base64Encode(data, len, (char*)out);
if (re > 0) {
out[re] = '\0';
cout << out << endl;
}
unsigned char out2[1024] = { 0 };
re = Base64Decode((char*)out, re, out2);
cout << out2 << endl;
getchar();
return 0;
}

Openssl-BIO接口
https://43.242.201.154/2025/07/24/Openssl-BIO接口/
Author
Dong
Posted on
July 24, 2025
Licensed under