【问题标题】:How to decode hex to ASN.1 in golang如何在golang中将十六进制解码为ASN.1
【发布时间】:2021-11-20 23:56:41
【问题描述】:

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

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

它输出: 0x049bb8e80670371f45508b5f8f59946a7c4dea4b3a23a036cf24c1f40993f4a1daad1716de8bd664ecb4596648d722a4685293de208c1d2da9361b9cba74c3d1ec

然后我可以把它和hex.DecodeString(str) 输入到addrPubKey, err := btcutil.NewAddressPubKey(bs, &chaincfg.TestNet3Params) 中。

如何在 golang 中对此进行解码以获得 0x049... 输出?

谢谢

【问题讨论】:

  • 看看 json 解码在 Go 中是如何工作的(周围有很多例子)。 ASN1 解码的工作原理相同:您创建一个结构来表示目标数据结构,然后使用 asn1.Unmarshal 函数 (import "encoding/asn1") 将您的字节切片解码到其中。

标签: go bitcoin


【解决方案1】:

首先我们需要使用标准库中的encoding/asn1 package。 您只需要提供正确的结构即可解码。从您的链接我们可以看到我们有一个SEQUENCE,其中包含另一个SEQUENCE,其中有两个OBJECTIDENTIFIER 和一个BITSTRING。这将是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2020-06-15
    • 2015-02-14
    • 2013-09-25
    • 2019-07-15
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多