Deterministic RNG 是一种伪随机数生成器。它按固定过程计算数值,而不是为每个数值重新测量一个随机物理现象。它从称为 seed 的输入开始,并保存内部状态,也就是下一步计算所需的信息。用完全相同的输入重复整个过程,就能重现结果,这对测试很有用。但安全的密码学生成器还需要合理的设计和足够的熵,即从攻击者角度看,输入中有多少不确定性。
设想暂停一次计算,并保存它的内存。回到同一个位置,继续提供相同的后续输入,就可能重现之后的结果。NIST SP 800-90A 将这类生成器称为 DRBG。算法、设置和请求顺序都很重要。补充新鲜熵的过程称为 reseeding,它会改变状态。因此,仅仅 seed 相同,并不保证不同程序的输出也相同。 [1]
简单的模拟程序也能生成看起来随机的数字,但这不足以保护钱包。RFC 4086 提醒,有些序列即使通过统计测试,仍可能被攻击者预测。密码学强度足够的生成器,即使部分输出已经公开,其余输出仍应在实践中难以预测。关键是设计,以及初始材料的质量和保密性,而不只是“确定性”这个名称。 [2]
查找程序错误时,能够准确重现同一种情况很有帮助。因此,libsodium 的 randombytes_buf_deterministic() 会对相同 seed 返回相同序列。开发者可以公布预期结果,供其他人核对。也正因如此,公开的测试 seed 不能用于真实钱包:任何人都能从中计算出相同的“秘密”。 [3]
BIP32 利用类似的可重现性来派生密钥,但这与通用随机数据生成并不是同一个过程。它从一个 seed 建立分支式的密钥树,由派生路径确定所用分支。因此,相同 seed 和路径可以重新得到相同密钥。不过,多派生一个地址,本身并不会给原始秘密增加新的独立熵。 [4]
在 BIP39 中,称为 mnemonic 的恢复词只是输入的一部分。PBKDF2 将这些词与 passphrase 结合,计算用于后续派生的 seed;passphrase 是可选的附加秘密。即使恢复词不变,换一个 passphrase 也会得到不同结果。因此,要恢复相同密钥,必须具备全部原始输入及对应的派生方法。仅仅恢复词相同还不够。 [5]
数字签名证明相应秘密密钥的持有者授权了一笔交易。RFC 6979 描述了如何根据该密钥和待签名消息,计算签名所需的辅助值 k。于是,这一步不必每次都获取新的随机值。但最初生成密钥时,仍然需要高质量的随机性。正确的签名过程无法补救一个从一开始就容易被猜中的密钥。 [6]
用 BIP32 恢复相同密钥是我们想要的结果;意外重复本应全新的值则不是。虚拟机快照会保存计算机状态,包括内存。libsodium 提醒,恢复快照也可能重复生成器的状态和输出。因此,复制运行环境时,不能假定每个运行中的副本都会自动生成彼此独立的秘密。 [3] [4]
开发者会把结果与测试向量比较,也就是一组已知输入及其预期输出。两者一致,说明程序正确计算了这个例子,却不能证明实际设备获取的熵质量足够好。NIST SP 800-90A 分别讨论生成机制与输入要求。因此,还需考察程序版本、设置和熵的补充方式。单凭 Deterministic RNG 这个标签,无法判断钱包是否安全。 [1]
要获得更完整的理解,请将本词条与以下词条结合阅读: CSPRNG, Random Number Generator, HD Wallet, Seed Generation. 反向关联还来自: CSPRNG, COLDCARD RNG Incident (2026).