Utilizzare la chiave privata RSA per generare la chiave pubblica?


394

Non capisco davvero questo:

secondo: http://www.madboa.com/geek/openssl/#key-rsa , è possibile generare una chiave pubblica da una chiave privata.

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

Il mio pensiero iniziale era che fossero generati in coppia insieme. La chiave privata RSA contiene la somma? o la chiave pubblica?


1
A tutti quelli che usano rsa e openssl e vogliono crittografare un file di grandi dimensioni come 5 Kbyte. ricorda che la chiave pubblica deve essere proporzionale o di dimensioni maggiori rispetto a ciò che desideri crittografare, altrimenti otterrai un "file troppo grande per un errore crittografato". Riassumo che generi una chiave privata piuttosto grande e seria e da ciò crei le tue chiavi private in modo da avere molti dati con cui lavorare. Ho detto a chi conosco in openssl del difetto e che avrebbero dovuto farcela da soli, altrimenti impiegherai molto tempo a capire perché si lamenta delle dimensioni.
Kent Hansen,

10
Il problema descritto da Kent Hansen è dovuto all'uso di RSA direttamente su dati in chiaro, che non dovrebbe mai essere fatto per ragioni di sicurezza. Utilizzare invece uno schema di crittografia ibrida ben analizzato come RSA-KEM ( tools.ietf.org/html/rfc5990#appendix-A ), con uno schema di crittografia simmetrica autenticato come encrypt-then-HMAC applicato ai dati.
Daira Hopwood,



@ La risposta di SteffenUllrich in questo link spiega perché: security.stackexchange.com/questions/172274/…
bearzyj

Risposte:


578
openssl genrsa -out mykey.pem 1024

produrrà effettivamente una coppia di chiavi pubblica - privata. La coppia è memorizzata nel mykey.pemfile generato .

openssl rsa -in mykey.pem -pubout > mykey.pub

estrarrà la chiave pubblica e la stamperà. Ecco un link a una pagina che lo descrive meglio.

EDIT: controlla qui la sezione degli esempi . Per generare semplicemente la parte pubblica di una chiave privata:

openssl rsa -in key.pem -pubout -out pubkey.pem

Per ottenere una chiave pubblica utilizzabile per scopi SSH, utilizzare ssh-keygen :

ssh-keygen -y -f key.pem > key.pub

50
è confuso il modo in cui tutti i tutorial in tutto il mondo affermano che utilizzando il comando openssl genrsa genererai la CHIAVE PRIVATA, perché stanno dimenticando che sta generando anche la CHIAVE PUBBLICA
Jaime Hablutzel

15
@jaime puoi davvero biasimarli? La documentazione ufficiale non dice assolutamente nulla su una chiave pubblica. "DESCRIPTION: Il comando genrsa genera una chiave privata RSA." openssl.org/docs/apps/genrsa.html
Despertar,

124
@jaime, è perché non lo fa - genrsa genera solo la chiave privata, la chiave pubblica non viene memorizzata. Tuttavia, se si dispone della chiave privata, è possibile calcolare (derivare) la chiave pubblica da essa, che è ciò che fa il secondo comando sopra. Calcola, non estrae, la chiave pubblica.
Steveayre,

13
@steveayre Avevo capito che le chiavi RSA erano semplicemente i due esponenti ( ee dnella letteratura comune). Nessuno dei due è matematicamente privato o pubblico, quelle sono etichette che sono arbitrariamente assegnate al momento della creazione. Potrebbero essere altrettanto facilmente assegnati al contrario. Generare l'uno dall'altro è un problema equivalente. Il .pemformato contiene un sacco di informazioni, inclusi entrambi gli esponenti, e quindi entrambe le chiavi, giusto?
lincia il

