2009-03-30 15 views
38

Da qualsiasi altra cosa comprenda leggendo vari materiali, le coppie di chiavi pubbliche-private sono la base della crittografia asimmetrica e anche qualcosa sulla scelta di 2 numeri primi (che è approssimativamente la tua chiave privata) e della loro moltiplicazione (che è approssimativamente la tua chiave pubblica) , Sembra che sia possibile generare una chiave pubblica se si conosce la chiave privata. È corretto o sto scambiando qualcosa?Dato una chiave privata, è possibile derivarne la sua chiave pubblica?

[EDIT]

Cosa mi ha fatto più confuso è che non è possibile per serializzare la chiave RSA di XML con solo chiave privata (utilizzando .NET classe RSACryptoServiceProvider). Non sono sicuro se questa limitazione sia intenzionale o no!

risposta

29

Questo dipende dal sistema di crittografia.

In RSA, abbiamo (citando Wikipedia):

La chiave pubblica è costituito dal modulo n e del pubblico (o la crittografia) e l'esponente. La chiave privata è costituita dal modulo n e dall'esponente privato (o decrittografia) d che deve essere tenuto segreto.

Ora se abbiamo n e d (la chiave privata), mancano solo e per la chiave pubblica. Ma e è spesso abbastanza piccolo (meno di tre cifre), o addirittura fisso (un valore comune è 65537). In questi casi ottenere la chiave pubblica è banale.

Per Curva ellittica Diffie-Hellman, la chiave privata è d, e la chiave pubblica dG (con G anche pubblica), quindi è anche banale.

+1

In RSA, se conosciamo d and n, possiamo calcolare p e q tale che pq = n. Con questo, d ed e sono l'inverso modulo di ciascuno (p-1) (q-1). –

+3

@Henno Bransma: come si calcola "p e q tale che pq = n"? – sleske

+1

@HennoBrandsma Sapere * d * non aiuta il fattore * n *, più di quanto non sappia * e *. – erickson

-2

È teoricamente possibile, ma per i tasti grandi non è computabile.

+6

Puoi spiegare questo? – Hut8

1

Sì con accesso alla chiave privata la chiave pubblica può essere generata

+0

È (la tua risposta) applicabile a RSA in generale o specifica all'implementazione di Microsoft CryptoAPI (e al modo in cui serializza la chiave da/a XML)? – Hemant

+1

In realtà questo non è vero neanche - sono entrambi prodotti di calcoli complessi. – AviD

+2

La domanda è stata originariamente richiesta in linea di principio, quindi la risposta è in princple. Non conosco i componenti interni della crittografia .NET, tuttavia le chiavi private possono memorizzare p e q di origine. Si dovrebbe assumere che una chiave pubblica sia derivabile da una chiave privata. – AnthonyWJones

3

In QUALSIASI sistema di crittografia a chiave pubblica, la chiave pubblica è collegata matematicamente alla chiave privata. È molto semplice.

La chiave pubblica deriva dalla chiave privata al momento della generazione e con la chiave privata in qualsiasi momento nel futuro è possibile riutilizzare facilmente la chiave pubblica.

Non è possibile andare dall'altra parte. Data una chiave pubblica non è facile ricavare la chiave privata. Ecco perché possiamo condividere in modo sicuro le chiavi pubbliche con altre persone. Se hai abbastanza cicli di tempo/CPU, puoi forzarlo a forzare ma è probabilmente più semplice aspettare un attacco matematico alla chiave.

+4

È necessario il totient per ri-derivare facilmente la chiave pubblica, ma la chiave privata è solo l'esponente privato e il modulo. La derivazione del totiario da tali informazioni richiede il fattorizzazione di grandi numeri e non è noto alcun algoritmo veloce. – erickson

7

Dipende dall'algoritmo e da cosa intendi per "chiave privata".

Le chiavi private RSA sono spesso memorizzate nel loro modulo "Teorema dei rimanenti cinesi". Ad esempio, la struttura RSAPrivateKey definita in PKCS # 1 e riutilizzata da molti altri standard crittografici assume questo formato. Questo modulo include i due numeri segreti spesso indicati con p e q, da cui viene calcolato il totiario. Con il totiario e l'esponente privato, l'esponente pubblico viene rapidamente calcolato.

In ogni caso, la maggior parte delle coppie di chiavi RSA utilizza 65537 come esponente pubblico e il modulo viene sempre trasportato come parte della chiave privata.

