【问题标题】:How to convert &rsa::RsaPublicKey(BigUint) to PEM and print it in RUST?如何将 &rsa::RsaPublicKey(BigUint) 转换为 PEM 并在 RUST 中打印?
【发布时间】:2021-11-21 23:21:34
【问题描述】:

我正在关注这个tutorial,我希望它生成和使用 RSA 私钥和公钥并加密/解密文本并打印它,现在我想在程序中看到这些密钥,这是我得到了:

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

fn main() {
    use rsa::{PublicKey, RsaPrivateKey, RsaPublicKey, PaddingScheme};
    use rand::rngs::OsRng;
    let mut rng = OsRng{};
    let bits = 2048;
    let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
    let public_key = RsaPublicKey::from(&private_key);
    print_type_of(&public_key);
    println!("{:?}",public_key);
    println!("Public key: {}", String::from_utf8(public_key).unwrap());
}

我明白了:

error[E0308]: mismatched types
  --> src/main.rs:21:47
   |
21 |     println!("Public key: {}", String::from_utf8(public_key).unwrap());
   |                                                  ^^^^^^^^^^ expected struct `Vec`, found struct `rsa::RsaPublicKey`
   |
   = note: expected struct `Vec<u8>`
              found struct `rsa::RsaPublicKey`

如果我删除展开线:

rsa::key::RsaPublicKey
RsaPublicKey { n: BigUint { data: [9176583044655610753, 8052921767573809665, 7322363310924215903, 10677358141470723739, 12379608428747184411, 6263963070332523975, 5963846880211652521, 16864047741974290629, 213896623420857268, 4937645776431077684, 15969812743294577757, 13867032477882121383, 5383248258773390155, 14444169918078759013, 9044709521184374311, 9755296615001295698, 18343743949489547843, 12343850134323169490, 16855493837721939000, 14970248798399036434, 16075416073667271075, 9024185634616256000, 14707399524398597897, 11804989747190776592, 11692677034154985673, 10043641354879364290, 2996813664869425496, 3933982337995406743, 15967428092655221732, 12491687912286251425, 2181688508710390266, 14829946030052214341] }, e: BigUint { data: [65537] } }

我如何将这个Big integer 公钥打印到 PEM 中,就像程序中的字符一样?

PS : Playgound 显示另一个错误!

rand = "=0.8"
rsa= "=0.5.0"

【问题讨论】:

标签: encryption rust rsa


【解决方案1】:

我应该感谢 yolenoyer 的评论,但是这行:

println!("Public key: {:?}", pkcs1::ToRsaPublicKey::to_pkcs1_pem(&public_key));

pkcs1="=0.2.4",就是解决方案!它返回:

Public key: Ok("-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAoqQqiUB+Cha260Xa0ldy8gEfiI9GlL9xBEvhRHgHZ91Kq8V22utF\nI/+wng2Uo+Pw4IcopZGuo5MZVwh8THTlLO1i+DJu+/2l2uWY1nS6fkNVJ38AsP0i\ntuyphx1SYJsEY2oO30BqRQWVZ6tGrCtPueqdXWJH12+3sYE3h+kzAa6SVs8jin4u\nAhI0hhRLv2FhHDZM4JDdzhVxQBKg9pNPqUuLCnDPIMSkJyS8QxSzWVcneY8YuJRx\n2HSzPWtB8BZRypvpSS8eYsb9ltfN3d/5OT5g74L/+5NTVIHKo+Dl6gZpAjdeJEM1\nx+DlNe8GENMXakjWBRdL5Kqa6lhZk7dI2QIDAQAB\n-----END RSA PUBLIC KEY-----\n")

如果它可以理解下一行(\n),那就太好了,但它是 PEM,我不能再抱怨了!

但如果你想打印得更漂亮:

let pem1 = pkcs1::ToRsaPublicKey::to_pkcs1_pem(&public_key).unwrap();
print_type_of(&pem1);
eprintln!("Public key: {}",pem1 );

它会:

alloc::string::String
Public key: -----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAmL/BrxO574dYy8rN257CihwRONXz0949kRBJq/RtTG+1P8zDRD8y
IfJhFH83IaibNGxZFCrjcCL5my9bpfo6mena5B59FLghDn8UKZjx/ZqeVF5DCrfG
eRAe0LZqcpgvnaC+IKtAO3fsGn/gMYj7v45U5WAh+DadnjU5UqID9iyMON1w0T1K
hWYQNLeabppCNYMYFv1FfxG2aIA+zsTVl8JzvhptAZ39S7fMCuQugxGwAEp9+hZ3
o3OXk5Gkb3nm2maDb4TgAMdAF5upZcjjJm5ydQoB0IRbh6/JfYwogIpmudvT8+Mj
CPkYoN7WPu2LJ8tevPIQ4M3E73sFIW6c7wIDAQAB
-----END RSA PUBLIC KEY-----

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2021-07-14
    • 2011-03-06
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2011-04-03
    相关资源
    最近更新 更多