gpt4 book ai didi

go - 加密的确定性伪随机字节

转载 作者:行者123 更新时间:2023-12-03 10:06:28 26 4
gpt4 key购买 nike

有没有办法从高熵种子中确定性地为 Go 中的加密生成随机字节?

我找到了 crypto/rand ,这对于加密来说是安全的,但不是确定性的。

我找到了 math/rand ,可以用种子初始化,但对加密不安全。

我找到了 x/crypto/chacha20 ,我想知道使用 XORKeyStream 是否安全src 值为 1s。种子是 key 和随机数,可以使用 crypto/rand 生成。

编辑

作为我所追求的示例,cryptonite ,它是主要的 Haskell 加密库,有一个函数 drgNewSeed,您可以使用它从种子生成随机生成器。

最佳答案

是的,XORKeyStream 可以很好地解决这个问题,并且对于 CSPRNG 来说是一个很好的设计。流密码的全部意义在于它在给定种子( key 和 IV)的情况下生成“有效随机”值的流。然后将这些流值与明文进行异或。在这种情况下,“有效随机”意味着没有“有效算法”(在多项式时间内运行的算法)可以将此序列与“真正随机”序列区分开来。这就是你想要的。

不过,没有必要加入 ChaCha20。您可以使用像 AES 这样的内置密码。任何分组密码都可以使用多种模式之一转换为流密码,例如 CTR、OFB 或 CFB。这些模式之间的差异对于这个问题并不重要。

// Defining some seed, split across a "key" and an "iv"
key, _ := hex.DecodeString("6368616e676520746869732070617373")
iv, _ := hex.DecodeString("0123456789abcdef0123456789abcdef")

// We can turn a block cipher into a stream cipher, and AES is handy
block, err := aes.NewCipher(key)

if err != nil {
panic(err)
}

// Convert block cipher into a stream cipher using a streaming mode like CTR
// OFB or CFB would work, too
stream := cipher.NewCTR(block, iv)

for x := 0; x < 10; x++ {
// Create a fixed value of the size you want
value := []byte{0}

// Transform it to a random value
stream.XORKeyStream(value, value)

fmt.Printf("%d\n", value)
}

Playground

您可以在此处使用其他几种方法。您可以使用像 SHA-256 这样的安全散列来散列一个计数器(选择一个随机的 128 位数字并不断增加它,对每个值进行散列)。或者你可以对之前的结果进行哈希处理(我听说过一些关于重复哈希是否可能影响哈希的安全性的争议。请参阅 https://crypto.stackexchange.com/questions/19392/any-weakness-when-performing-sha-256-repeatedlyhttps://crypto.stackexchange.com/questions/15481/will-repeated-rounds-of-sha-512-provide-random-numbers/15488 了解更多信息。)

您也可以使用分组密码来做同样的事情,方法是对计数器或之前的输出进行加密。这与流密码模式所做的非常接近。您也可以手动完成。

如果你想深入研究这个,你可以在 crypto.stackexchange.com 上搜索 "csprng stream cipher"。这是寻求加密建议的更好地方,但 IMO 这是一个特定于编程的问题,所以属于这里。

关于go - 加密的确定性伪随机字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65533390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com