33

Nella maggior parte dell'implementazione del sistema crittografico asimmetrico, l'unico dato garantito è che non è possibile trovare la chiave privata dalla chiave pubblica. Al contrario, trovare la chiave pubblica dalla chiave privata è banale nella maggior parte dei casi.

Per esempio, in RSA, è possibile creare la chiave pubblica dalla chiave privata con:

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

Ciò che è fuorviante è la terminologia: "chiave privata" si riferisce a 2 concetti diversi se si sta parlando della teoria o montone castrato si sta parlando di attuazione pratica:

  • la teorica chiave privata è la coppia (d, n) che condivide perfetta simmetrica (matematica) relazione ingegno h (e, n). Se stai confrontando questi, uno non può essere calcolato dall'altro.
  • Il pratica chiave privata (come nella implementazione openssl per esempio), si riferisce a un file contenente (d, n) ma anche più valori intermedi importanti fini velocità di decodifica. Oltre a ciò, la parte teoricamente "sconosciuta" della chiave pubblica e viene spesso fissata ai valori comuni per convenzione (che è 0x10001 per impostazione predefinita in openssl e sebbene possa essere modificata, si consiglia di attenersi solo a very specific values). Quindi dedurre la chiave pubblica (e, n) dalla chiave privata è banale per più motivi.
+1

Nel PKCS # 8 non si ottengono solo i valori per eseguire i calcoli del teorema del resto cinese (CRT) ma anche l'esponente pubblico. Quindi per le chiavi private OpenSSL non devi dedurre nulla. Se non si desidera specificare l'esponente della chiave pubblica durante la generazione della coppia di chiavi, quindi 'openssl' definisce l'argomento' -f4' per utilizzare il quarto numero di Fermat, che è effettivamente 0x010001 (un numero primo con solo due bit impostati su 1 per motivi di efficienza, in quanto è facile moltiplicare con il valore 0) –

+1

Re 'openssl': la libreria ha supportato a lungo qualsiasi pubexpt ragionevole. La linea di comando tradizionale 'genrsa' ha come valore predefinito' -f4' = 65537 e supporta anche '-3' = 3 (vedi crypto.SX per diversi Q su se e = 3 è buono, cattivo o brutto); dalla versione 1.0.0 nel 2010 riga di comando 'genpkey -algorithm RSA -pkeyopt rsa_keygen_pubexp: $ value' supporta qualsiasi valore ragionevole. –

2

Per il caso specifico di OpenSSH e ssh-keygen, sì è possibile:

ssh-keygen -y

Questa opzione consente di leggere un file privato formato OpenSSH e stampare una chiave pubblica allo stdout.


In generale, dipende l'algoritmo e quello che si etichetta la chiave privata. Tuttavia, qualsiasi implementazione ragionevole includerà le informazioni complete (chiavi pubbliche e private) nel file segreto.

0

chiave pubblica è il modulo N (ed esponente pubblico e, di solito 65537), chiave privata è dato dal due primi p, q (e esponente privato d, a volte anche le parti CRT d_p, d_q per SpeedUp) essenzialmente voi hanno N = pq ed e d = 1 mod ((p-1) (q-1)), puoi anche calcolare d_p e d_q usando CRT dato la chiave privata, il calcolo del modulo di chiave pubblica è la moltiplicazione "noiosa" e l'esponente pubblico è specificato o calcolato usando un algoritmo euclide esteso se standard e non era abbastanza buono. data chiave pubblica, il calcolo della chiave privata richiede sia la ricerca d (problema RSA) o p, q (factoring, vedere il setaccio del campo numero per il meglio per farlo). Questi problemi si dimostrano equivalenti in condizioni ragionevoli [Breaking RSA Generalmente è equivalente a Factoring, D. Aggarwal e U. Maurer, 2008]

0

C'è un equivoco su quale sia la chiave privata.La chiave privata è solo la coppia (d, n) e, dato solo questo, è impossibile generare la chiave pubblica da essa a meno che non si possa supporre che l'esponente pubblico sia 65537, come in quasi tutte le chiavi rsa.

Se, per qualsiasi ragione, l'esponente pubblico è un numero maggiore, non è possibile creare la chiave pubblica da quella privata.

Detto questo, il valore memorizzato come "chiave privata" per i file pem non è solo la chiave privata, ma contiene anche i fattori primi (tra le altre cose) e, quindi, è facile generare la chiave pubblica da esso.

Problemi correlati