我在GO中使用ecdsa.GenerateKey
方法生成私钥/公钥对.我想将私钥存储在用户计算机上的一个文件中,并在程序启动时加载它.存在编组公钥的方法elliptic.Marshal
,但没有用于私钥的方法elliptic.Marshal
.我应该简单地滚动我自己的密钥,或者有推荐的存储私钥的方法吗?
我在GO中使用ecdsa.GenerateKey
方法生成私钥/公钥对.我想将私钥存储在用户计算机上的一个文件中,并在程序启动时加载它.存在编组公钥的方法elliptic.Marshal
,但没有用于私钥的方法elliptic.Marshal
.我应该简单地滚动我自己的密钥,或者有推荐的存储私钥的方法吗?
下面是一个代码示例,它演示了围棋中键的编码和解码.了解您需要连接几个步骤会有所帮助.加密算法是第一步,在本例中是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.")
}
}