Heim  >  Artikel  >  Backend-Entwicklung  >  Golang extrahiert den privaten ECDH-Schlüssel

Golang extrahiert den privaten ECDH-Schlüssel

WBOY
WBOYnach vorne
2024-02-12 21:40:10689Durchsuche

Golang 提取 ECDH 私钥

php-Editor Apple bietet Ihnen eine einfache Anleitung zum Extrahieren privater ECDH-Schlüssel in Golang. ECDH ist ein asymmetrischer Verschlüsselungsalgorithmus, der zum Aufbau eines sicheren Schlüsselaustauschs zwischen zwei kommunizierenden Parteien verwendet wird. In Golang ist das Extrahieren des privaten ECDH-Schlüssels einer der wichtigen Schritte, um eine sichere Kommunikation zu erreichen. In diesem Artikel werden die detaillierten Schritte und Vorsichtsmaßnahmen für die Verwendung der Golang-Programmiersprache zum Extrahieren des privaten ECDH-Schlüssels vorgestellt und Ihnen dabei geholfen, diese Schlüsselkompetenz schnell zu erlernen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel hilfreiche Anleitungen und praktischen Beispielcode. Lass uns anfangen!

Frageninhalt

Ich weiß, dass der private ECDH-Schlüssel eine Obermenge des öffentlichen Schlüssels ist. Die Aufgabe besteht darin, den privaten Schlüssel ecdh zu extrahieren.

Die Methode zum Generieren von PublicKey ist wie folgt:

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
}

Lösung

Ich gehe davon aus, dass Sie pem 格式提取 ecdh 私钥,就像使用公钥一样。从公钥中提取私钥是不可能的(计算上不可行)。我已经为您实现了 UnmarshalECDSAPublicKey 函数(最好重命名为 MarshalECDHPrivateKey)

verwenden möchten
// 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
}

Wie andere bereits gesagt haben, wird MarshalECDHPublicKey 函数的评论中指出的那样,您不需要使用 base64.StdEncoding.EncodeToString(ecdhSKPEMBlock) 再次编码,因为 pem.EncodeToMemory das Gleiche bewirken, man wandelt es einfach in einen String um.

Das obige ist der detaillierte Inhalt vonGolang extrahiert den privaten ECDH-Schlüssel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen