Qual è la differenza tra crittografia e accesso nella crittografia asimmetrica?


297

Qual è la differenza tra la crittografia di alcuni dati e la firma di alcuni dati (utilizzando RSA)?

Inverte semplicemente il ruolo delle chiavi pubblico-private?

Ad esempio, desidero utilizzare la mia chiave privata per generare messaggi in modo che solo io possa essere il mittente. Voglio che la mia chiave pubblica venga utilizzata per leggere i messaggi e non mi interessa chi li legge. Voglio essere in grado di crittografare determinate informazioni e utilizzarle come chiave del prodotto per il mio software. Mi importa solo di essere l'unico in grado di generarli. Vorrei includere la mia chiave pubblica nel mio software per decrittografare / leggere la firma della chiave. Non mi interessa chi può leggere i dati nella chiave, mi interessa solo di essere l'unico verificabile in grado di generarli.

La firma è utile in questo scenario?

Risposte:


441

Durante la crittografia, usi la loro chiave pubblica per scrivere un messaggio e loro usano la loro chiave privata per leggerlo.

Quando firmi, usi la tua chiave privata per scrivere la firma del messaggio e loro usano la tua chiave pubblica per verificare se è davvero tua.

Voglio usare la mia chiave privata per generare messaggi in modo che solo io possa essere il mittente.

Voglio che la mia chiave pubblica venga utilizzata per leggere i messaggi e non mi interessa chi li legge

Questo sta firmando , è fatto con la tua chiave privata.

Voglio essere in grado di crittografare determinate informazioni e usarle come chiave del prodotto per il mio software.

Mi importa solo di essere l'unico in grado di generarli.

Se hai solo bisogno di saperlo da solo, non devi fare confusione con le chiavi per farlo. Puoi semplicemente generare dati casuali e conservarli in un database.

Ma se vuoi che le persone sappiano che le chiavi sono davvero tue, devi generare dati casuali, tenerlo in un database e firmarlo con la tua chiave.

Vorrei includere la mia chiave pubblica nel mio software per decrittografare / leggere la firma della chiave.

Probabilmente dovrai acquistare un certificato per la tua chiave pubblica da un fornitore commerciale come Verisign o Thawte, in modo che le persone possano verificare che nessuno abbia falsificato il tuo software e sostituito la tua chiave pubblica con la loro.


7
Tecnicamente parlando, quando dici che la chiave privata viene utilizzata per scrivere la firma del messaggio, stai dicendo che l'hash del messaggio viene crittografato con la mia chiave privata?
Andy Ibanez,

4
@AndyIbanez: ciò che è crittografato (il digest ) può includere anche timestamp e un po 'di sale casuale, ma sì, questo è l'essenza di esso.
Quassnoi,

7
@Quassnoi In effetti quando diciamo "firma con la chiave privata", non significa "crittografare" ma significa "decodificare". Firma il messaggio approssimativamente parlando è lo stesso di decifrare con la chiave privata e nel ricevitore crittografare con la chiave pubblica, in questo modo l'hash diventerà lo stesso e potrebbe essere confrontato.
Johnny Willer,

