如何在Go中存储ECDSA私钥

我正在使用该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.")

}

}

以上是 如何在Go中存储ECDSA私钥 的全部内容, 来源链接: utcz.com/qa/417620.html

回到顶部