Golang Nacl Secretbox中的Bip32密钥加密

时间:2018-07-11 07:23:22

标签: go

我创建了Assymetric结构,该结构生成了BIP39和BIP32主公钥和私钥。现在,我想根据使用情况使用这些密钥及其派生的子代来加密文件或字符串。如果我错了,请纠正我-助记符BIP32生成的键是椭圆曲线键(secp256k1)。我正在尝试使用NACL Go实现来使用这些密钥加密文本,但是它仅接受32字节的密钥,但从助记符生成的密钥为256字节。请帮忙。 bip32实现可在此处https://github.com/tyler-smith/go-bip32/blob/master/bip32.go#L59中找到 完成实施后,我发现生成的密钥是Key和chaincode的组合,key.Key是一个32字节的密钥,必须用于加密。只是想检查这是否是正确的方法并确保安全。

package encryption


import (
   "github.com/tyler-smith/go-bip39"
   "github.com/tyler-smith/go-bip32"
   "crypto/ecdsa"
   "crypto/elliptic"
   "golang.org/x/crypto/nacl/secretbox"
   "crypto/rand"
   "encoding/hex"
   "io"
   "log"
 )


type Encryption interface {
     GenerateMnemonic() ( *bip32.Key, *bip32.Key)
}

type Assymetric struct{
   RootPrivateKey *bip32.Key
   RootPublicKeyKey *bip32.Key
   RootMnemonic string
   RootPassphrase string
}

func (c *Assymetric) GenerateMnemonic() (*bip32.Key, *bip32.Key){

  entropy, _ := bip39.NewEntropy(256)
  mnemonic, _ := bip39.NewMnemonic(entropy)

  seed := bip39.NewSeed(mnemonic, c.RootPassphrase)

  rootPrivateKey, _ := bip32.NewMasterKey(seed)
  rootPublicKey := rootPrivateKey.PublicKey()

  // Display mnemonic and keys
  //c.RootMnemonic = mnemonic
  c.RootPrivateKey = rootPrivateKey
  c.RootPublicKeyKey = rootPublicKey


  key, _ := rootPrivateKey.NewChildKey(0)
  log.Printf("Private key 0 is %s", key)
  log.Printf("Public key 0 is %s", key.PublicKey())


    // You must use a different nonce for each message you encrypt with the
    // same key. Since the nonce here is 192 bits long, a random value
    // provides a sufficiently small probability of repeats.

  log.Printf("This is the secret key %s", secretKey)

  var nonce [24]byte
    if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil {
        panic(err)
    }

  log.Printf("This is the nonce %s", nonce)

   var a [32]byte
  copy(a[:], key.Key)

  log.Printf("\nlen=%d cap=%d %v\n", len(a), cap(a), a)


  encrypted := secretbox.Seal(nonce[:], []byte("hello world"), &nonce, &a)

  log.Println(encrypted)
  return rootPrivateKey, rootPublicKey

0 个答案:

没有答案