Maison >développement back-end >Golang >Comment générer des clés RSA dans Go : de manière équivalente au « genrsa » d'OpenSSL ?

Comment générer des clés RSA dans Go : de manière équivalente au « genrsa » d'OpenSSL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-07 17:43:12199parcourir

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

Génération de clés RSA dans Go : équivalence avec l'utilitaire genrsa d'OpenSSL

Problème :

Création de paires de clés RSA et extraction de clés publiques les clés peuvent être une tâche courante en cryptographie. L'utilitaire genrsa d'OpenSSL fournit un moyen pratique d'y parvenir. Cependant, comment pouvons-nous obtenir la même fonctionnalité en utilisant Go ?

Solution :

Pour générer et extraire les composants clés RSA dans Go, vous pouvez suivre ces étapes :

1. Générer une paire de clés RSA

rsa.GenerateKey peut être utilisé pour créer une paire de clés RSA. Cette fonction prend une source *rand.Rand en entrée.

2. Extraire la clé publique

Pour obtenir le composant public à partir de la clé privée, utilisez rsa.PrivateKey.Public. Il renverra une interface rsa.PublicKey.

3. Convertir au format PKCS#1 PEM

Les clés privées et publiques doivent être converties au format PKCS#1 ASN.1 DER. Utilisez x509.MarshalPKCS1PrivateKey et x509.MarshalPKCS1PublicKey à cet effet.

4. Encoder en blocs PEM

Le codage PEM est utilisé pour envelopper les clés converties dans des blocs PEM reconnaissables. pem.EncodeToMemory peut y parvenir.

5. Écrire la sortie dans des fichiers

La dernière étape consiste à écrire les clés privées et publiques dans des fichiers séparés.

Exemple :

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)
    }
}

Cet exemple générera deux fichiers : key.rsa (clé privée) et key.rsa.pub (clé publique).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn