【问题标题】:Get ethereum address from secpk256 public key not generated using geth crypto package从未使用 geth 加密包生成的 secpk256 公钥获取以太坊地址
【发布时间】:2018-10-24 05:04:00
【问题描述】:

我有一个使用 secpk256 曲线生成的公钥,我正在尝试确定该公钥的以太坊地址。基本上我以简单字符串的形式获取密钥,然后尝试使用 geths 加密函数来获取此公钥的公共地址。

这是一个十六进制编码的公钥字符串示例: 02ccb8bc17397c55242a27d1681bf48b5b40a734205760882cd83f92aca4f1cf45 这是我的代码示例:

package main

import (
    "github.com/ethereum/go-ethereum/crypto"
)


publickey := "02ccb8bc17397c55242a27d1681bf48b5b40a734205760882cd83f92aca4f1cf45"
ecdsaPub, err := crypto.UnmarshalPubkey(publickey)
if err != nil {
    return "", err
}
ethAddress := crypto.PubkeyToAddress(*ecdsaPub).String()

【问题讨论】:

    标签: cryptography public-key ecdsa geth


    【解决方案1】:

    你应该DecompressPubkey

    package main
    
    import (
        "crypto/elliptic"
        "encoding/hex"
        "fmt"
        "github.com/ethereum/go-ethereum/crypto"
        "github.com/ethereum/go-ethereum/crypto/secp256k1"
    )
    
    
    func main() {
    
        pubBytes, err := hex.DecodeString("03bbba49a934014049d99a7f5c809fd0da59b1cb47dcbd0b3fe097adc5eaa5ec42")
        if err != nil {
            fmt.Println(err, "--1")
        }
        if pubkey1, err := crypto.DecompressPubkey(pubBytes); err != nil {
            fmt.Println(err)
            return
        } else {
            pubkey := elliptic.Marshal(secp256k1.S256(), pubkey1.X, pubkey1.Y)
            fmt.Println(hex.EncodeToString(pubkey))
            //output :04bbba49a934014049d99a7f5c809fd0da59b1cb47dcbd0b3fe097adc5eaa5ec424b3e22bae2d8f20d4bf8c0c85ec1efbce4b91196962199cd743dd6f72433559f
        }
    
    }
    

    【讨论】:

    • hmmm 是的,看起来这个公钥被压缩了。我想我必须手动解压缩它? @faker
    • 就像这样pubBytes,err :=hex.DecodeString("03bbba49a934014049d99a7f5c809fd0da59b1cb47dcbd0b3fe097adc5eaa5ec42") if err != nil{ fmt.Println(err,"--1") } if pubkey1,err :=crypto.DecompressPubkey(pubBytes);err !=nil{ fmt.Println(err) return }else { pubkey := elliptic.Marshal(secp256k1.S256(), pubkey1.X, pubkey1.Y) fmt.Println(hex.EncodeToString(pubkey)) }
    • 你应该检查 go-ethereum/crypto 中的示例,例如这个文件
    • 您的评论似乎就是答案,而答案似乎只是生成密钥对/公钥。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多