如何检查随机性?
How to check randomness?
我正在使用 BIP39 规范生成 12 个单词的助记符,稍后将用于生成主 Public/Private 及其 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 个单词的助记符(这意味着熵函数实现不正确并且容易受到攻击)?
My question is, When people say that the keys not generated properly
from random functions are susceptible to break, what they actually
mean?
密码学中的不良随机性有两种攻击方式:
通过详尽搜索用于生成比特流的种子。一个突出的例子是Debian OpenSSH vulnerability。
通过攻击并非为满足密码要求而设计的随机数生成器的可预测性。在统计随机数生成器中,主要要求是数据看起来是随机的。在密码随机数生成器中,我们需要更多:给定比特流,一个非常聪明的知道算法的人无法弄清楚随机数生成器的未来或先前比特是什么。例如,Mersenne Twister虽然内部状态很大,但不符合密码学要求。
你关于测量熵的问题是错误的问题。测量熵将其视为统计随机数生成器,而不是加密随机数生成器。你说:
GenerateRandomString and GenerateRandomSalt just generates random string and bytes based on crypto/rand packages.
这就是您需要了解的全部内容 -- 您无需担心其他任何事情。如上所述,再多的测量熵也无法告诉您您的密钥是安全的。相反,您需要成为密码学专家才能分析此类算法。对于随机性的消费者,您所能做的(除了使用 /dev/urandom 等其他来源)就是相信它经过精心设计并由密码专家分析。
我正在使用 BIP39 规范生成 12 个单词的助记符,稍后将用于生成主 Public/Private 及其 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 个单词的助记符(这意味着熵函数实现不正确并且容易受到攻击)?
My question is, When people say that the keys not generated properly from random functions are susceptible to break, what they actually mean?
密码学中的不良随机性有两种攻击方式:
通过详尽搜索用于生成比特流的种子。一个突出的例子是Debian OpenSSH vulnerability。
通过攻击并非为满足密码要求而设计的随机数生成器的可预测性。在统计随机数生成器中,主要要求是数据看起来是随机的。在密码随机数生成器中,我们需要更多:给定比特流,一个非常聪明的知道算法的人无法弄清楚随机数生成器的未来或先前比特是什么。例如,Mersenne Twister虽然内部状态很大,但不符合密码学要求。
你关于测量熵的问题是错误的问题。测量熵将其视为统计随机数生成器,而不是加密随机数生成器。你说:
GenerateRandomString and GenerateRandomSalt just generates random string and bytes based on crypto/rand packages.
这就是您需要了解的全部内容 -- 您无需担心其他任何事情。如上所述,再多的测量熵也无法告诉您您的密钥是安全的。相反,您需要成为密码学专家才能分析此类算法。对于随机性的消费者,您所能做的(除了使用 /dev/urandom 等其他来源)就是相信它经过精心设计并由密码专家分析。