Rumah >pembangunan bahagian belakang >Golang >Cara Menjana Kunci RSA dalam Go: Setara dengan `genrsa` OpenSSL?

Cara Menjana Kunci RSA dalam Go: Setara dengan `genrsa` OpenSSL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-07 17:43:12203semak imbas

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

Menjana Kunci RSA dalam Go: Kesetaraan dengan Utiliti genrsa OpenSSL

Masalah:

Mencipta pasangan kunci RSA dan mengekstrak awam kunci boleh menjadi tugas biasa dalam kriptografi. Utiliti genrsa OpenSSL menyediakan cara yang mudah untuk mencapai ini. Walau bagaimanapun, bagaimanakah kita boleh mencapai kefungsian yang sama menggunakan Go?

Penyelesaian:

Untuk menjana dan mengekstrak komponen utama RSA dalam Go, anda boleh mengikuti langkah berikut:

1. Hasilkan Pasangan Kunci RSA

rsa.GenerateKey boleh digunakan untuk mencipta pasangan kunci RSA. Fungsi ini mengambil sumber *rand.Rand sebagai input.

2. Ekstrak Kunci Awam

Untuk mendapatkan komponen awam daripada kunci persendirian, gunakan rsa.PrivateKey.Public. Ia akan mengembalikan antara muka rsa.PublicKey.

3. Tukar kepada Format PEM PKCS#1

Kedua-dua kunci peribadi dan awam mesti ditukar kepada borang PKCS#1 ASN.1 DER. Gunakan x509.MarshalPKCS1PrivateKey dan x509.MarshalPKCS1PublicKey untuk tujuan ini.

4. Pengekodan ke Blok PEM

Pengekodan PEM digunakan untuk membalut kunci yang ditukar dalam blok PEM yang boleh dikenali. pem.EncodeToMemory boleh mencapai ini.

5. Tulis Output pada Fail

Langkah terakhir melibatkan menulis kunci peribadi dan awam untuk memisahkan fail.

Contoh:

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

Contoh ini akan menghasilkan dua fail: key.rsa (kunci peribadi) dan key.rsa.pub (kunci awam).

Atas ialah kandungan terperinci Cara Menjana Kunci RSA dalam Go: Setara dengan `genrsa` OpenSSL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn