La firma digitale

30 marzo 2006

La crittografia a chiave pubblica è ritenuta una delle più importanti intuizioni nel campo delle comunicazioni anche per il fatto che può essere utilizzata per risolvere il problema della firma digitale.

La firma digitale di un documento (per documento intendiamo qualsiasi cosa sia memorizzata con tecnologie informatiche e quindi trasmissibile tramite sistemi di comunicazione quali Internet) si pone di risolvere tre problemi (definiti come autenticazione e integrità dei dati):

  • che il destinatario possa verificare l’identità del mittente
  • che il mittente non possa disconoscere un documento da lui firmato
  • che il destinatario non possa inventarsi o modificare un documento firmato da qualcun altro

Per firmare un documento si utilizza come detto la crittografia a chiave pubblica, in una modalità che può essere definita inversa. Se un individuo cifra un messaggio con la sua chiave privata, quel messaggio cifrato potrà essere letto da tutte le persone che possiedono la sua chiave pubblica. Se queste riusciranno a decifrare il messaggio avranno la certezza che è stato inviato dal proprietario della chiave pubblica usata per la decifratura. Tutto è garantito dal principio base della crittografia asimmetrica, dal fatto cioè che la chiave segreta decifra solo ciò che è stato cifrato con la rispettiva chiave pubblica e viceversa.

Come si può notare la firma digitale non garantisce la segretezza del contenuto del documento, infatti tutti i possessori della chiave pubblica del mittente possono averne accesso. Il problema però è facilmente risolvibile in modo intuibile: è sufficiente crittografare il messaggio firmato con una delle tecniche viste fino a questo punto. Il ricevente non dovrà fare altro che decifrare il messaggio (in questo caso solo lui potrà farlo) e successivamente controllarne la firma.

I più attenti di voi avranno però notato una piccola incongruenza in quanto detto fino a questo momento. Parlando di crittografia a chiave pubblica avevamo sottolineato l’eccessiva lentezza del sistema, che ne rendeva sconsigliato l’utilizzo “esclusivo” per la quantità di dati generata e il tempo impiegato, e visto che le funzioni utilizzate sono le stesse, anche se in senso inverso, il problema continua a persistere. La soluzione consiste nel cifrare solo una piccola parte dell’intero messaggio. Ovviamente la parte di messaggio da cifrare non può essere scelta in modo qualsiasi, si utilizzano in pratica delle funzioni di Hash.

Funzioni di Hash

Una di hash, detta anche one way hash, trasforma un testo normale di lunghezza arbitraria in una stringa di lunghezza relativamente limitata. Questa stringa rappresenta una sintesi del messaggio (message digest) che non è altro che una vera e propria impronta digitale unica che viene definita valore di hash e che gode di tre importanti proprietà:

  • dato un messaggio si può facilmente calcolare il suo valore di hash
  • dato il valore di hash è impossibile risalire al messaggio (per questo one way hash)
  • non si possono generare due messaggi che abbiano la stessa sintesi. Sappiamo che questo non è praticabile ma in genere si intende che la probabilità di collisione (due messaggi con la stessa sintesi) deve essere molto bassa.

Solitamente per le impronte vengono utilizzati 128 bit, ma il valore può essere qualsiasi, tenendo conto che più basso è e più alta è la probabilità di collisione.

Per una dimostrazione forniamo 2 valori di hash ottenuti tramite l’algoritmo MD5 di cui parleremo tra poco, che estrae da input di qualunque dimensione valori di hash di 128 bit che possono essere rappresentati con 16 cifre esadecimali:

“a” –> 60B725F10C9C85C70D97880DFE8191B3
“Prova hashing per HTMLit” –> EFC56F6C520FFB812BB9854D093AD43

come si può notare, da stinge in ingresso di lunghezza significativamente differente, sono stati calcolati due valori hash della stessa lunghezza e apparentemente simili. La lunghezza dei valori di hash varia a seconda degli algoritmi. Quelli a 128 bit sono i più comuni, come il sopra citato MD5 del 1992.

L’algoritmo MD5 utilizza un buffer di 128 bit inizializzato a un valore prefissato. Divide il messaggio originale (visto come una stringa di bit) in blocchi di 512 bit aggiungendo se necessario dei bit aggiuntivi per arrivare a tale cifra e per ogni blocco di 128 bit vengono eseguiti quattro passi che consistono nel mescolare completamente i 512 bit in ingresso con il buffer di 128 fino a che tutti i blocchi in ingresso sono stati consumati. Alla fine il buffer sarà il message digest del testo in ingresso.

Tutte le lezioni

1 ... 8 9 10 ... 16

Se vuoi aggiornamenti su La firma digitale inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su La firma digitale

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy