Heim >Backend-Entwicklung >Golang >So generieren Sie RSA-Schlüssel in Go: Äquivalent zu „genrsa' von OpenSSL?

So generieren Sie RSA-Schlüssel in Go: Äquivalent zu „genrsa' von OpenSSL?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-07 17:43:12203Durchsuche

How to Generate RSA Keys in Go: Equivalently to OpenSSL's `genrsa`?

Generieren von RSA-Schlüsseln in Go: Äquivalent zum genrsa-Dienstprogramm von OpenSSL

Problem:

Erstellen von RSA-Schlüsselpaaren und Extrahieren von öffentlichen Schlüssel können eine häufige Aufgabe in der Kryptographie sein. Das genrsa-Dienstprogramm von OpenSSL bietet eine praktische Möglichkeit, dies zu erreichen. Wie können wir jedoch mit Go die gleiche Funktionalität erreichen?

Lösung:

Um RSA-Schlüsselkomponenten in Go zu generieren und zu extrahieren, können Sie die folgenden Schritte ausführen:

1. Generieren Sie ein RSA-Schlüsselpaar

rsa.GenerateKey kann zum Erstellen eines RSA-Schlüsselpaars verwendet werden. Diese Funktion verwendet eine *rand.Rand-Quelle als Eingabe.

2. Extrahieren Sie den öffentlichen Schlüssel

Um die öffentliche Komponente aus dem privaten Schlüssel zu erhalten, verwenden Sie rsa.PrivateKey.Public. Es wird eine rsa.PublicKey-Schnittstelle zurückgegeben.

3. Konvertieren in das PKCS#1-PEM-Format

Sowohl private als auch öffentliche Schlüssel müssen in das PKCS#1-ASN.1-DER-Format konvertiert werden. Verwenden Sie zu diesem Zweck x509.MarshalPKCS1PrivateKey und x509.MarshalPKCS1PublicKey.

4. In PEM-Blöcke kodieren

PEM-Kodierung wird verwendet, um die konvertierten Schlüssel in erkennbare PEM-Blöcke zu verpacken. pem.EncodeToMemory kann dies erreichen.

5. Ausgabe in Dateien schreiben

Der letzte Schritt besteht darin, die privaten und öffentlichen Schlüssel in separate Dateien zu schreiben.

Beispiel:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "io/ioutil"
)

func main() {
    filename := "key"
    bitSize := 4096

    // Generate RSA key pair.
    key, err := rsa.GenerateKey(rand.Reader, bitSize)
    if err != nil {
        panic(err)
    }

    // Extract public component.
    pub := key.Public()

    // Encode private key to PKCS#1 PEM.
    keyPEM := pem.EncodeToMemory(
        &pem.Block{
            Type:  "RSA PRIVATE KEY",
            Bytes: x509.MarshalPKCS1PrivateKey(key),
        },
    )

    // Encode public key to PKCS#1 PEM.
    pubPEM := pem.EncodeToMemory(
        &pem.Block{
            Type:  "RSA PUBLIC KEY",
            Bytes: x509.MarshalPKCS1PublicKey(pub.(*rsa.PublicKey)),
        },
    )

    // Write private key to file.
    if err := ioutil.WriteFile(filename+".rsa", keyPEM, 0700); err != nil {
        panic(err)
    }

    // Write public key to file.
    if err := ioutil.WriteFile(filename+".rsa.pub", pubPEM, 0755); err != nil {
        panic(err)
    }
}

In diesem Beispiel werden zwei Dateien generiert: key.rsa (privater Schlüssel) und key.rsa.pub (öffentlicher Schlüssel).

Das obige ist der detaillierte Inhalt vonSo generieren Sie RSA-Schlüssel in Go: Äquivalent zu „genrsa' von OpenSSL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn