Mic*_*ICE 4 public-key rust ecdsa private-key
我能够在 Rust 中创建公共/私有 ecdsa 密钥,如何存储密钥以供进一步使用?我似乎找不到导出密钥的方法。
use p256::{ecdsa::{SigningKey, Signature, signature::Signer}};
use rand_core::OsRng; // requires 'getrandom' feature
fn main() {
// Signing
let signing_key = SigningKey::random(&mut OsRng); // Serialize with `::to_bytes()`
let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
let signature = signing_key.sign(message);
// Verification
use p256::ecdsa::{VerifyingKey, signature::Verifier};
let verifying_key = VerifyingKey::from(&signing_key); // Serialize with `::to_encoded_point()`
assert!(verifying_key.verify(message, &signature).is_ok());
}
Run Code Online (Sandbox Code Playgroud)
有许多不同的方式来表示键。在内部,它是一个可以直接转储的字节数组。但为了兼容性,您可能需要更标准化、人类可读的格式。
最常见的一种是PEM格式。
要获得 PEM,您不能直接构造SigningKey和。VerifyingKey您需要创建 aSecretKey和 a PublicKey。它们可以以 PEM 格式存储和加载。
然后您可以将 转换SecretKey为 aSigningKey并将 转换PublicKey为 a VerifyingKey。
请注意,您需要启用依赖项pem的功能p256:
p256 = { version = "0.11", features = ["pem"] }
Run Code Online (Sandbox Code Playgroud)
use p256::{
ecdsa::{
signature::{Signer, Verifier},
SigningKey, VerifyingKey,
},
pkcs8::EncodePrivateKey,
PublicKey, SecretKey,
};
use rand_core::OsRng;
fn main() {
// Generate secret key
let secret_key = SecretKey::random(&mut OsRng);
// Store secret key
let secret_key_serialized = secret_key
.to_pkcs8_pem(Default::default())
.unwrap()
.to_string();
println!("Secret Key: \n{}", secret_key_serialized);
// Load secret key
let secret_key = secret_key_serialized.parse::<SecretKey>().unwrap();
// Derive public key
let public_key = secret_key.public_key();
// Store public key
let public_key_serialized = public_key.to_string();
println!("Public Key: \n{}", public_key_serialized);
// Load public key
let public_key = public_key_serialized.parse::<PublicKey>().unwrap();
// Signing
let signing_key: SigningKey = secret_key.into();
let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
let signature = signing_key.sign(message);
// Verification
let verifying_key: VerifyingKey = public_key.into();
assert!(verifying_key.verify(message, &signature).is_ok());
}
Run Code Online (Sandbox Code Playgroud)
Secret Key:
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguKslF8gIC/Fm36Yk
SK2qZ4MXbUg/ZwCJwY9OmzRzkOehRANCAAQrRw99abOvHAPdz79CkuihXfaKZqx+
ZUG6iQRDzZy0c+gw20KeevA4gXKnW0nFK8PDmOgBprCU/uHf4vpMbqgo
-----END PRIVATE KEY-----
Public Key:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEK0cPfWmzrxwD3c+/QpLooV32imas
fmVBuokEQ82ctHPoMNtCnnrwOIFyp1tJxSvDw5joAaawlP7h3+L6TG6oKA==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |