Crittografia/RSA

Wikibooks, manuali e libri di testo liberi.
Indice del libro

In crittografia l'acronimo RSA indica un algoritmo di crittografia asimmetrica, utilizzabile per cifrare o firmare informazioni.

Storia[modifica]

L'algoritmo RSA è stato descritto nel 1977 da Ronald Rivest, Adi Shamir e Len Adleman al Massachusetts Institute of Technology; le lettere RSA vengono proprio dalle iniziali dei cognomi.

Clifford Cocks, un matematico britannico che lavorava per un dipartimento di spionaggio, il GCHQ, descrisse un sistema equivalente in un documento interno nel 1973. I documenti furono posti sotto segreto e, visto il costo relativamente alto delle macchine necessario a quel tempo per implementarlo, non ci furono ulteriori indagini né prove pratiche e la cosa fu considerata come una curiosità, per quanto se ne sa. La scoperta di Cocks fu resa pubblica solo nel 1997.

Nel 1983 l'algoritmo fu brevettato negli Stati Uniti dal MIT (brevetto 4.405.829). Il brevetto è scaduto il 21 settembre 2000.

Nel 2005 un gruppo di ricerca riuscí a scomporre un numero di 640 bit (193 decimali) in due numeri primi da 320 bit, impiegando per cinque mesi un cluster Opteron con 80 processori da 2,2 GHz, potenzialmente decifrando un messaggio codificato con RSA-640.

Fatto abbastanza rilevante è che RSA è computazionalmente impegnativo, soprattutto per quanto riguarda una eventuale realizzazione hardware. Di conseguenza un attuale buon utilizzo è quello di sfruttare RSA per codificare un unico messaggio contentene una chiave segreta, tale chiave verrà poi utilizzata per scambiarsi messaggi tramite un algoritmo a chiave segreta (ad esempio AES).

Oggi, insieme a DES, RSA è uno degli algoritmi più usati per la cifratura di firme digitali.

Operazioni[modifica]

RSA è basato sul problema complesso della fattorizzazione in numeri primi. Il suo funzionamento base è il seguente:

  1. si scelgono a caso due numeri primi, e , l'uno indipendentemente dall'altro, abbastanza grandi da garantire la sicurezza dell'algoritmo
  2. si calcola il loro prodotto , chiamato modulo (dato che tutta l'aritmetica seguente è modulo n)
  3. si sceglie poi un numero (chiamato esponente pubblico), più piccolo di e suo coprimo
  4. si calcola il numero (chiamato esponente privato) tale che

La chiave pubblica è , mentre la chiave privata è . I fattori e possono essere distrutti, anche se spesso vengono mantenuti all'interno della chiave privata.

La forza dell'algoritmo è che per calcolare da (così come il contrario) non basta la conoscenza di , ma serve il numero , infatti fattorizzare (cioè scomporre un numero nei suoi divisori) è un'operazione molto lenta, soprattutto se è un numero grande a sufficienza, poiché non si conoscono algoritmi efficienti.

Un messaggio viene cifrato attraverso l'operazione , mentre il messaggio viene decifrato con . Il procedimento funziona solo se la chiave utilizzata per cifrare e la chiave utilizzata per decifrare sono legate tra loro dalla relazione , e quindi quando un messaggio viene cifrato con una delle due chiavi può essere decifrato solo utilizzando l'altra. Tuttavia proprio qui si vede la debolezza dell'algoritmo: si basa sull'assunzione mai dimostrata (nota come assunzione RSA, o RSA assumption in inglese) che il problema di calcolare con numero composto di cui non si conoscono i fattori sia computazionalmente non trattabile.

La firma digitale non è altro che l'inverso: il messaggio viene crittato con la chiave privata, in modo che chiunque possa, utilizzando la chiave pubblica conosciuta da tutti, decifrarlo e, oltre a poterlo leggere in chiaro, essere certo che il messaggio è stato mandato dal possessore della chiave privata corrispondente a quella pubblica utilizzata per leggerlo.

Per motivi di efficienza e comodità normalmente viene inviato il messaggio in chiaro con allegata la firma digitale di un hash del messaggio stesso; in questo modo il ricevente può direttamente leggere il messaggio (che è in chiaro) e può comunque utilizzare la chiave pubblica per verificare che l'hash ricevuto sia uguale a quello calcolato localmente sul messaggio ricevuto. Se i due hash corrispondono anche il messaggio completo corrisponde (questo, ovviamente, solo se l'hash utilizzato è crittograficamente sicuro).

Fondamenti matematici[modifica]

La decrittazione del messaggio è assicurata grazie ad alcuni teoremi matematici, infatti dal calcolo noi otteniamo

Ma sappiamo che e che quindi, per il piccolo teorema di Fermat

e

Siccome e sono numeri diversi e primi, possiamo applicare il Teorema cinese del resto, ottenendo che

e quindi che

Esempio[modifica]

Ecco un esempio di criptazione e decriptazione RSA. I numeri scelti sono volutamente primi piccoli, ma nella realtà sono usati numeri dell'ordine di .

Generazione delle chiavi[modifica]

  1. e ,
  2. , ed è coprimo per 3120 (in questo caso è primo, ma in generale non è necessario)
  3. infatti poiché con resto

Quindi abbiamo la chiave pubblica e la chiave privata .

Cifratura e decifratura[modifica]

Prendiamo ora in considerazione il messaggio e cifriamolo per ottenere il messaggio cifrato , ovviamente possiamo usare i 3233 e 17, ma non 2753 che fa parte della chiave privata.

E ora decifriamo per ottenere ; qui utilizzeremo 2753, componente essenziale della chiave privata.