Go 如何检查随机性?

Go 如何检查随机性?,go,encryption,public-key-encryption,Go,Encryption,Public Key Encryption,我正在使用BIP39规范生成12字助记符,该助记符稍后将用于生成主公钥/私钥及其2^32-1子密钥。然后,这些子密钥将用于非对称加密 import ( "github.com/tyler-smith/go-bip39" "github.com/tyler-smith/go-bip32" b64 "encoding/base64" ) type BipKeys struct { Entropy []byte Mnemonic string Pa

我正在使用BIP39规范生成12字助记符,该助记符稍后将用于生成主公钥/私钥及其2^32-1子密钥。然后,这些子密钥将用于非对称加密

 import (
   "github.com/tyler-smith/go-bip39"
   "github.com/tyler-smith/go-bip32"
   b64 "encoding/base64"
 )
 type BipKeys struct {
     Entropy []byte
     Mnemonic string
     Passphrase []byte
     Seed []byte
     MnemonicShares []string
     RootPublicExtendedKey *bip32.Key
     RootPrivateExtendedKey *bip32.Key
     RootPrivateHexKey string
}

func(instance *BipKeys) GenerateEntropy(numberOfBytes int)([]byte, error){
   entropy, err := bip39.NewEntropy(numberOfBytes)
   if err != nil {
     log.Printf("There is some error generating entropy %s", err)
}
   return entropy, err
}

func (instance *BipKeys) GenerateMnemonic(entropy []byte) (string, error){
   mnemonic, err := bip39.NewMnemonic(entropy)
   if err != nil {
     log.Printf("Some error in generating Mnemonic %s", err)

 }
    return mnemonic, err
 }

func (instance *BipKeys) GeneratePassphrase(saltBytes int, passphraseBytes int) ([]byte, error){
  salt := GenerateRandomSalt(8)
  passphrase := GenerateRandomString(8)
  password, err := GenerateScryptKey(salt, []byte(passphrase))
  return password, err
}
GenerateRandomString和GenerateRandomSalt只是基于crypto/rand包生成随机字符串和字节

我的问题是,当人们说没有正确地从随机函数生成的键很容易断开时,它们实际上是什么意思? 如何检查bip39.NewEntropy(numberOfBytes)是否实际生成了记忆所需的完美熵? 有没有什么方法可以让我检查是否只需暴露前5个单词就可以生成12个单词的助记符(这意味着熵函数的实现不正确,容易受到攻击)

我的问题是,当人们说密钥没有正确生成时 从随机函数很容易中断,他们实际上是什么 什么意思

在密码学中,坏随机性通过两种方式受到攻击:

  • 通过彻底搜索用于生成比特流的种子。一个突出的例子是

  • 通过攻击不满足密码要求的随机数生成器的可预测性。在统计随机数生成器中,主要要求数据看起来是随机的。在加密随机数生成器中,我们需要更多:给定比特流,知道算法的非常聪明的人无法确定随机数生成器的未来或以前的比特是什么。例如,虽然具有较大的内部状态,但它不满足加密要求

  • 你关于测量熵的问题是错误的。测量熵就是把它当作一个统计随机数发生器,而不是密码随机数发生器。你说:

    GenerateRandomString和GenerateRandomSalt只是基于crypto/rand包生成随机字符串和字节

    这就是你所需要知道的——你不必担心其他任何事情。如上所述,无论测量多少熵都不能告诉您密钥是安全的。相反,您需要成为密码专家来分析此类算法。对于随机性的消费者来说,您所能做的(除了使用另一个源,比如/dev/uradom)就是相信它已经被设计好并由密码专家进行了分析

    我的问题是,当人们说密钥没有正确生成时 从随机函数很容易中断,他们实际上是什么 什么意思

    在密码学中,坏随机性通过两种方式受到攻击:

  • 通过彻底搜索用于生成比特流的种子。一个突出的例子是

  • 通过攻击不满足密码要求的随机数生成器的可预测性。在统计随机数生成器中,主要要求数据看起来是随机的。在加密随机数生成器中,我们需要更多:给定比特流,知道算法的非常聪明的人无法确定随机数生成器的未来或以前的比特是什么。例如,虽然具有较大的内部状态,但它不满足加密要求

  • 你关于测量熵的问题是错误的。测量熵就是把它当作一个统计随机数发生器,而不是密码随机数发生器。你说:

    GenerateRandomString和GenerateRandomSalt只是基于crypto/rand包生成随机字符串和字节


    这就是你所需要知道的——你不必担心其他任何事情。如上所述,无论测量多少熵都不能告诉您密钥是安全的。相反,您需要成为密码专家来分析此类算法。对于随机性的消费者来说,您所能做的(除了使用另一个源代码,如/dev/uradom)就是相信它设计得很好,并且经过了密码专家的分析。

    我要补充的是,“另一个源代码,如/dev/uradom”正是
    crypto/rand
    在许多系统上的实现方式
    crypto/rand
    本身不实现任何随机数算法。它只是使用了最好的、非阻塞的、操作系统提供的随机性源。(在现代操作系统中,阻塞和非阻塞之间的区别通常并不重要,但过去是如此。)这样,如果您的系统改进了其RNG(通过操作系统升级或硬件访问高级熵源),则
    crypto/rand
    的所有用户都可以免费获取它正是在许多系统上实现
    crypto/rand
    的方式
    crypto/rand
    本身不实现任何随机数算法。它只是使用了最好的、非阻塞的、操作系统提供的随机性源。(在现代操作系统中,阻塞和非阻塞之间的区别通常并不重要,但过去是如此。)这样,如果您的系统改进了其RNG(通过操作系统升级或硬件访问高级熵源),
    crypto/rand
    的所有用户都可以免费获取它。我投票关闭这个问题,因为它涉及密码分析,而不是编程。尽管您的项目涉及代码,但您似乎并没有停留在编程步骤上,而是停留在熵的统计评估上。您可以尝试加密堆栈交换或交叉验证(统计堆栈交换)。一定要阅读他们的“如何提问”帮助页面,不要只是将这个问题复制粘贴到一个新网站上。我投票关闭这个问题,因为它涉及密码分析,而不是编程。尽管您的项目涉及代码,但您似乎并没有停留在编程步骤上,而是停留在熵的统计评估上。你可以试试