【问题标题】:Export EC public key using Rust openssl使用 Rust openssl 导出 EC 公钥
【发布时间】:2020-03-12 15:30:54
【问题描述】:

我刚刚开始使用 rust 并按照https://docs.rs/openssl/0.10.28/openssl/ 的文档使用玩具加密库。我想生成一个椭圆曲线私钥+公钥对并以 der 或 pem 格式打印它们。我发现使用私钥非常简单

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

pub fn generate_keypair() {
    let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap();
    let key = EcKey::generate(&group).unwrap();
    println!("{:?}", key.private_key_to_der().unwrap()); // can use pem instead and print as utf8-string
}

但是似乎没有任何方法像public_key_to_der for EcKey 来导出公钥,即使调试打印它也不起作用:

let public = key.public_key();
println!("{:?}", public);

给出编译错误

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

【问题讨论】:

    标签: rust openssl


    【解决方案1】:
    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());
    
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2020-10-14
        相关资源
        最近更新 更多