Golang extracts ECDH private key

WBOY
Release: 2024-02-12 21:40:10
forward
638 people have browsed it

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
}
Copy after login

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
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!