1个不稳定版本
新 0.1.0 | 2024年8月24日 |
---|
721在算法中排名
每月92次下载
20KB
251 行
适用于no_std
的crate的低质量熵生成器
此crate为无法依赖Rust标准库的crate提供可靠的熵源。此crate的设计目标是简单易用。
生成的熵不适合安全或加密(详见下文限制和工作原理),尽管可以与其他熵源结合以提高安全性。此crate可用于测试或任何不需要安全性的随机化。
亮点
- 无外部依赖
- 不依赖于Rust标准库:这是一个
no_std
crate - 适用于所有现代架构:x86、AArch64、RISC-V 64、LoongArch64
用法和示例
let e = poorentropy::get();
通常,不应直接使用熵源,而应将其用作伪随机数生成器的种子。以下是一个使用rand
crate的示例
use rand::RngCore;
use rand::SeedableRng;
use rand::rngs::SmallRng;
let mut seed = <SmallRng as SeedableRng>::Seed::default();
poorentropy::fill(&mut seed);
let mut rng = SmallRng::from_seed(seed);
// Use the `rng`...
let r = rng.next_u32();
工作原理
此crate通过读取CPU的"时钟"或"周期计数器"并将其混合以生成伪随机值来工作。
下表描述了如何为每个支持的架构获取CPU时钟/计数器值
目标 | 来源 |
---|---|
AArch64 | cntvct_el0 |
LoongArch64 | rdtime.d |
RISC-V 64 | rdcycle |
x86 / x86_64 | rdtsc |
从CPU获取的值也会添加到内部计数器中,目的是为了避免同时调用 get()
的并发线程返回相同的熵值。
然后将得到的值输入到 SplitMix64 生成器中,使其看起来是随机的。
局限性
-
由于这个包依赖于CPU时钟,它产生的值可能很容易预测。因此,这个包本身可能不适用于安全应用,因为攻击者可能能够猜测产生的熵值。然而,它可以与其他熵源结合使用,以提高安全性。
-
这个包试图使同一进程中的两个线程难以获得相同的熵值。但对于不同的进程,没有做出任何保证。
-
在某些CPU上,时钟在启动时可能从固定的值开始。因此,如果这个包用于在启动时运行的早期应用(如固件、引导加载程序或内核),则可能每次启动都会产生相同的熵值。
-
在某些CPU上,时钟可能在运行时被禁用或重置,这可能导致返回非常低质量的熵值。