这是一个与密码栈交换中可能发布的内容有很多重叠的问题,但它主要是特定于锈蚀的,因此我在这里发布了它。
因此,我有一个应用程序,需要使用DH键盘。
重要的是,这个项目只是学术性的,这段代码不会在任何prod环境中使用。
我在一个已经使用了一个名为戴立克的机箱的上下文中工作,因此继续使用这个资源来创建键盘是有意义的。
文档化给出了密钥创建的示例:
use rand_core::OsRng;
use x25519_dalek::{EphemeralSecret, PublicKey};
let alice_secret = EphemeralSecret::new(OsRng);
let alice_public = PublicKey::from(&alice_secret);这是很好和直接向前,我们只是传递一个rng到短暂的秘密,以获得一个秘密密钥,并形成那里得到的PK。
但这就是我开始怀疑的地方。Osrng使用操作系统产生一些随机性。但是核心的文档没有提到它是一个密码安全的CSPRG。
另一方面,我以前使用rand包(它是Stdrng rng )为IV创建随机的数字列表。
use rand::{rngs::StdRng, Rng, SeedableRng,};
use rand_core::{RngCore, OsRng, CryptoRng,};
fn main() {
let mut rng : StdRng = StdRng::from_entropy();
let seed = rng.gen::<[u8;32]>();
}这让我想知道,使用像OSrng这样的裸骨是否可以安全地用于创建键控材料。或者,如果我更愿意为密码中使用的rng而射击。
如果是这样,我应该找到另一个随机性的来源,创造关键的材料,然后我有一个问题,如何做到这一点,在锈病(我是相当新的锈)。
我有点不清楚我应该给出EphemeralSecret上的构造函数是什么类型的EphemeralSecret。它的签名如下:
pub fn new<T: RngCore + CryptoRng>(mut csprng: T) -> Self {然后,我试图从兰特箱中传入Stdrng:
use rand::{rngs::StdRng, Rng, SeedableRng,};
use rand_core::{RngCore, OsRng, CryptoRng,};
fn main() {
let secretk = EphemeralSecret::new(StdRng);
}这在消息"expected value, found struct StdRng"中失败了,这对我来说很奇怪,因为OsRng也是一个结构。
我还尝试初始化一个rng并传递它:
let mut rng : StdRng = StdRng::from_entropy();
let seed = rng.gen::<[u8;32]>();
let secretk = EphemeralSecret::new(rng);因此,第二个问题是,有人知道我是否有办法用x25519_dalek创建关键材料,使用标准rand箱中具有crpytographically安全的随机性源吗?
发布于 2022-02-09 12:56:58
OsRng应该是加密安全的。它实现了CryptoRng,这是一个只为加密安全PRNG实现的特性,它由getrandom机箱支持,它总是使用系统的(或者,在WebAssembly情况下,使用环境的) CSPRNG。
对于CSPRNG来说,这总是一个明智的选择,但正如注释中提到的,它并不总是非常快,因为它涉及每个操作的系统调用,而且系统的CSPRNG也并不总是非常快。在这种情况下,您可以使用ThreadRng,它将更快,而且也是加密安全的。
https://stackoverflow.com/questions/71048413
复制相似问题