5
@JohnnyWiller: come @slim menzionato di seguito, il nucleo matematico è lo stesso per entrambe le funzioni di crittografia e decrittografia. Non sono funzioni separate, sono la stessa funzione f(key, message), tale chef(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi,

2
@ Ciao no non lo è. La generazione della coppia di chiavi è gratuita. Il costo è coinvolto nel far credere agli altri che la firma sia davvero tua. Per fare ciò, hai la tua chiave pubblica stessa, che hai precedentemente generato gratuitamente, firmata da un'autorità che potrebbe o meno farti pagare per questo.
Quassnoi,

143

In RSA crypto, quando generi una coppia di chiavi, è del tutto arbitrario quale scegli di essere la chiave pubblica e quale sia la chiave privata. Se si crittografa con uno, è possibile decrittografare con l'altro: funziona in entrambe le direzioni.

Quindi, è abbastanza semplice vedere come è possibile crittografare un messaggio con la chiave pubblica del destinatario , in modo che il destinatario possa decrittografarlo con la propria chiave privata .

Una firma è la prova che il firmatario ha la chiave privata che corrisponde a una chiave pubblica. Per fare ciò, sarebbe sufficiente crittografare il messaggio con la chiave privata di quel mittente e includere la versione crittografata insieme alla versione in testo normale. Per verificare il mittente, decrittografare la versione crittografata e verificare che sia uguale al testo normale.

Ovviamente, questo significa che il tuo messaggio non è segreto. Chiunque può decodificarlo, perché la chiave pubblica è ben nota. Ma quando lo fanno, hanno dimostrato che il creatore del testo cifrato ha la chiave privata corrispondente.

Tuttavia, questo significa raddoppiare le dimensioni della trasmissione - testo normale e testo cifrato insieme (supponendo che tu voglia che le persone che non sono interessate a verificare la firma, leggano il messaggio). Quindi, invece, in genere viene creata una firma creando un hash del testo in chiaro. È importante che non sia possibile creare hash falsi, quindi vengono utilizzati algoritmi di hash crittografici come SHA-2.

Così:

  • Per generare una firma, crea un hash dal testo in chiaro, crittografalo con la tua chiave privata, includilo insieme al testo in chiaro.
  • Per verificare una firma, crea un hash dal testo in chiaro, decodifica la firma con la chiave pubblica del mittente, controlla che entrambi gli hash siano uguali.

8
@headcode si applica solo alle chiavi asimmetriche. Le chiavi simmetriche non vengono fornite in coppia.
magro

3
In realtà, si applica solo alle chiavi RSA. Con le chiavi ECDSA, ad esempio, è possibile generare banalmente la chiave pubblica dalla chiave privata e la chiave privata è uno scalare mentre la chiave pubblica è una coordinata.
David Schwartz,

5
Come puoi decrittografare i messaggi con le chiavi PUBBLICHE? I messaggi non vengono decifrati solo con chiavi private?
daremkd,

3
5 fonti in contraddizione con questa risposta 1 , 2 , 3 , 4 , 5
wha7ever

6
Non è arbitrario quale si chiama pubblico e privato. È possibile generare la chiave pubblica dalla chiave privata, ma non è possibile generare la chiave privata dalla chiave pubblica. Non è una grande differenza?
Greg Schmit,

23

Esistono due problemi distinti ma strettamente correlati nello stabilire una comunicazione sicura

  1. Crittografa i dati in modo che solo le persone autorizzate possano decrittografarli e leggerli.
  2. Verifica l'identità / autenticazione del mittente.

Entrambi questi problemi possono essere elegantemente risolti utilizzando la crittografia a chiave pubblica.

I. Crittografia e decrittografia dei dati

Alice vuole inviare un messaggio a Bob che nessuno dovrebbe essere in grado di leggere.

  • Alice crittografa il messaggio con la chiave pubblica di Bob e lo invia.
  • Bob riceve il messaggio e lo decodifica utilizzando la sua chiave privata.

Nota che se A vuole inviare un messaggio a B, A deve usare la chiave pubblica di B (che è pubblicamente disponibile a chiunque) e qui non viene visualizzata la chiave pubblica o privata di A.

Quindi, se vuoi inviarmi un messaggio, dovresti conoscere e utilizzare la mia chiave pubblica che ti fornisco e solo io sarò in grado di decrittografare il messaggio poiché sono l'unico che ha accesso alla chiave privata corrispondente.

II. Verifica l'identità del mittente (autenticazione)

Alice vuole inviare di nuovo un messaggio a Bob. Il problema della crittografia dei dati viene risolto utilizzando il metodo sopra.

Ma cosa succede se mi siedo tra Alice e Bob, presentandomi come "Alice" a Bob e inviando il mio messaggio a Bob invece di inoltrare quello inviato da Alice. Anche se non riesco a decifrare e leggere il messaggio originale inviato da Alice (che richiede l'accesso alla chiave privata di Bob) sto dirottando l'intera conversazione tra di loro.

C'è un modo in cui Bob può confermare che i messaggi che sta ricevendo sono effettivamente inviati da Alice?

  • Alice firma il messaggio con la sua chiave privata e lo invia. (In pratica, ciò che è firmato è un hash del messaggio, ad esempio SHA-256 o SHA-512.)
  • Bob lo riceve e lo verifica utilizzando la chiave pubblica di Alice. Poiché la chiave pubblica di Alice ha verificato correttamente il messaggio, Bob può concludere che il messaggio è stato firmato da Alice.

1
Quindi quando firmi il messaggio, firmi il messaggio stesso o il messaggio crittografato?
FrostyStraw

21

Sì, pensa a firmare i dati come a dare il tuo timbro di cera che nessun altro ha. Viene fatto per ottenere integrità e non ripudio . La crittografia è così che nessun altro può vedere i dati. Questo viene fatto per ottenere la riservatezza . Vedi wikipedia http://it.wikipedia.org/wiki/Information_security#Key_concepts

Una firma è un hash del tuo messaggio firmato usando la tua chiave privata.


16

La firma sta producendo un "hash" con la tua chiave privata che può essere verificato con la tua chiave pubblica. Il testo viene inviato in chiaro.

La crittografia utilizza la chiave pubblica del destinatario per crittografare i dati; la decodifica viene eseguita con la loro chiave privata.

Quindi, l'uso delle chiavi non è invertito (altrimenti la tua chiave privata non sarebbe più privata!).


Nella normale crittografia asimmetrica, la crittografia viene eseguita con la chiave pubblica dei destinatari, non con la chiave privata.
mmcdole,

Ti sei perso che questa domanda riguardava specificamente RSA in cui l'uso delle chiavi è invertito e in cui non compromette la chiave privata.
David Schwartz,

8

Stai descrivendo esattamente come e perché la firma viene utilizzata nella crittografia a chiave pubblica. Nota che è molto pericoloso firmare (o crittografare) i messaggi aritrari forniti da altri - questo consente attacchi agli algoritmi che potrebbero compromettere le tue chiavi.


1
I browser Web non crittografano i dati arbitrari quando si utilizza SSL?
Ian Warburton,

2
@IanWarburton: Ma per questo non usano la crittografia asimmetrica. I trasferimenti di dati effettivi utilizzano la crittografia simmetrica con una chiave di sessione generata casualmente.
Michael Borgwardt,

1
@IanWarburton: no, perché nessuno dei due sarebbe scelto da un attaccante. Il pericolo sta nel criptare o firmare qualcosa fornito direttamente da un utente malintenzionato, perché può essere deliberatamente creato per rivelare informazioni sulla tua chiave privata o persino creare firme che sembrano valide per qualcosa che non intendevi firmare. Una ripartizione dettagliata di come funziona quest'ultimo caso per RSA è qui: crypto.stackexchange.com/questions/35644/…
Michael Borgwardt

2
@IanWarburton: ecco perché RSA richiede il padding, quindi non crittografare mai solo un messaggio scelto: en.wikipedia.org/wiki/… - ma sono proprio le operazioni che coinvolgono la chiave privata (come la firma) a essere particolarmente vulnerabili rispetto all'input scelto.
Michael Borgwardt,

1
@IanWarburton Non sono un esperto di crittografia, ma da quello che ho capito, ciò non dovrebbe causare alcun problema.
Michael Borgwardt,

8

La firma indica che sei veramente la fonte o il voucher dell'oggetto firmato. Tutti possono leggere l'oggetto, però.

Crittografia significa che solo quelli con la chiave privata corrispondente possono leggerlo, ma senza firma non c'è garanzia che tu sia dietro l'oggetto crittografato.


Se il messaggio viene decifrato dalla mia chiave pubblica, solo io avrei potuto inviarlo. (Supponendo che la mia chiave privata non sia compromessa)
Dojo,

5

Qual è la differenza tra la crittografia di alcuni dati e la firma di alcuni dati (utilizzando RSA)?

La crittografia mantiene la riservatezza del messaggio ("alcuni dati"), mentre la firma fornisce non ripudio: vale a dire che solo l'entità che lo ha firmato avrebbe potuto firmarlo. Ci sono anche differenze funzionali; continuare a leggere.

Inverte semplicemente il ruolo delle chiavi pubblico-private?

Assolutamente no. L'uso delle stesse chiavi private per la firma e la decrittografia (o, allo stesso modo, le stesse chiavi pubbliche per la verifica e la crittografia ) è disapprovato, poiché non si devono mescolare scopi. Questo non è tanto un problema matematico (RSA dovrebbe essere ancora sicuro), ma un problema gestione delle chiavi , dove ad esempio la chiave di firma dovrebbe avere una durata più breve e contenere una maggiore protezione prima di essere utilizzata.

Per lo stesso messaggio, è necessario utilizzare la chiave privata dei mittenti per la firma e la chiave pubblica attendibile dei destinatari per la crittografia. Comunemente segno-allora-crittografare viene utilizzato altrimenti un avversario potrebbe sostituire la firma con la propria. Allo stesso modo è necessario utilizzare la chiave privata del destinatario per la decrittazione e la chiave pubblica attendibile del mittente per la verifica.

Inoltre, dovresti capire che la generazione della firma non usa la "crittografia con la chiave privata". Sebbene tutte le operazioni RSA siano basate sull'esponenziazione modulare, lo schema di imbottitura è completamente diverso per la generazione della firma. Inoltre, la chiave pubblica ha proprietà completamente diverse rispetto alla chiave privata RSA in tutti gli usi pratici di RSA.

Ad esempio, desidero utilizzare la mia chiave privata per generare messaggi in modo che solo io possa essere il mittente.

Questa è proprietà di non ripudio, che può essere ottenuta firmando.

Voglio che la mia chiave pubblica venga utilizzata per leggere i messaggi e non mi interessa chi li legge.

La chiave pubblica dovrebbe essere considerata conosciuta da tutti. Se vuoi che tutti leggano i messaggi, semplicemente non li crittografano.

La firma generalmente non influenzerà il contenuto del messaggio. Il messaggio è considerato separato dalle firme. Ufficialmente tali firme sono note come "firme con appendice" dove l'appendice è il messaggio. È un nome un po 'strano poiché il messaggio è considerato più importante della firma su di esso, ma sì. Solo poche firme offrono il recupero (parziale) dei messaggi; non sono più utilizzati molto e sono generalmente considerati deprecati.

Si noti che protocolli di firma come CMS possono distribuire un formato contenitore che include sia il messaggio che la firma. In quel caso dovresti prima ottenere il messaggio - ancora non crittografato - dal contenitore, proprio come decomprimere un file da un semplice archivio .zip. Quindi il messaggio può essere nascosto alla vista e non può essere utilizzato direttamente in quel caso.

Voglio essere in grado di crittografare determinate informazioni e utilizzarle come chiave del prodotto per il mio software. Mi importa solo di essere l'unico in grado di generarli.

La crittografia viene utilizzata per ottenere la riservatezza. In passato la generazione della firma RSA veniva spesso considerata come "crittografia con la chiave privata". Tuttavia, le operazioni sono piuttosto diverse come spiegato sopra e gli standard successivi cercano disperatamente di separare la generazione di crittografia e firma.

Vorrei includere la mia chiave pubblica nel mio software per decrittografare / leggere la firma della chiave. Non mi interessa chi può leggere i dati nella chiave, mi interessa solo di essere l'unico verificabile in grado di generarli.

Sì, questo si chiama stabilire la fiducia nella chiave pubblica. Tuttavia, proteggere il codice del programma è molto diverso dalla protezione dei messaggi. Puoi eseguire la firma del codice ma ti occorrerebbe qualcosa per controllare la firma al di fuori del codice . Ci sono sistemi operativi che offrono questo.

C'è Microsoft Authenticode per esempio. I negozi di applicazioni come l'iStore e l'app store Android possono o meno utilizzare la firma del codice, ma offrono una certa sicurezza che l'applicazione non è clonata o almeno non clonata all'interno del negozio. La crittografia non è sempre la soluzione dopo tutto.

Mantenere il proprio codice di essere clonato / alterato a tutti è molto più difficile, e si sarebbe saldamente in territorio DRM se andate in questo modo.

La firma è utile in questo scenario?

Si assolutamente. Può sicuramente aiutare a assicurarsi che i messaggi siano stati firmati da te solo se c'è fiducia nella chiave pubblica. Se può essere utile per autenticare il codice dell'applicazione / chiave pubblica integrata dipende interamente dall'ambiente in cui ci si aspetta che esegua il codice.


"In passato la generazione della firma RSA era spesso considerata come" crittografia con la chiave privata ". Tuttavia, le operazioni sono piuttosto diverse come spiegato sopra, e gli standard successivi cercano disperatamente di separare la generazione di crittografia e firma." - questo non mi è chiaro. KeyPair può essere pk o sk e ciò che uno crittografa può decrittografare l'altro. Se siamo d'accordo su questo, allora come possiamo sostenere che la firma e la crittografia sono distinte in qualche modo significativo? Entrambi crittografano e quindi possono essere decrittografati solo con l'altra chiave. Ho visto riferimenti a funzioni di firma, è correlato?
Morgan,

L'unica differenza di cui sono a conoscenza nella funzione di firma è l'hash del messaggio prima della crittografia.
Morgan,

4

Nel tuo scenario, non crittografare nel significato di crittografia asimmetrica; Preferirei chiamarlo "codificare".

Quindi codifichi i tuoi dati in una rappresentazione binaria, quindi firmi con la tua chiave privata. Se non riesci a verificare la firma tramite la tua chiave pubblica, sai che i dati firmati non vengono generati con la tua chiave privata. ("verifica" significa che i dati non firmati non sono significativi)


2

Funzionalmente, si utilizza la crittografia della chiave pubblica / privata per assicurarsi che solo il destinatario possa leggere il messaggio. Il messaggio viene crittografato utilizzando la chiave pubblica del destinatario e decrittografato utilizzando la chiave privata del destinatario.

È possibile utilizzare la firma per comunicare al destinatario che è stato creato il messaggio e che non è cambiato durante il trasferimento. La firma del messaggio viene eseguita utilizzando la propria chiave privata. Il destinatario può utilizzare la chiave pubblica per verificare che il messaggio non sia stato manomesso.

Per quanto riguarda l'algoritmo utilizzato: implica una funzione a senso unico, ad esempio Wikipedia . Uno dei primi di tali algoritmi utilizza numeri primi di grandi dimensioni, ma da allora sono state inventate più funzioni a senso unico.

Cerca "Bob", "Alice" e "Mallory" per trovare articoli introduttivi su Internet.


Puoi commentare il mio caso d'uso? Voglio usare una chiave privata per crittografare e una chiave pubblica per consentire a chiunque di decifrare.
mmcdole,

1
Non è vero che tutta la crittografia asimmetrica si basa sui numeri primi, è solo l'esempio più noto (RSA); ci sono altri metodi come la crittografia a curva ellittica.
Michael Borgwardt,

"Il messaggio viene crittografato e quindi crittografato utilizzando la chiave pubblica del destinatario." Quella frase non ha alcun senso, o per lo meno ha bisogno di ulteriori spiegazioni. "crittografato quindi crittografato" ???
Maarten Bodewes,

Hai dimenticato Trento! :)
Dojo,

1

Rispondendo a questa domanda nel contenuto che gli interroganti intendevano utilizzare la soluzione per le licenze software, i requisiti sono:

  1. Nessuna terza parte può produrre una chiave di licenza decompilando l'app
  2. Il contenuto della chiave software non deve essere sicuro
  3. La chiave software non è leggibile dall'uomo

Una firma digitale risolverà questo problema in quanto i dati non elaborati che rendono la chiave possono essere firmati con una chiave privata che la rende non leggibile dall'uomo ma potrebbe essere decodificata se decodificata. Ma la chiave privata è sicura, il che significa che nessuno sarà in grado di rilasciare licenze per il tuo software (che è il punto).

Ricorda che non puoi impedire a una persona qualificata di rimuovere i blocchi software sul tuo prodotto. Quindi, se devono hackerare ogni versione rilasciata. Ma davvero non vuoi che siano in grado di generare nuove chiavi per il tuo prodotto che possono essere condivise per tutte le versioni.

Python La documentazione di PyNaCl contiene un esempio di "firma digitale" che servirà allo scopo. http://pynacl.readthedocs.org/en/latest/signing/

e di causare il progetto NaCl in esempi C.

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.