【发布时间】:2021-01-01 20:22:44
【问题描述】:
有没有办法从高熵种子中确定性地为 Go 中的加密生成随机字节?
我找到了crypto/rand,这对于加密来说是安全的,但不是确定性的。
我找到了math/rand,可以用种子初始化,但对加密不安全。
我找到了x/crypto/chacha20,我想知道将XORKeyStream 与src 值1s 一起使用是否安全。种子是密钥和随机数,可以使用 crypto/rand 生成。
编辑
作为我所追求的示例,cryptonite,它是主要的 Haskell 加密库,有一个函数 drgNewSeed,您可以使用它从种子生成随机生成器。
【问题讨论】:
-
我之前的评论可能有误。这可能会有所帮助:crypto.stackexchange.com/questions/39186/…
-
“确定性”和“加密安全”不是矛盾的吗?如果您出于测试目的需要它,请使用接口并在测试中模拟它。
-
许多加密 RBG 的输出只有在它们的内部状态保密时才能预测。流密码是真实的。这个问题没有任何矛盾或不合理的地方。
-
@Flimzy 这可能是特定领域的行话,但该短语被接受,并提高了文献搜索结果的准确性。例如,请参阅NIST's Recommendation for Random Number Generation Using Deterministic Random Bit Generators.
-
KDF 不必很慢。您正在考虑的类别是 PBKDF(基于密码的 KDF)。 HKDF(HMAC KDF)是一种快速KDF。但我同意 KDF 通常不是您想要的。您的问题准确地描述了一个 CSPRNG。我不知道为什么会有这么多反对意见。所有 PRNG(包括 CSPRNG)都是确定性的。这就是“P”的全部意义所在。生成随机但确定性的值流是一半加密系统的工作方式。 (其他生成随机但确定性的排列流。)
标签: go random cryptography