为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_笑_17 2022-10-04 17:04:22
我有一个 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...输出?
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

我们需要做的第一件事是使用标准库中的编码/asn1 包。你只需要给出正确的结构来解码。从您的链接中,我们可以看到我们有一个包含另一个带有2和一个.在前进中,这将是:SEQUENCESEQUENCEOBJECTIDENTIFIERBITSTRING


type 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

再一次,您可能不需要编码为字符串。


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号