Posso ottenere una chiave pubblica da una chiave privata RSA?

44

Per quanto mi ricordo, crittografate il messaggio utilizzando la chiave pubblica e lo decifrate usando la chiave privata. La mia domanda è se sia possibile ottenere una chiave pubblica da una chiave privata RSA. Ad esempio se ho una chiave del genere:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCtrKVnwse4anfX+JzM7imShXZUC+QBXQ11A5bOWwHFkXc4nTfE
Or3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j3NgqX8zZJG7IwLJ/Pm2sRW5Q
j32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdWtoeLfxDBL2AJ20qXzQIDAQAB
AoGBAKNXi0GpmjnCOPDxLFg5bvQVfhLSFCGMKQny1DVEtsfgZmbixv5R2R41T4+d
CHJMdEsUFFJ6I7CRLTcg1SDU8IhcAWCBRSNeVuomCHlQG16ti8HxwhiwIcjvDz/z
NC2sL5ZJ2eJnhbtXLdf6pxxO1pA5vLp1AX06IaETO977XvupAkEA+ZgtGZybyUkf
tEA3ekXc5eLoW+zgU0C1fATWcIZ8Iq5YV1BW+3oAzf8HgIbkQh4LM2qa6An3l+vW
NXR4wICHkwJBALIhrcdJqKw36qiyenq+m78klp5SnurQifVt0Sy1GMWyOUqYz5jK
t9sGo9Qn6GDuYe/XGXKWQW25PkEYXxxPPx8CQQCpICyvRidp5VrOURVGjUB5pZ+9
am02/In9V2nXJcnH1kuWHqJSFQGmlEEJHl5dTu5YEMyWnupezzd/UUThbDZxAkAz
TNO5QxNalbf04YG4e9Bq2eSur+iog2pXzkqhb3404UDypNOUkz0jzOO9o8ieschu
xCnGAFPTf7fYE2bAxmnNAkEA0/3bdsvJclquypqP9CQeQnxGwQtWz6+yn07gj3U1
V19mdeKCUZWklRarrcr67u9DdEx+JowyEY/ppzgeQtW01g==
-----END RSA PRIVATE KEY-----

posso ottenere una chiave pubblica?

    
posta user162408 27.10.2017 - 08:30
fonte

3 risposte

60

can I get a public key?

È facile utilizzare openssl rsa :

$ openssl rsa -in the-private-key-from-your-question.pem  -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtrKVnwse4anfX+JzM7imShXZU
C+QBXQ11A5bOWwHFkXc4nTfEOr3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j
3NgqX8zZJG7IwLJ/Pm2sRW5Qj32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdW
toeLfxDBL2AJ20qXzQIDAQAB
-----END PUBLIC KEY---

Se vuoi avere un'idea di cosa è contenuto in un file chiave, puoi passare l'opzione -text per vedere un dump di debug leggibile dall'uomo. In questo modo puoi vedere che un file chiave contiene sia informazioni private che informazioni pubbliche. Soprattutto contiene il modulo e publicExponent che descrivono completamente la chiave pubblica:

$ openssl rsa -text -in the-private-key-from-your-question.pem
Private-Key: (1024 bit)
modulus:
    00:ad:ac:a5:67:c2:c7:b8:6a:77:d7:f8:9c:cc:ee:
    29:92:85:76:54:0b:e4:01:5d:0d:75:03:96:ce:5b:
    01:c5:91:77:38:9d:37:c4:3a:bd:df:26:39:d1:49:
    4e:40:dc:84:4e:15:4f:e9:55:53:62:5c:93:64:97:
    ba:90:64:ae:66:61:bf:23:dc:d8:2a:5f:cc:d9:24:
    6e:c8:c0:b2:7f:3e:6d:ac:45:6e:50:8f:7d:82:fe:
    e2:6e:9b:ae:10:fe:21:08:b0:28:3f:98:98:c3:2e:
    1d:65:ca:51:0c:12:ec:ca:81:37:56:b6:87:8b:7f:
    10:c1:2f:60:09:db:4a:97:cd
