You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenSSL 3中用推荐函数从qx、qy创建EC公钥

在OpenSSL 3中从qx/qy创建EC公钥的方法

OpenSSL 3.x中EVP_PKEY_fromdata()确实仅支持传入完整编码的公钥(如PEM/DER格式),无法直接通过qx/qy参数构造。要实现需求,需通过EC_KEY + EC_POINT的底层API组合完成,这些接口在OpenSSL 3中均为非废弃状态,具体步骤如下:

核心实现步骤

  1. 获取对应椭圆曲线的EC_GROUP
    使用EC_GROUP_new_from_name()(OpenSSL 3.0+推荐接口)创建曲线组,示例中以secp256r1为例:

    EC_GROUP *ec_group = EC_GROUP_new_from_name(OSSL_LIB_CTX_get0_global_default(), "secp256r1");
    if (ec_group == NULL) {
        // 错误处理
        return NULL;
    }
    
  2. 初始化EC_KEY并关联曲线组
    创建EC_KEY对象并绑定已获取的曲线组:

    EC_KEY *ec_key = EC_KEY_new();
    if (ec_key == NULL || !EC_KEY_set_group(ec_key, ec_group)) {
        // 错误处理
        EC_GROUP_free(ec_group);
        return NULL;
    }
    
  3. 通过qx/qy构造EC_POINT公钥点
    将qx、qy转换为BIGNUM类型后,设置到EC_POINT中:

    EC_POINT *ec_point = EC_POINT_new(ec_group);
    if (ec_point == NULL) {
        // 错误处理
        EC_KEY_free(ec_key);
        EC_GROUP_free(ec_group);
        return NULL;
    }
    
    // 假设qx、qy已转换为BIGNUM*类型的bn_qx、bn_qy
    if (!EC_POINT_set_affine_coordinates(ec_group, ec_point, bn_qx, bn_qy, NULL)) {
        // 错误处理
        EC_POINT_free(ec_point);
        EC_KEY_free(ec_key);
        EC_GROUP_free(ec_group);
        return NULL;
    }
    
  4. 将EC_POINT绑定到EC_KEY并转换为EVP_PKEY
    把构造好的公钥点设置到EC_KEY,再转换成OpenSSL 3推荐的EVP_PKEY对象:

    if (!EC_KEY_set_public_key(ec_key, ec_point)) {
        // 错误处理
        EC_POINT_free(ec_point);
        EC_KEY_free(ec_key);
        EC_GROUP_free(ec_group);
        return NULL;
    }
    
    EVP_PKEY *pkey = EVP_PKEY_new_from_EC_KEY(ec_key);
    
  5. 资源清理
    注意释放临时创建的对象,避免内存泄漏:

    EC_POINT_free(ec_point);
    EC_KEY_free(ec_key);
    EC_GROUP_free(ec_group);
    

关键注意事项

  • 确保qx、qy的长度和格式与所选椭圆曲线匹配,否则EC_POINT_set_affine_coordinates会执行失败。
  • 所有BIGNUM类型的qx/qy需自行从原始字节转换,可使用BN_bin2bn()等接口完成。
  • 若需使用自定义库上下文(OSSL_LIB_CTX),可替换OSSL_LIB_CTX_get0_global_default()为自定义上下文对象。

内容的提问来源于stack exchange,提问作者ivan_onys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:01:09