如何通过OpenSSL C API读取字节数组中DER格式的椭圆曲线公钥
读取内存中DER格式椭圆曲线公钥的OpenSSL C API
你需要的核心函数是d2i_EC_PUBKEY(),该函数专门用于从已加载到内存的字节数组中,解析DER编码的椭圆曲线公钥,完全匹配你通过命令生成的public.der文件格式。
基础使用示例
首先确保你已经将public.der的全部内容读入字节数组der_buf,数组长度为der_len,参考代码如下:
#include <openssl/ec.h> #include <openssl/err.h> int main() { // 假设你已经完成公钥文件读取,der_buf为字节数组首地址,der_len为字节长度 const unsigned char *temp_buf = der_buf; // 用临时指针避免修改原数组指针 EC_KEY *pub_key = d2i_EC_PUBKEY(NULL, &temp_buf, der_len); if (pub_key == NULL) { // 解析失败时打印错误信息 ERR_print_errors_fp(stderr); return -1; } // 此处可正常使用解析好的公钥做验签等操作 // 用完必须释放资源 EC_KEY_free(pub_key); return 0; }
注意事项
- 函数第二个参数是二级指针,内部解析时会移动指针指向,如果你后续还需要用到原
der_buf指针,一定要像示例一样传入临时指针的地址,避免原指针被修改 - 只要你的DER公钥本身是合法的,解析得到的
EC_KEY结构会自动匹配prime256v1的曲线参数,不需要额外手动设置 - 如果你使用的是OpenSSL 3.0及以上版本,推荐使用更通用的
EVP_PKEY系列接口,对应函数为d2i_PUBKEY_ex(),示例:
#include <openssl/evp.h> // 解析逻辑 const unsigned char *temp_buf = der_buf; EVP_PKEY *pub_key = d2i_PUBKEY_ex(NULL, &temp_buf, der_len, EVP_PKEY_EC, NULL); // 释放逻辑 EVP_PKEY_free(pub_key);
内容的提问来源于stack exchange,提问作者Jan Schatz
相关产品推荐
相关产品推荐

