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 在 算法 中
416,369 每月下载量
在 3,361 个crate(2个直接) 中使用
42KB
412 行
rand_jitter
基于时间抖动的非物理真实随机数生成器。
请注意,此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.bin
和 jitter_rng_min.bin
。按照以下概述运行熵估计套件的三种配置。每次运行都有两个步骤。一个步骤用于生成估计,另一个步骤用于验证估计。
- 估计熵收集器每轮至少可提供的预期熵量。此数字应大于使用
64 / test_timer()
估计的量。python noniid_main.py -v jitter_rng_var.bin 8 restart.py -v jitter_rng_var.bin 8 <min-entropy>
- 在运行噪声源后,估计计时器增量最后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>
- 估计如果两个噪声源只运行它们的最小次数,熵收集器可用的预期熵量。这测量了绝对的最坏情况,并给出了可用熵的下限。
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-APACHE、LICENSE-MIT和COPYRIGHT以获取详细信息。
依赖项
~37–365KB