我正在 Rust 中使用 Ring lib 来生成
ECDSA_P256
并且我正在传递 SystemRandom
,并且我正在获取 PKCS8 密钥对格式。到目前为止,没有任何问题。
let rng = SystemRandom::new();
let pkcs8_bytes = signature::EcdsaKeyPair::generate_pkcs8(&signature::ECDSA_P256_SHA256_ASN1_SIGNING, &rng)
.map_err(|e| Error::KeyGenerationFailed(e.to_string()))?;
对我来说,问题是当我从 PKCS8 格式加载密钥对时,它再次要求通过安全随机,例如:
let rng = SystemRandom::new();
let key_pair = signature::EcdsaKeyPair::from_pkcs8(
&signature::ECDSA_P256_SHA256_ASN1_SIGNING,
pkcs8_bytes.as_ref(),
&rng,
).map_err(|e| Error::KeyGenerationFailed(e.to_string()))?;
如果我只是从字节重新加载密钥对,为什么我需要传递 new
SystemRandom
?
我知道对于同一个 Kaypair,随机数应该始终相同,但是对于每个 Sign 操作,它应该不同,还是我错了?
这是因为 Rust 方法还根据存在的公钥对私钥进行验证。毕竟,它正在尝试将密钥对组合在一起。它通过执行签名/验证操作来实现这一点,您已经知道它需要安全的随机实现。
准确地说,对
new
函数的调用是在 from_pkcs8
函数末尾处按here所示进行的。