我有由AWS生成的ECC_SECG_P256K1公钥PEM文件。
我想通过Go将pem公钥转换成ethereum地址。
我怎么才能拿到呢?
样本Pem数据
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjgRz1kswP5KV4diFvYGegDVjeTIABq0a
82r4T41Wz94LDApF9OGyZsUSoQ59gaEVQark4mEQGQqV9HHQzlPavQ==
-----END PUBLIC KEY-----我试过这个代码。(x,y返回0)
var pemData = []byte(`MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjgRz1kswP5KV4diFvYGegDVjeTIABq0a82r4T41Wz94LDApF9OGyZsUSoQ59gaEVQark4mEQGQqV9HHQzlPavQ==`)
x,y := elliptic.UnmarshalCompressed(elliptic.P256(),pemData)
pubkey := elliptic.Marshal(secp256k1.S256(), x, y)发布于 2022-12-27 11:20:44
如果这个键是由默认库支持的一些曲线生成的,您可以直接使用ParsePKIXPublicKey来解析它。但是,默认库不支持Secp256k1曲线。因此,我的解决方案是从lib复制代码,然后手动获取x和y,然后使用获取地址,并检查曲线上是否有点。
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)
}产出:
x and y : 8e0473d64b303f9295e1d885bd819e80356379320006ad1af36af84f8d56cfde 0b0c0a45f4e1b266c512a10e7d81a11541aae4e26110190a95f471d0ce53dabd
Is the point on curve ? true
address: 0x7D6bbc553e34C171Ab13fd0251bd496dCC069a1dhttps://ethereum.stackexchange.com/questions/140350
复制相似问题