首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go将pem公钥转换为ethereum地址

Go将pem公钥转换为ethereum地址
EN

Ethereum用户
提问于 2022-12-01 08:36:12
回答 1查看 311关注 0票数 3

我有由AWS生成的ECC_SECG_P256K1公钥PEM文件。

我想通过Go将pem公钥转换成ethereum地址。

我怎么才能拿到呢?

样本Pem数据

代码语言:javascript
复制
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjgRz1kswP5KV4diFvYGegDVjeTIABq0a
82r4T41Wz94LDApF9OGyZsUSoQ59gaEVQark4mEQGQqV9HHQzlPavQ==
-----END PUBLIC KEY-----

我试过这个代码。(x,y返回0)

代码语言:javascript
复制
var pemData = []byte(`MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjgRz1kswP5KV4diFvYGegDVjeTIABq0a82r4T41Wz94LDApF9OGyZsUSoQ59gaEVQark4mEQGQqV9HHQzlPavQ==`)
x,y := elliptic.UnmarshalCompressed(elliptic.P256(),pemData)
pubkey := elliptic.Marshal(secp256k1.S256(), x, y)
EN

回答 1

Ethereum用户

发布于 2022-12-27 11:20:44

如果这个键是由默认库支持的一些曲线生成的,您可以直接使用ParsePKIXPublicKey来解析它。但是,默认库不支持Secp256k1曲线。因此,我的解决方案是从lib复制代码,然后手动获取x和y,然后使用获取地址,并检查曲线上是否有点。

代码语言:javascript
复制
import (
    "crypto/ecdsa"
    "crypto/x509/pkix"
    "encoding/asn1"
    "encoding/hex"
    "encoding/pem"
    "fmt"
    "math/big"
    crypto "github.com/ethereum/go-ethereum/crypto"
)

type publicKeyInfo struct {
    Raw       asn1.RawContent
    Algorithm pkix.AlgorithmIdentifier
    PublicKey asn1.BitString
}
func main() {
    pemData := []byte(`-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjgRz1kswP5KV4diFvYGegDVjeTIABq0a
82r4T41Wz94LDApF9OGyZsUSoQ59gaEVQark4mEQGQqV9HHQzlPavQ==
-----END PUBLIC KEY-----`)
    // better to read directly from file:
    // pemData, err := os.ReadFile("your_pub_file.pem") // just pass the file name
    // if err != nil {
    //  fmt.Print(err)
    // }
    block, _ := pem.Decode(pemData)
    if block == nil {
        panic("failed to parse PEM block containing the public key")
    }
    var pki publicKeyInfo
    asn1.Unmarshal(block.Bytes, &pki)
    asn1Data := pki.PublicKey.RightAlign()
    _, x, y := asn1Data[0], asn1Data[1:33], asn1Data[33:]
    fmt.Println("x and y : ", hex.EncodeToString(x), hex.EncodeToString(y))
    x_big := new(big.Int)
    x_big.SetBytes(x)
    y_big := new(big.Int)
    y_big.SetBytes(y)
    pubkey := ecdsa.PublicKey{Curve: crypto.S256(), X: x_big, Y: y_big}
    address := crypto.PubkeyToAddress(pubkey)
    isOnCurve := crypto.S256().IsOnCurve(pubkey.X, pubkey.Y)
    fmt.Println("Is the point on curve ? ", isOnCurve)
    fmt.Println("address: ", address)
}

产出:

代码语言:javascript
复制
x and y :  8e0473d64b303f9295e1d885bd819e80356379320006ad1af36af84f8d56cfde 0b0c0a45f4e1b266c512a10e7d81a11541aae4e26110190a95f471d0ce53dabd
Is the point on curve ?  true
address:  0x7D6bbc553e34C171Ab13fd0251bd496dCC069a1d
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/140350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档