簡體   English   中英

如何編組 ECC 公鑰或私鑰

[英]How to marshal an ECC public or private key

您好,我正在嘗試解組包含 ECC 公鑰的 object,但我 go 編組錯誤說無法正確解組 object。 我正在嘗試執行以下操作:

var privateKey *ecdsa.PrivateKey
var publicKey ecdsa.PublicKey
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    log.Fatalf("Failed to generate ECDSA key: %s\n", err)
}
publicKey = privateKey.PublicKey

marshalledKey, err := json.Marshal(publicKey)
if err != nil {
    panic(err)
}

var unmarshalledKey ecdsa.PublicKey
err2 := json.Unmarshal(marshalledKey, &unmarshalledKey)
if err2 != nil {
    panic(err2)
}

從(err2)返回的錯誤是:

恐慌:json:無法將 object 解組為 Go 結構字段 PublicKey.Curve 類型為 elliptic.Curve

並且在 eliptoc 或 509x function 中沒有辦法到 umashal 並且曲線值總是 null

我終於找到了答案,我會發布它以防有人需要它。 我們所需要的只是創建另一個結構,讓我們將其命名為“retrieve”並聲明它將從 unmarshal 讀取的值。 now the ECC public key contain 3 values "curve" and will append it as json:"Curve" , "Y" ans will append it as json:"Y" and we will do the same for "X"

它會像這樣工作:

type retrieve struct {
    CurveParams *elliptic.CurveParams `json:"Curve"`
    MyX         *big.Int              `json:"X"`
    MyY         *big.Int              `json:"Y"`
}

//UnmarshalECCPublicKey extract ECC public key from marshaled objects
func UnmarshalECCPublicKey(object []byte) (pub ecdsa.PublicKey) {
    var public ecdsa.PublicKey
    rt := new(retrieve)

    errmarsh := json.Unmarshal(object, &rt)
    if errmarsh != nil {
        fmt.Println("err at UnmarshalECCPublicKey()")
        panic(errmarsh)
    }

    public.Curve = rt.Key.CurveParams
    public.X = rt.Key.MyX
    public.Y = rt.Key.MyY
    mapstructure.Decode(public, &pub)

    fmt.Println("Unmarshalled ECC public key : ", pub)
    return
}

我們將經過編組的公鑰傳遞給 UnmarshalECCPublicKey(),它將返回正確的未編組 obj

所以 coorect 的使用將是:

var privateKey *ecdsa.PrivateKey
var publicKey ecdsa.PublicKey
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    log.Fatalf("Failed to generate ECDSA key: %s\n", err)
}
publicKey = privateKey.PublicKey

marshalledKey, err := json.Marshal(publicKey)
if err != nil {
    panic(err)
}

var unmarshalledKey ecdsa.PublicKey
unmarshalledKey = UnmarshalECCPublicKey(marshalledKey)

那應該這樣做,您將成功解組 ECC 公眾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM