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.