publicExponent: 65537 (0x10001)
privateExponent:
(…)
    
risposta data 27.10.2017 - 08:40
fonte
28

In pratica, sì, puoi ottenere la chiave pubblica dalla chiave privata. In linea di principio, sarebbe possibile creare una chiave privata RSA da cui la corrispondente chiave pubblica non può essere facilmente ottenuta, ma ciò richiederebbe l'uso sia di un metodo di generazione di chiavi non standard sia di un privato non standard formato di archiviazione delle chiavi.

Rivediamo rapidamente le nozioni di base. Una chiave pubblica RSA è composta da due valori:

  • il modulo n (un prodotto di due numeri primi di grandi dimensioni p e q ), e
  • l'esponente pubblico e (che può essere lo stesso per molti tasti e viene tipicamente scelto come un piccolo numero dispari, più comunemente o 3 o 2 16 +1 = 65537).

Una chiave privata RSA, nel frattempo, richiede almeno i seguenti due valori:

  • il modulo n (come nella chiave pubblica) e
  • l'esponente privato d (calcolato dall'esponente pubblico e e i fattori p e q del modulo).

Tuttavia, la maggior parte dei formati per la memorizzazione delle chiavi private RSA, incluso il PKCS1 formato RSAPrivateKey mostrato nella domanda, in realtà memorizza un molti altri valori, tra cui:

  • l'esponente pubblico e ,
  • i fattori p e q del modulo,
  • gli esponenti privati ridotti d p = d mod ( p - 1) e d q = d mod ( q - 1), e
  • il "coefficiente CRT" q inv = q -1 mod p .

In particolare, l'inclusione dell'esponente pubblico e nel formato della chiave privata significa che la chiave pubblica può essere estratta banalmente da un file di chiave privata compatibile con PKCS1. Inoltre, anche se l'esponente pubblico e non è stato incluso nel file della chiave privata, conoscere i fattori p e q del modulo consente l'esponente per essere facilmente calcolato dall'altro. E, infine, anche se non conoscessimo i fattori del modulo, per le chiavi RSA generate nel solito modo potremmo semplicemente testare i valori più usati di e e vedere quale di essi genera testi cifrati che possono essere decifrati correttamente usando la chiave privata fornita.

Tutto ciò detto, se dovessimo utilizzare un algoritmo di generazione di chiavi RSA non standard che scelse e (o d ) casualmente dall'intervallo ammissibile di valori (es. i numeri interi maggiori di 1 e minori di e coprimi con λ ( n ) = lcm ( p - 1, q - 1)), e se abbiamo usato un formato di chiave privata RSA non standard che memorizzava solo le informazioni minime per la decrittazione (cioè n e d ), allora non sarebbe possibile calcolare la chiave pubblica dalla chiave privata senza spezzare efficacemente la chiave (cioè il factoring del modulo).

Infatti, se usato in modo non standard, l'algoritmo RSA diventa "simmetrico" nel senso che nessuno dei due tasti ( n , e ) e ( n , d ) possono essere efficacemente calcolati dall'altro e uno potrebbe essere arbitrariamente designato come chiave privata. In linea di principio, se non si permettesse al detentore della chiave privata di conoscere la chiave "pubblica" corrispondente (che, ovviamente, significa che non sarebbe più pubblica), potrebbero decodificare i messaggi ma non crittografarli. Ahimè, l'utilità pratica di qualsiasi schema di questo tipo è piuttosto limitata dal semplice fatto che chi genera la coppia di chiavi finirà inevitabilmente per conoscere entrambe le metà di esso.

    
risposta data 27.10.2017 - 19:16
fonte
3

Sì. È anche abbastanza facile. Se osservi le specifiche RSA, una chiave pubblica ha bisogno di n e e . Una chiave privata potrebbe avere p q d . Usali per calcolare.

n=p*q
e=mod_inverse(d,euler_totient(n))

Se vuoi comprarli in un formato PEM, consulta link

    
risposta data 27.10.2017 - 08:34
fonte

Leggi altre domande sui tag