#random #os

no-std rand_jitter

基于时间抖动的随机数生成器

8个版本

0.4.0 2023年12月8日
0.3.0 2020年9月7日
0.2.0 2019年6月6日
0.1.4 2019年5月2日
0.1.2 2019年1月31日

#51算法

Download history 105319/week @ 2024-04-23 103923/week @ 2024-04-30 104238/week @ 2024-05-07 97206/week @ 2024-05-14 104165/week @ 2024-05-21 107180/week @ 2024-05-28 101564/week @ 2024-06-04 108307/week @ 2024-06-11 93508/week @ 2024-06-18 104398/week @ 2024-06-25 83820/week @ 2024-07-02 110514/week @ 2024-07-09 97581/week @ 2024-07-16 94289/week @ 2024-07-23 94100/week @ 2024-07-30 112352/week @ 2024-08-06

416,369 每月下载量
3,361 个crate(2个直接) 中使用

MIT/Apache

42KB
412

rand_jitter

Test Status Latest version Book API API Minimum rustc version

基于时间抖动的非物理真实随机数生成器。

请注意,此RNG不适用于需要加密安全性的用例(也可参阅 此讨论)。

此crate依赖于 rand_core 并是 Rand项目 的一部分。

此crate旨在支持所有Rust的 std 平台,并使用系统提供的熵源。与其他Rand crate不同,此crate不支持 no_std(优雅地处理这是当前讨论的主题)。

链接

功能

此crate具有可选的 std 支持,默认情况下是 禁用的;此功能是提供 JitterRng::new 函数所必需的;如果没有 std 支持,则必须通过 JitterRng::new_with_timer 提供计时器。

质量测试

JitterRng::new() 内置了有限的质量测试,但在使用 JitterRng 在未经测试的硬件上或更改可能影响代码优化方式(如新的LLVM版本)后,建议运行更严格的 NIST SP 800-90B 熵估计套件

使用以下代码使用 timer_stats 收集数据

use rand_jitter::JitterRng;

use std::error::Error;
use std::fs::File;
use std::io::Write;

fn get_nstime() -> u64 {
    use std::time::{SystemTime, UNIX_EPOCH};

    let dur = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
    // The correct way to calculate the current time is
    // `dur.as_secs() * 1_000_000_000 + dur.subsec_nanos() as u64`
    // But this is faster, and the difference in terms of entropy is
    // negligible (log2(10^9) == 29.9).
    dur.as_secs() << 30 | dur.subsec_nanos() as u64
}

fn main() -> Result<(), Box<dyn Error>> {
    let mut rng = JitterRng::new_with_timer(get_nstime);

    // 1_000_000 results are required for the
    // NIST SP 800-90B Entropy Estimation Suite
    const ROUNDS: usize = 1_000_000;
    let mut deltas_variable: Vec<u8> = Vec::with_capacity(ROUNDS);
    let mut deltas_minimal: Vec<u8> = Vec::with_capacity(ROUNDS);

    for _ in 0..ROUNDS {
        deltas_variable.push(rng.timer_stats(true) as u8);
        deltas_minimal.push(rng.timer_stats(false) as u8);
    }

    // Write out after the statistics collection loop, to not disturb the
    // test results.
    File::create("jitter_rng_var.bin")?.write(&deltas_variable)?;
    File::create("jitter_rng_min.bin")?.write(&deltas_minimal)?;
    Ok(())
}

这将生成两个文件:jitter_rng_var.binjitter_rng_min.bin。按照以下概述运行熵估计套件的三种配置。每次运行都有两个步骤。一个步骤用于生成估计,另一个步骤用于验证估计。

  1. 估计熵收集器每轮至少可提供的预期熵量。此数字应大于使用 64 / test_timer() 估计的量。
    python noniid_main.py -v jitter_rng_var.bin 8
    restart.py -v jitter_rng_var.bin 8 <min-entropy>
    
  2. 在运行噪声源后,估计计时器增量最后4位中可用的预期熵量。请注意,3.70是该值的最小估计熵,代表真正的随机性。
    python noniid_main.py -v -u 4 jitter_rng_var.bin 4
    restart.py -v -u 4 jitter_rng_var.bin 4 <min-entropy>
    
  3. 估计如果两个噪声源只运行它们的最小次数,熵收集器可用的预期熵量。这测量了绝对的最坏情况,并给出了可用熵的下限。
    python noniid_main.py -v -u 4 jitter_rng_min.bin 4
    restart.py -v -u 4 jitter_rng_min.bin 4 <min-entropy>
    

许可证

rand_jitter根据MIT许可证和Apache许可证(版本2.0)的条款进行分发。

请参阅LICENSE-APACHELICENSE-MITCOPYRIGHT以获取详细信息。

依赖项

~37–365KB