How to store ECDSA private key in Go

前端 未结 3 989
鱼传尺愫
鱼传尺愫 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:37

    I adapted a really quick and dirty way to do it, as suggested by one of the geth team in late '15 in my library https://github.com/DaveAppleton/ether_go

    it is a far simpler solution (but puts keys in plain sight)

    0 讨论(0)
  • 2021-02-01 06:38

    I believe the standard format for those keys is to use the X.509 ASN.1 DER representation. See http://golang.org/pkg/crypto/x509/#MarshalECPrivateKey and http://golang.org/pkg/crypto/x509/#ParseECPrivateKey.

    0 讨论(0)
  • 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.")
        }
    }
    
    0 讨论(0)
提交回复
热议问题