13
@steveayre è principalmente sbagliato. I componenti della chiave RSA pubblica (n, e) vengono generati con e sono incorporati nel file della chiave RSA privato creato con il openssl genrsacomando. Tuttavia, non viene creato un file di chiave pubblica separato nello stesso passaggio. Per estrarre la chiave pubblica dal file della chiave privata in un file di chiave pubblica separato, utilizzare il openssl rsa -in private.pem -pubout -out public.pemcomando. Quando si produce una chiave pubblica in questo modo, viene estratta dal file della chiave privata, non calcolata. Vedi la mia risposta di seguito per maggiori dettagli.
Golem,

273

Persone in cerca di chiave pubblica SSH ...

Se stai cercando di estrarre la chiave pubblica da utilizzare con OpenSSH, dovrai ottenere la chiave pubblica in modo leggermente diverso

$ ssh-keygen -y -f mykey.pem > mykey.pub

Questo formato di chiave pubblica è compatibile con OpenSSH. Aggiungi la chiave pubblica a remote:~/.ssh/authorized_keyse sarai a posto


documenti di SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y Questa opzione leggerà un file privato in formato OpenSSH e stamperà una chiave pubblica OpenSSH su stdout.


3
Funziona come un incantesimo! Genera un formato che Github prende! Github non prende il formato PEM. La precedente risposta suggerita openssl rsa -in key.pem -pubout -out pubkey.pemnon fu accettata come evidentemente l'output di quella è una chiave pubblica in formato pem. Quindi ho ricevuto questo errore: "La chiave non è valida. Deve iniziare con 'ssh-rsa' o 'ssh-dss'. Controlla che stai copiando la metà pubblica della chiave". Tuttavia ssh-keygen -y [-f input_keyfile] genera il formato corretto utilizzato da Github.
Devy,

71

Nella maggior parte dei software che generano chiavi private RSA, comprese quelle di openssl, la chiave privata è rappresentata come un oggetto RSAPrivatekey PKCS # 1 o una sua variante:

A.1.2 Sintassi della chiave privata RSA

Una chiave privata RSA deve essere rappresentata con il tipo ASN.1
RSAPrivateKey:

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

Come puoi vedere, questo formato ha una serie di campi tra cui il modulo e l'esponente pubblico e quindi è un superset rigoroso delle informazioni in una chiave pubblica RSA .


Vuoi dire che data una chiave privata, è matematicamente possibile generare la chiave pubblica? La forza di RSA non è forse il fatto che è computazionalmente impossibile generare una chiave rispetto all'altra?
Raam,

30
@Raam: No, il punto di forza di RSA è che non è possibile generare la chiave privata dal pubblico. Generare la forma pubblica il privato è banale.
Presidente James K. Polk,

@GregS, perché? Una chiave è composta da un modulo e un esponente. Se l'altro esponente potesse essere calcolato da questi due numeri, RSA si spezzerebbe facilmente. Quindi la chiave privata OpenSSL contiene più di esponente e modulo?
Calmarius,

1
@Calmarius: chi dice che una chiave è composta da un modulo ed esponente? Questa sarebbe la chiave privata minima, ma di solito la chiave privata include altri componenti come i fattori primi. Leggi la risposta per i dettagli.
Presidente James K. Polk,

1
@JamesKPolk Non è necessariamente vero. Se l'esponente pubblico è grande (ovvero ha le stesse proprietà dell'esponente privato), potrebbe essere impossibile ricostruire la chiave pubblica . La maggior parte delle librerie non lo supporterà, ma il sistema crittografico RSA non richiede certamente di ricostruire la chiave pubblica dalla chiave privata.
Maarten Bodewes,

34

La mia risposta di seguito è un po 'lunga, ma si spera che fornisca alcuni dettagli che mancano nelle risposte precedenti. Inizierò con alcune dichiarazioni correlate e alla fine risponderò alla domanda iniziale.

Per crittografare qualcosa usando l'algoritmo RSA hai bisogno di modulo e coppia di esponenti di crittografia (pubblica) (n, e). Questa è la tua chiave pubblica. Per decrittografare qualcosa usando l'algoritmo RSA sono necessarie la coppia di esponenti modulo (e privata) (n, d). Questa è la tua chiave privata.

Per crittografare qualcosa usando la chiave pubblica RSA, tratti il ​​tuo testo in chiaro come un numero e lo elevi alla potenza di e modulo:

ciphertext = ( plaintext^e ) mod n

Per decrittografare qualcosa usando la chiave privata RSA, tratti il ​​tuo testo cifrato come un numero e lo elevi alla potenza di d modulo n:

plaintext = ( ciphertext^d ) mod n

Per generare la chiave privata (d, n) usando openssl puoi usare il seguente comando:

openssl genrsa -out private.pem 1024

Per generare la chiave pubblica (e, n) dalla chiave privata usando openssl puoi usare il seguente comando:

openssl rsa -in private.pem -out public.pem -pubout

Per analizzare il contenuto della chiave RSA privata private.pem generata dal comando openssl sopra, eseguire quanto segue (output troncato alle etichette qui):

openssl rsa -in private.pem -text -noout | less

modulus         - n
privateExponent - d
publicExponent  - e
prime1          - p
prime2          - q
exponent1       - d mod (p-1)
exponent2       - d mod (q-1)
coefficient     - (q^-1) mod p

La chiave privata non dovrebbe essere composta solo da (n, d) coppia? Perché ci sono 6 componenti extra? Contiene e (esponente pubblico) in modo che la chiave RSA pubblica possa essere generata / estratta / derivata dalla chiave RSA privata private.pem. I restanti 5 componenti sono lì per accelerare il processo di decrittazione. Si scopre che pre-calcolando e memorizzando quei 5 valori è possibile velocizzare la decrittazione RSA del fattore 4. La decodifica funzionerà senza quei 5 componenti, ma può essere eseguita più velocemente se li si ha a portata di mano. L'algoritmo di accelerazione si basa sul teorema del resto cinese .

Sì, la chiave privata RSA private.pem contiene effettivamente tutti questi 8 valori; nessuno di questi viene generato al volo quando si esegue il comando precedente. Prova a eseguire i seguenti comandi e confronta l'output:

# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der

# Print private.der private key contents as binary stream
xxd -p private.der

# Now compare the output of the above command with output 
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less

Questa struttura della chiave privata RSA è consigliata da PKCS # 1 v1.5 come alternativa ( seconda ) rappresentazione. Lo standard PKCS # 1 v2.0 esclude del tutto gli esponenti e e dalla rappresentazione alternativa. PKCS # 1 v2.1 e v2.2 propongono ulteriori modifiche alla rappresentazione alternativa, includendo facoltativamente più componenti relative a CRT.

Per visualizzare il contenuto della chiave pubblica RSA public.pem, eseguire quanto segue (output troncato alle etichette qui):

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

Nessuna sorpresa qui. È solo una coppia (n, e), come promesso.

Ora finalmente rispondo alla domanda iniziale: Come è stato mostrato sopra, la chiave RSA privata generata usando openssl contiene componenti di chiavi sia pubbliche che private e altro ancora. Quando si genera / estrae / deriva la chiave pubblica dalla chiave privata, openssl copia due di questi componenti (e, n) in un file separato che diventa la chiave pubblica.


hai scritto "Per generare la chiave pubblica (d, n) dalla chiave privata ...". Non dovrebbe essere "(e, n)"? Grazie per l'ottima risposta, però!
elattico

Stai confrontando la 'sintassi' (esterna) in v1.5 con la semantica nelle versioni successive; controlla 2.0 # 11.1.2 e 2.1 e 2.2 # A.1.2 e vedrai n, e, d ancora presenti. (Come già notato dalla risposta di James Polk.)
dave_thompson_085

1
spiegazione straordinaria. Grazie
Francisco Albert,

1
Sembra che l'esponente pubblico esia sempre 65537 0x010001. Probabilmente è un atto decisivo per la scelta dell'esponente pubblico e questo è probabilmente il motivo per cui nella pagina man, e quasi ogni dove genrsaè spiegato come to generate the private key. Quello pubblico è abbastanza ovvio.
shampoo

Posso calcolare la (n, e) solo da (n, d)?
Flyq

21

La chiave pubblica non è memorizzata nel file PEM come pensano alcune persone. La seguente struttura DER è presente nel file della chiave privata:

openssl rsa -text -in mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

Quindi ci sono abbastanza dati per calcolare la chiave pubblica (modulo ed esponente pubblico), che è ciò che openssl rsa -in mykey.pem -puboutfa


Vedo che la chiave pubblica non è memorizzata lì, sebbene derivabile come la chiave privata, ma non vedo nemmeno la chiave privata memorizzata lì ?! eppure se cerco il file pem vedo che dice chiave privata e alcuni ascii.
barlop

2
Anche la chiave privata è derivata, guarda il campo privateExponent. Puoi vedere i campi usando openssl rsa -text -in mykey.pem
Uxio

2
La chiave pubblica è effettivamente memorizzata nel pem, perché il pem include anche e e, cioè la chiave pubblica. A differenza degli algoritmi di log discreti, la chiave pubblica rsa non può essere calcolata semplicemente dalla chiave privata (d, n). È lì solo perché le specifiche rsa indicano di memorizzarlo con la chiave privata e altre informazioni.
Michael Chourdakis,

1
Sì, questa risposta è assolutamente sbagliata . Sono presenti sia l'esponente pubblico che il modulo, quindi la chiave pubblica è sicuramente presente. Non è necessario per l'esponente pubblico lì dentro se non quello di recuperare facilmente la chiave pubblica per essa senza alcun calcolo .
Maarten Bodewes,

1
@MaartenBodewes: la risposta è corretta. Ciò che viene citato viene preso dal relativo RFC come valori memorizzati per una chiave PRIVATA. Il fatto che due dei valori siano anche / utilizzati solo per la crittografia della chiave pubblica non cambia che si tratta dei dati della chiave privata. Ho imparato tutte queste cose negli ultimi due giorni, non facendo domande ma cercando e leggendo lo standard pertinente. Ora capisco tutto su ASN.1, DER, PEM e RSA (forse non TUTTO su RSA).
AlastairG

8

qui in questo codice per prima cosa stiamo creando una chiave RSA che è privata ma ha anche una coppia della sua chiave pubblica, quindi per ottenere la tua chiave pubblica effettiva facciamo semplicemente questo

openssl rsa -in mykey.pem -pubout > mykey.pub

spero di averlo per maggiori informazioni controlla questo


6

Innanzitutto un rapido riepilogo sulla generazione delle chiavi RSA.

  1. Scegli casualmente due numeri primi probabili casuali della dimensione appropriata (peq).
  2. Moltiplica i due numeri primi insieme per produrre il modulo (n).
  3. Scegli un esponente pubblico (e).
  4. Fai un po 'di matematica con i numeri primi e l'esponente pubblico per produrre l'esponente privato (d).

La chiave pubblica è costituita dal modulo e dall'esponente pubblico.

Una chiave privata minima consisterebbe nel modulo e nell'esponente privato. Non esiste un modo sicuro computazionalmente fattibile per passare da un modulo noto e un esponente privato al corrispondente esponente pubblico.

Però:

  1. Pratici formati di chiave privata memorizzano quasi sempre più di n e d.
  2. Normalmente non viene scelto in modo casuale, viene utilizzato uno dei pochi valori noti. Se e è uno dei valori noti e conosci d allora sarebbe facile capire e per tentativi ed errori.

Quindi nella maggior parte delle implementazioni pratiche di RSA puoi ottenere la chiave pubblica dalla chiave privata. Sarebbe possibile costruire un cryptosystem basato su RSA dove ciò non era possibile, ma non è una cosa fatta.


1
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.

1
Questo è sciocco; non è necessario impegnarsi ulteriormente per creare un certificato inutile quando tutto ciò che si desidera è una coppia di chiavi. Per qualche altra Q dove vuoi un certificato questa potrebbe essere una risposta.
dave_thompson_085 il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.