【发布时间】: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") 将您的字节切片解码到其中。