it-swarm.it

Posso usare una chiave privata come chiave pubblica e viceversa?

Ho un codice per crittografare i dati utilizzando una chiave pubblica e decrittografarli utilizzando una chiave privata. Ciò è utile quando un client desidera inviare dati a un server e sapere che solo il server può decrittografarli.

Ma supponiamo che io voglia che il server crittografi i dati utilizzando la chiave private e li decifri usando la chiave public, come modo per distribuire i dati che possono essere verificati come provenienti dal server giusto. Invece di modificare il codice per consentire ciò, posso semplicemente pubblicare la chiave privata e mantenere segreta la chiave pubblica? Ciò influisce sulla sicurezza del sistema?

39
Graeme Perrow

Ma supponiamo che io voglia che il server crittografi i dati utilizzando la chiave privata e decrittografi utilizzando la chiave pubblica, come modo per distribuire i dati che possono essere verificati come provenienti dal server giusto.

Puoi farlo - questo è, a un livello molto semplicistico, come funziona la firma RSA (nota, semplicistica - c'è qualcosa in più).

Invece di modificare il codice per consentire ciò, posso semplicemente pubblicare la chiave privata e mantenere segreta la chiave pubblica? Ciò influisce sulla sicurezza del sistema?

Tu non devi pubblicare la chiave privata - RSA è una permutazione di Botola che significa:

  • Se si crittografa con una chiave pubblica, è possibile decrittografare con la chiave privata.
  • Se si crittografa con una chiave privata, è possibile decrittografare con una chiave pubblica.

Pertanto, RSA supporta sia la firma che la crittografia basandosi sul fatto che l'utente finale abbia solo la chiave pubblica.

Nel tuo caso, se il client desidera verificare che i dati provengano dal server, applica il secondo caso di RSA e decodifica i dati della firma utilizzando la chiave pubblica che hai già.

Inoltre, poiché si tratta di una permutazione, non è necessario modificare il codice. Entrambi i tasti dovrebbero funzionare usando la stessa funzione. Mi aspetto che qualsiasi libreria di criptovalute decente disponga di API per la verifica delle firme in base ai vari standard esistenti - una di queste sarebbe probabilmente una buona scommessa.

RSA Labs fornisce un Nice spiegazione di questo .

Se desideri estenderlo tra i server o verificare la comunicazione del client, genera le chiavi per ciascuna entità e scambia quelle pubbliche. Il processo può quindi essere utilizzato ad entrambe le estremità.

Teoricamente parlando, e ed d sono intercambiabili (motivo per cui RSA funziona) (uno deve essere designato segreto e tenuto segreto) ma p e q devono sempre essere sempre essere tenuto segreto poiché questi ti consentono di derivare da ee viceversa. Tuttavia, devi essere estremamente attento nella comprensione della chiave privata: il tuo software memorizza p/q nella chiave privata? In tal caso, non puoi pubblicarlo così com'è. Inoltre, quando dico intercambiabile - una volta pubblicata una di quelle coppie (e o d insieme al modulo n) devi proteggere l'altra con la tua vita. In pratica come Graeme collegato nei commenti e viene spesso scelto come valore piccolo/fisso. Il mio commento sull'e/d essendo intercambiabile chiaramente non si applica quando e è facilmente determinabile. Fare questo genere di cose ha quindi il potenziale per confusione e cattiva implementazione. Utilizza una libreria di terze parti/non iniziare a pubblicare chiavi private.

51
user2213

Sì, puoi crittografare utilizzando una chiave privata e decrittografare utilizzando una chiave pubblica, NON distribuire la tua chiave privata (le chiavi private possono generare chiavi pubbliche e l'intero sistema di crittografia è ora inutile), presumo che tu voglia fare qualcosa di simile Questo:

Il server crittografa i dati, li invia ai client.

I client dispongono di chiave pubblica e possono decrittografare i dati dal server.

In questa circostanza, avrebbe senso, se il server sta eseguendo sia la crittografia che la decrittografia, non ho idea del perché tu voglia implementare una crittografia asimmetrica.

La regola vale sempre: la chiave privata rimane privata e non lascia il server.

9
StrangeWill

Ma dire che voglio che il server crittografi i dati utilizzando la chiave privata e decrittografarli utilizzando la chiave pubblica:

Il server può crittografare i dati utilizzando la sua chiave privata e il destinatario può decrittografare utilizzando le chiavi pubbliche del server, questo è possibile. Tuttavia, questo scenario viene utilizzato per firmare digitalmente un documento e come dici tu "un modo di distribuire i dati che possono essere verificati provenire dal server giusto", in quanto potrebbe essere utilizzata solo la chiave corrispondente (chiave pubblica del server) per decrittografare i dati. La chiave pubblica del server è verificata dal corrispondente certificato digitale generato e firmato digitalmente dal server.

posso semplicemente pubblicare la chiave privata e mantenere segreta la chiave pubblica?

Non devi mai pubblicare la chiave privata, come suggerisce il nome.

Ciò influisce sulla sicurezza del sistema?

Sì, anche questo sistema non è praticabile, ad esempio se si utilizza Diffie-Hellman (uno dei protocolli di scambio di chiavi più utilizzati), il server e tutti i client devono condividere valori pubblici, utilizzati per calcolare le chiavi di sessione . Pertanto, se l'utente pubblica la propria chiave privata, è molto semplice calcolare la chiave pubblica, il che non è possibile o molto difficile viceversa.

2
Ishtiaq Hussain

Non so se è possibile crittografare con la chiave privata e decrittografare con la chiave pubblica, ma se fosse possibile, non sarebbe molto sicuro, poiché la chiave di decrittazione è pubblica: la chiave privata deve essere mantenuta privata.

Se desideri semplicemente verificare che il mittente del messaggio, firma invece i dati utilizzando la chiave privata del mittente e il destinatario verifica la firma utilizzando la chiave pubblica del mittente.

Se si desidera crittografare entrambi i dati e verificare il mittente, crittografare e firmare, nessuno dei quali richiede l'esposizione della chiave privata.

0
hmallett