# #随机 #生成器 #CPU #计数器 # #低质量

no-std poorentropy

适用于no_std的crate的低质量熵生成器

1个不稳定版本

0.1.0 2024年8月24日

721算法中排名

Download history 92/week @ 2024-08-18

每月92次下载

BSD-2-Clause

20KB
251

适用于no_std的crate的低质量熵生成器

此crate为无法依赖Rust标准库的crate提供可靠的熵源。此crate的设计目标是简单易用。

生成的熵不适合安全或加密(详见下文限制工作原理),尽管可以与其他熵源结合以提高安全性。此crate可用于测试或任何不需要安全性的随机化。

亮点

  • 无外部依赖
  • 不依赖于Rust标准库:这是一个no_stdcrate
  • 适用于所有现代架构:x86、AArch64、RISC-V 64、LoongArch64

用法和示例

get()返回一些熵作为u64

let e = poorentropy::get();

fill()bytes()可以用来获取熵的字节。

通常,不应直接使用熵源,而应将其用作伪随机数生成器的种子。以下是一个使用randcrate的示例

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上,时钟可能在运行时被禁用或重置,这可能导致返回非常低质量的熵值。

无运行时依赖