OpenSSL函数中的RSA *与BIO *类型变量是什么含义?
RSA * 类型说明及在RSA_generate_key_ex中的用法 - 核心作用:
RSA *是OpenSSL中封装RSA密钥、算法上下文的不透明结构体指针,所有RSA相关操作(密钥生成、加解密、签名验签)都要通过这个指针完成。你不需要手动维护结构体内部字段,所有操作都调用OpenSSL提供的对应API即可。 - 在
RSA_generate_key_ex中的使用规则:- 该参数是密钥内容的输出载体,不能直接传未初始化的野指针,也不能传
NULL,必须提前通过RSA_new()创建一个空的RSA实例传入 - 函数执行成功后,生成的公钥、私钥参数都会写入这个RSA实例指向的结构体中,后续所有RSA运算都直接复用这个实例
- 实例使用完成后必须调用
RSA_free()释放,避免内存泄漏
- 该参数是密钥内容的输出载体,不能直接传未初始化的野指针,也不能传
- 基础调用示例:
#include <openssl/rsa.h> #include <openssl/bn.h> // 创建空RSA实例 RSA *rsa = RSA_new(); // 初始化公钥指数e,生产环境常用值为RSA_F4(即65537,兼顾性能与安全性) BIGNUM *e = BN_new(); BN_set_word(e, RSA_F4); // 生成2048位RSA密钥,不需要进度回调时cb参数传NULL即可 int ret = RSA_generate_key_ex(rsa, 2048, e, NULL); if (ret != 1) { // 处理密钥生成失败逻辑 } // 此处可调用RSA相关API完成加解密、签名等操作 // ... // 释放资源 BN_free(e); RSA_free(rsa);
注意:OpenSSL 1.1.0及以上版本中RSA结构体是完全不透明的,禁止直接访问
rsa->n、rsa->e这类内部字段,必须通过RSA_get0_key等官方提供的getter API获取对应字段值。
BIO * 类型说明与使用方法 - 核心作用:
BIO *是OpenSSL抽象IO层的句柄指针,是OpenSSL对各类输入输出源的统一封装。不管底层是内存缓冲区、本地文件、网络套接字还是SSL加密连接,都可以用同一套BIO读写函数操作,完全屏蔽不同IO源的接口差异。 - 常见BIO类型:
- 内存BIO:数据存储在内存缓冲区中,常用于临时缓存DER/PEM编码的密钥、证书内容
- 文件BIO:对接本地文件,用于读写磁盘上的密钥、证书文件
- 套接字BIO:对接TCP连接,多用于网络通信场景
- 过滤BIO:可嵌套在其他BIO上层,自动完成Base64编解码、加解密等中间处理
- 基础使用规则:
- 根据使用场景调用
BIO_new_*系列函数创建对应类型的BIO实例 - 统一使用
BIO_read、BIO_write完成读写操作,不需要关注底层IO的实现逻辑 - 使用完成后调用
BIO_free释放实例,如果是多层嵌套的BIO链,释放顶层BIO时会自动释放链上所有关联BIO
- 根据使用场景调用
- 基础使用示例:
#include <openssl/bio.h> #include <openssl/pem.h> // 示例1:创建内存BIO,将RSA私钥以PEM格式写入内存缓冲区 BIO *mem_bio = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPrivateKey(mem_bio, rsa, NULL, NULL, 0, NULL, NULL); // 从内存BIO中取出写入的PEM内容 BUF_MEM *bptr = NULL; BIO_get_mem_ptr(mem_bio, &bptr); // bptr->data为PEM私钥文本起始地址,bptr->length为文本长度 // 示例2:创建文件BIO,将RSA公钥写入本地文件 BIO *file_bio = BIO_new_file("public.pem", "w"); PEM_write_bio_RSAPublicKey(file_bio, rsa); // 释放BIO资源 BIO_free(mem_bio); BIO_free(file_bio);
内容的提问来源于stack exchange,提问作者Yeraygb
相关产品推荐
相关产品推荐

