Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何封送ECC公钥或私钥_Json_Go_Cryptography - Fatal编程技术网

Json 如何封送ECC公钥或私钥

Json 如何封送ECC公钥或私钥,json,go,cryptography,Json,Go,Cryptography,您好,我正在尝试解组包含ECC公钥的对象 但我去乌玛沙林错误说,不能解除对象的正确。 我想做以下几件事: 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"

您好,我正在尝试解组包含ECC公钥的对象 但我去乌玛沙林错误说,不能解除对象的正确。 我想做以下几件事:

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)
}
t从(err2)返回的错误为:

panic:json:无法将对象解组到Go-struct字段PublicKey.Curve类型的椭圆曲线中


在eliptoc或509x函数中都无法将曲线值设置为空,因此我最终找到了答案,如果有人需要,我会发布它。 我们所需要的只是创建另一个结构,让它命名为“retrieve”,并声明它将从解组器读取的值。 现在,ECC公钥包含3个值“curve”,并将其附加为
json:“curve”
,“Y”ans将其附加为
json:“Y”
,我们将对“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
}
我们将把封送的公钥传递给unmarshalcpublickey(),它将返回正确的unmarshaled obj

因此,最直接的用途是:

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公用密码。

听起来您有一些代码遇到了问题。请编辑您的问题,以包含准确的错误消息,以及产生错误的代码-如果可能的话,作为一个.done,谢谢。最好尝试对公钥值进行二进制编码和解码。有存储EC公钥的标准,如果您以这种方式存储它们,任何运行时都应该能够读回它们(如果您指定了它们的编码方式)。如果需要,您始终可以序列化或封送/解封送生成的字节数组。不幸的是,我对这两个运行时不太熟悉。