如何将ECDSA私钥存储在Go中



我正在使用ecdsa.GenerateKey方法在GO中生成私有/公钥对。我想将私钥存储在用户计算机上的文件中,并在程序启动时加载它。有一种方法elliptic.Marshal可以填充公钥,但没有私钥的方法。我应该简单地滚动自己,还是建议存储私钥的推荐方法?

这是一个代码示例,它演示了GO中密钥的编码和解码。它有助于知道您需要连接几个步骤。加密算法是拳头步骤,在这种情况下为ECDSA密钥。然后,您需要标准编码,X509是最使用的标准。最后,您需要一个文件格式,PEM再次使用。目前,这是最常用的组合,但可以随意替代任何其他算法或编码。

func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) {
    x509Encoded, _ := x509.MarshalECPrivateKey(privateKey)
    pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded})
    x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey)
    pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: x509EncodedPub})
    return string(pemEncoded), string(pemEncodedPub)
}
func decode(pemEncoded string, pemEncodedPub string) (*ecdsa.PrivateKey, *ecdsa.PublicKey) {
    block, _ := pem.Decode([]byte(pemEncoded))
    x509Encoded := block.Bytes
    privateKey, _ := x509.ParseECPrivateKey(x509Encoded)
    blockPub, _ := pem.Decode([]byte(pemEncodedPub))
    x509EncodedPub := blockPub.Bytes
    genericPublicKey, _ := x509.ParsePKIXPublicKey(x509EncodedPub)
    publicKey := genericPublicKey.(*ecdsa.PublicKey)
    return privateKey, publicKey
}
func test() {
    privateKey, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
    publicKey := &privateKey.PublicKey
    encPriv, encPub := encode(privateKey, publicKey)
    fmt.Println(encPriv)
    fmt.Println(encPub)
    priv2, pub2 := decode(encPriv, encPub)
    if !reflect.DeepEqual(privateKey, priv2) {
        fmt.Println("Private keys do not match.")
    }
    if !reflect.DeepEqual(publicKey, pub2) {
        fmt.Println("Public keys do not match.")
    }
}

我相信这些密钥的标准格式是使用x.509 asn.1 der表示。请参阅http://golang.org/pkg/crypto/x509/#marshalecprivatekey和http://golang.org/pkg/pkg/crypto/x509/#parseecprivatekey.

我改编了一种非常快速而肮脏的方法,正如15年末Geth团队之一在我的图书馆https://github.com/daveappleton/ether_go <<

这是一个更简单的解决方案(但将钥匙固定在视线中)

最新更新