Home  >  Article  >  Backend Development  >  Golang extracts ECDH private key

Golang extracts ECDH private key

WBOY
WBOYforward
2024-02-12 21:40:10635browse

Golang 提取 ECDH 私钥

php editor Apple brings you a concise guide to extracting ECDH private keys in Golang. ECDH is an asymmetric encryption algorithm used to establish a secure key exchange between two communicating parties. In Golang, extracting the ECDH private key is one of the important steps to achieve secure communication. This article will introduce the detailed steps and precautions on how to use the Golang programming language to extract the ECDH private key, helping you quickly master this key skill. Whether you are a beginner or an experienced developer, this article will provide you with helpful guidance and practical example code. Let’s get started!

Question content

I know that the ECDH private key is a superset of the public key. The task is to extract the private key ecdh.

The method to generate PublicKey is as follows:

import (
        "crypto/ecdh"
        "crypto/rand"
        "crypto/ecdsa"
        "crypto/x509"
        "encoding/base64"
        "encoding/pem"
        "fmt"
)


func main() {

        alicePrivateKey, err := ecdh.P256().GenerateKey(rand.Reader)
        alicePublicKey, err := MarshalECDHPublicKey(alicePrivateKey.PublicKey())  
        if err != nil {
                fmt.Errorf("failed to marshal public key into PKIX format")
        }

        fmt.Printf("alicePubK => %s\n", alicePublicKey)

    clientECDSAPubKey, err := UnmarshalECDSAPublicKey(alicePublicKey)
    if err != nil {
       panic(err)
    }
    println(clientECDSAPubKey)
    println("no error")

}  

func MarshalECDHPublicKey(pk *ecdh.PublicKey) (string, error) {
        ecdhSKBytes, err := x509.MarshalPKIXPublicKey(pk)
        if err != nil {
                return "", fmt.Errorf("failed to marshal public key into PKIX format")
        }
        ecdhSKPEMBlock := pem.EncodeToMemory(
                &pem.Block{
                        Type:  "PUBLIC KEY",
                        Bytes: ecdhSKBytes,
                },
        )

        return base64.StdEncoding.EncodeToString(ecdhSKPEMBlock), nil
}

Workaround

I assume you want to extract the ecdh private key in pem format, just like you would with the public key. It is impossible (computationally infeasible) to extract the private key from the public key. I've implemented the UnmarshalECDSAPublicKey function for you (preferably renamed to MarshalECDHPrivateKey)

// MarshalPKCS8PrivateKey converts a private key to PKCS #8, ASN.1 DER form.
//
// The following key types are currently supported: *rsa.PrivateKey,
// *ecdsa.PrivateKey, ed25519.PrivateKey (not a pointer), and *ecdh.PrivateKey.
// Unsupported key types result in an error.
//
// This kind of key is commonly encoded in PEM blocks of type "PRIVATE KEY".
func UnmarshalECDSAPublicKey(alicePrivateKey *ecdh.PrivateKey) (string, error) {
    ecdhSKBytes, err := x509.MarshalPKCS8PrivateKey(alicePrivateKey)
    if err != nil {
        return "", fmt.Errorf("failed to marshal private key into PKIX format")
    }

    ecdhSKPEMBlock := pem.EncodeToMemory(
        &pem.Block{
            Type:  "PRIVATE KEY",
            Bytes: ecdhSKBytes,
        },
    )
    return string(ecdhSKPEMBlock), nil
}

As others have pointed out in comments about the MarshalECDHPublicKey function, you don't need to use base64.StdEncoding.EncodeToString(ecdhSKPEMBlock) to encode again, because pem. EncodeToMemory will do the same thing, you just convert it to a string.

The above is the detailed content of Golang extracts ECDH private key. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete