如何检查随机性?

时间:2018-09-08 19:14:29

标签: 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
     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个单词的助记符(这意味着熵函数实现不正确并且容易受到攻击)?

1 个答案:

答案 0 :(得分:4)

  

我的问题是,当人们说密钥生成不正确时   随机函数很容易被破坏,它们实际上是什么   是什么意思?

坏随机性有两种攻击方式:

  1. 通过穷举搜索用于生成位流的种子。一个突出的例子是Debian OpenSSH vulnerability

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

您关于测量熵的问题是错误的问题。测量熵就像对待统计随机数生成器一样,而不是像密码随机数生成器那样对待它。你说:

  

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

这就是您需要知道的全部-您无需担心其他任何事情。如上所述,没有任何量度的熵可以告诉您密钥是安全的。相反,您需要成为密码专家才能分析此类算法。对于随机性的使用者,您所能做的(不使用其他来源,例如/ dev / urandom)是可以信任的,它已经被精心设计并由密码专家进行了分析。