3

我正在尝试使用带有 Go 的 ED25519 从私钥中提取公钥。

我将我的私钥字节值传递给我的方法,从中创建一个新的 ed25519 私钥结构,然后使用该.Public()方法检索公钥。

pk := ed25519.PrivateKey(privateKey).Public()
cpk, ok := pk.(ed25519.PublicKey)
if !ok {
    return nil, errors.New("problem casting public key to ed25519 public key")
}

它没有出错,但生成的公钥字节总是空的,在创建私钥结构时我做错了什么吗?

4

1 回答 1

2

ed25519包在概述有这个重要的注释:

... 与 RFC 8032 的表述不同,这个包的私钥表示包括一个公钥后缀,以使使用相同密钥的多个签名操作更有效。此包将 RFC 8032 私钥称为“种子”。

这意味着它使用以下等价和术语:

  • RFC 8032 私钥:32 字节,在此包中称为“种子”
  • RFC 8032 私钥和公钥串联:64 字节,在此包中称为“私钥”

如果您已经有一个由 RFC 8032 组成的 64 字节切片<private key><public key>,则可以使用问题中的代码。

如果您只有一个由 RFC 8032 组成的 32 字节切片<private key>,则需要按如下方式计算公钥:

// Compute the full 64 byte <private key><public key> from the private key
priv := ed25519.NewKeyFromSeed(32bytePrivateKey)

// Print out the public key (the last 32 bytes)
fmt.Println(priv.Public())

请注意ed25519.PrivateKeyed25519.PublicKey都是type []byte

于 2020-05-13T15:43:52.043 回答