如何在戈朗中将十六进制解码为 ASN.1

我有一个 ECDSA 公钥,该公钥是从 ASN.1 DER 格式的 HSM 返回给我的。我需要创建一个比特币兼容的密钥33字节。当我打印出键时,我得到以下输出:hex.EncodeToString(pubkey)3056301006072a8648ce3d020106052b8104000a034200049bb8e80670371f45508b5f8f59946a7c4dea4b3a23a036cf24c1f40993f4a1daad1716de8bd664ecb4596648d722a4685293de208c1d2da9361b9cba74c3d1ec

我在这里使用在线解码器:https://holtstrom.com/michael/tools/asn1decoder.php

它输出:0x049bb8e80670371f45508b5f8f59946a7c4dea4b3a23a036cf24c1f40993f4a1daad1716de8bd664ecb4596648d722a4685293de208c1d2da9361b9cba74c3d1ec

然后,我可以采用它,这给了我必要的格式来将其输入到.hex.DecodeString(str)addrPubKey, err := btcutil.NewAddressPubKey(bs, &chaincfg.TestNet3Params)

我如何在高朗中解码它以获得0x049...输出?


qq_笑_17
浏览 192回答 1
1回答

萧十郎

我们需要做的第一件事是使用标准库中的编码/asn1 包。你只需要给出正确的结构来解码。从您的链接中,我们可以看到我们有一个包含另一个带有2和一个.在前进中,这将是:SEQUENCESEQUENCEOBJECTIDENTIFIERBITSTRINGtype Ids struct {    OBi1 asn1.ObjectIdentifier    OBi2 asn1.ObjectIdentifier}type PubKey struct {    Id Ids    Bs asn1.BitString}现在我们只需要将数据变成这个结构:UnMarshall    str := `3056301006072a8648ce3d020106052b8104000a034200049bb8e80670371f45508b5f8f59946a7c4dea4b3a23a036cf24c1f40993f4a1daad1716de8bd664ecb4596648d722a4685293de208c1d2da9361b9cba74c3d1ec`    bstring, err := hex.DecodeString(str)    if (err != nil) {        panic(err)    }    var decode PubKey    _, err = asn1.Unmarshal(bstring, &decode)    if (err != nil) {        panic(err)    }    fmt.Println(hex.EncodeToString(decode.Bs.Bytes))请注意,您不必将字符串编码为十六进制并再次编码,因为Unmarshall接受字节数组这将打印预期的结果:049bb8e80670371f45508b5f8f59946a7c4dea4b3a23a036cf24c1f40993f4a1daad1716de8bd664ecb4596648d722a4685293de208c1d2da9361b9cba74c3d1ec再一次,您可能不需要编码为字符串。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go