如何显示OpenSSL签名?



我对String::from_utf8的尝试返回错误:

fn main() {
let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap();
let pair = PKey::from_ec_key(EcKey::generate(&group).unwrap()).unwrap();
println!(
"Public: {:?}",
String::from_utf8(pair.public_key_to_pem().unwrap())
);
println!(
"Private: {:?}",
String::from_utf8(pair.private_key_to_pem_pkcs8().unwrap())
);
let data = b"hello";
let mut signer = Signer::new(MessageDigest::sha512(), &pair).unwrap();
signer.update(data).unwrap();
let signature = signer.sign_to_vec().unwrap();
println!("Signature: {:?}", String::from_utf8(signature));
}
Public: Ok("-----BEGIN PUBLIC KEY-----n...n-----END PUBLIC KEY-----n")
Private: Ok("-----BEGIN PRIVATE KEY-----n...n-----END PRIVATE KEY-----n")
Signature: Err(FromUtf8Error { bytes: [48, 69, 2, 33, 0, 221, 124, 107, 80, 118, 244, 208, 146, 83, 198, 12, 244, 45, 218, 184, 160, 152, 119, 117, 176, 124, 209, 252, 115, 173, 49, 31, 84, 247, 201, 187, 233, 2, 32, 1, 126, 10, 149, 78, 239, 13, 110, 84, 60, 81, 111, 252, 195, 246, 214, 176, 157, 116, 65, 125, 75, 66, 164, 207, 110, 141, 203, 85, 60, 111, 126], error: Utf8Error { valid_up_to: 5, error_len: Some(1) } })

如何以字符串形式获取签名?

公钥和私钥在这里以PEM格式表示,这是人类可读的,因此可以在String中存储。

但是,签名将作为原始二进制数据返回。它不是人类可读的,因此不能直接存储在字符串中。

如果你仍然想把它存储在一个字符串中,你必须把它转换成人类可读的编码,如base64

use openssl::{
ec::{EcGroup, EcKey},
hash::MessageDigest,
nid::Nid,
pkey::PKey,
sign::Signer,
};
fn main() {
let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap();
let pair = PKey::from_ec_key(EcKey::generate(&group).unwrap()).unwrap();
println!(
"Public:n{}n",
String::from_utf8(pair.public_key_to_pem().unwrap()).unwrap()
);
println!(
"Private:n{}n",
String::from_utf8(pair.private_key_to_pem_pkcs8().unwrap()).unwrap()
);
let data = b"hello";
let mut signer = Signer::new(MessageDigest::sha512(), &pair).unwrap();
signer.update(data).unwrap();
let signature = signer.sign_to_vec().unwrap();
let signature_base64 = base64::encode(signature);
println!("Signature:n{}n", signature_base64);
}
Public:
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEfC8hXiKyuS2U/Kcg+HQuKYA+29wYZeGj
lOSTeMhj7xTqktPrCONJg1Acb1rjqU4kNdMEzUMwKemoqT0OWe/5yw==
-----END PUBLIC KEY-----

Private:
-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQg64c0IelDNgh9MsROvoGQ
TCUMbklvGtWF1RcLhsdLefmhRANCAAR8LyFeIrK5LZT8pyD4dC4pgD7b3Bhl4aOU
5JN4yGPvFOqS0+sI40mDUBxvWuOpTiQ10wTNQzAp6aipPQ5Z7/nL
-----END PRIVATE KEY-----

Signature:
MEUCIEnP49eZTk6y624A+FPCLIWNEpkZMj82QOu99BFi6r/tAiEA7ThuWNF/j5hTSw8N2MNOv1D3fU4a7ThYz1cu/jQJNrk=

请注意,如果要稍后使用它进行验证,则必须将base64编码字符串转换回其原始表示形式。

最新更新