How to store ECDSA private key in Go

前端 未结 3 1041
鱼传尺愫
鱼传尺愫 2021-02-01 06:23

I am using the ecdsa.GenerateKey method to generate a private/public key pair in Go. I would like to store the private key in a file on the users computer, and load

3条回答
  •  情深已故
    2021-02-01 06:45

    Here is a code sample that demonstrates encoding and decoding of keys in Go. It helps to know that you need to connect couple of steps. Crypto algorithm is the fist step, in this case ECDSA key. Then you need standard encoding, x509 is most commontly used standard. Finally you need a file format, PEM is again commonly used one. This is currently most commonly used combination, but feel free to substitute any other algoriths or encoding.

    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.")
        }
    }
    

提交回复
热议问题