使用Rust openssl导出EC公钥

使用Rust openssl导出EC公钥,rust,openssl,Rust,Openssl,我刚从rust开始玩一个玩具加密库。我想生成一个椭圆曲线私钥+公钥对,并以der或pem格式打印它们。我发现使用私钥非常简单 使用openssl::ec::{EcKey,EcGroup}; 使用openssl::nid::nid; pub fn生成密钥对{ 让group=EcGroup::from_curve_nameNid::SECP256K1.unwrap; let key=EcKey::generate&group.unwrap; println!{:?},key.private_key_

我刚从rust开始玩一个玩具加密库。我想生成一个椭圆曲线私钥+公钥对,并以der或pem格式打印它们。我发现使用私钥非常简单

使用openssl::ec::{EcKey,EcGroup}; 使用openssl::nid::nid; pub fn生成密钥对{ 让group=EcGroup::from_curve_nameNid::SECP256K1.unwrap; let key=EcKey::generate&group.unwrap; println!{:?},key.private_key_to_der.unwrap;//可以改用pem并以utf8字符串打印 } 但是,似乎没有任何方法像public_key to_der那样让EcKey导出公钥,即使调试打印也不起作用:

let public=key.public\u key; 普林顿!{:?},公众; 给出了一个编译错误

openssl::ec::EcPointRef` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`

好的,看起来我需要首先使用PKey::from_ec_key将其包装在PKey中

use openssl::ec::{EcKey,EcGroup, EcPoint};
use openssl::nid::Nid;

fn key_from_public_key() {

    let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
    let key = EcKey::generate(&group).unwrap();
    let mut ctx = openssl::bn::BigNumContext::new().unwrap();

    println!("private eckey = {:?}", key.private_key());

    let bytes = key.public_key().to_bytes(&group,
        openssl::ec::PointConversionForm::COMPRESSED, &mut ctx).unwrap();

    println!("public key = {:?}", bytes);

    drop(key);
    let public_key = EcPoint::from_bytes(&group, &bytes, &mut ctx).unwrap();
    let ec_key = EcKey::from_public_key(&group, &public_key).unwrap();

    assert!(ec_key.check_key().is_ok());

}