【问题标题】:Get public key from private ED25519 Go从私有 ED25519 Go 获取公钥
【发布时间】:2020-05-13 15:25:42
【问题描述】:

我正在尝试使用带有 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")
}

这不是错误,但生成的公钥字节总是空的,我在创建私钥结构时是否做错了什么?

【问题讨论】:

    标签: go cryptography ed25519


    【解决方案1】:

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

    ... 与 RFC 8032 的表述不同,这个包的私钥 表示包括一个公钥后缀以进行多重签名 使用相同密钥的操作更高效。这个包是指 RFC 8032 私钥作为“种子”。

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

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

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

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

    // 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

    【讨论】:

    • 在我的测试中,这似乎将一个不同的公钥带回了与私钥关联的公钥。如果我做 publicKey := make([]byte, ed25519.PublicKeySize) copy(publicKey, pk) 我的测试通过了我的私钥,这是不正确的吗?
    • 出了点问题。在 go 包中,ed25519.PrivateKey 的前 32 个字节是私钥(由 RFC 8032 定义),后 32 个字节是公钥(同样,由 RFC 定义)。
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 2021-05-08
    • 2012-01-16
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多