ZBLOG

使用 openssl API实现Base64的编解码

使用 OpenSSL API 实现 Base64 编解码可以通过 BIOEVP 接口来完成。以下是一个简单的示例代码,展示如何进行 Base64 编码和解码。

编码和解码示例

#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>

// Base64 编码
char* base64_encode(const unsigned char* input, int length) {
    BIO *bio, *b64;
    BUF_MEM *buffer_ptr;

    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);

    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); // 不要换行

    BIO_write(bio, input, length);
    BIO_flush(bio);
    
    BIO_get_mem_ptr(bio, &buffer_ptr);
    
    // 分配内存并复制编码后的字符串
    char* encoded_data = (char*)malloc(buffer_ptr->length + 1);
    memcpy(encoded_data, buffer_ptr->data, buffer_ptr->length);
    
    encoded_data[buffer_ptr->length] = '\0'; // 添加 null 终止符
    
    BIO_free_all(bio);

    return encoded_data;
}

// Base64 解码
unsigned char* base64_decode(const char* input, int* output_length) {
    BIO *bio, *b64;
    int decode_len = strlen(input);
    
    unsigned char* buffer = (unsigned char*)malloc(decode_len);
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_mem_buf((void*)input, decode_len);
    
    bio = BIO_push(b64, bio);
    
    // 将数据从Base64解码到buffer中
    *output_length = BIO_read(bio, buffer, decode_len);
    
    BIO_free_all(bio);

    return buffer; 
}

int main() {
    const char* original_text = "Hello World!";
    
    // 编码
    char* encoded_text = base64_encode((const unsigned char*)original_text, strlen(original_text));
    
    printf("Encoded: %s\n", encoded_text);

	// 解码
	int decoded_length;
	unsigned char* decoded_text = base64_decode(encoded_text, &decoded_length);

	printf("Decoded: %.*s\n", decoded_length, decoded_text);

	// 清理分配的内存
	free(encoded_text);
	free(decoded_text);

	return 0;
}

注意事项

  1. 编译:确保你的系统已经安装了 OpenSSL 库,并使用以下命令编译该程序:

    gcc -o base64_example base64_example.c -lssl -lcrypto
    
  2. 包含文件:在代码中,我们引入了 <openssl/bio.h><openssl/evp.h>,这些头文件提供了实现 Base64 功能所需的接口。

  3. 内存管理:在使用完编码或解码后,要记得释放分配的内存,以防止内存泄漏。

  4. 错误处理:上述代码没有添加错误处理逻辑。在生产代码中,建议根据需要添加相应的检查和处理,以保证健壮性。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21686

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?