# #哈希 #随机 #csprng #no-alloc

no-std rand_hash

基于加密哈希函数的加密安全伪随机数生成器

3 个版本

0.1.0 2024年6月20日
0.1.0-rc22024年6月17日
0.1.0-rc12024年6月7日

#782 in 加密学

Download history 109/week @ 2024-06-01 36/week @ 2024-06-08 381/week @ 2024-06-15 26/week @ 2024-06-22 5/week @ 2024-06-29 51/week @ 2024-07-06 62/week @ 2024-07-13 14/week @ 2024-07-20 22/week @ 2024-07-27

每月 151 次下载
4 个 crate 中使用 (3 直接)

Apache-2.0

13KB
138

基于加密哈希函数的加密安全伪随机数生成器

HashRng 是一个 CSPRNG,它接受任何可哈希数据作为种子并产生一个与种子具有相同熵的随机数流。它使用 udigest crate 来明确地哈希种子。

动机

通常,CSPRNGs 有一个固定大小的种子。例如,ChaCha20Rng 的种子为 32 字节。这意味着当您想要从超过 32 字节熵的数据中提取随机性时,您必须截断种子到 32 字节(例如,通过哈希它),因此您将无法充分利用超过的熵。这可能会影响安全参数,使其不如期望的那么安全。

HashRng,另一方面,利用了种子的全部熵。它是通过哈希计数器然后对每个块进行种子(即输出随机数)来实现的:

HashRng(seed) = H(0, seed) || H(1, seed) || ...

安全和性能考虑

HashRng 在内部使用 u64 计数器,这意味着序列的周期是 Digest::OutputSize 的 264 倍(哈希输出的大小)。

尽管我们没有进行基准测试,但直观地来看,HashRng 预期将比基于排列的 CSPRNG(如 ChaCha20Rng)明显慢。

示例

use rand::RngCore;

#[derive(udigest::Digestable)]
pub struct Seed<'a> {
    nonce: &'a u8,
    param_a: &'a str,
    param_b: &'a str,
    // ...
}

let seed = Seed {
    nonce: b"very unpredictable string",
    param_a: "some other data containing entropy",
    param_b: "something else",
    // ...
};
let mut rng = rand_hash::HashRng::<sha2::Sha256, _>::from_seed(&seed);

let mut randomness = 0u8; 256;
rng.fill_bytes(&mut randomness);

依赖项

~435KB