Applicazioni

La cifratura asimmetrica ha due applicazioni standard:

Digital Envelope

In teoria, per realizzare la segrtezza sarebbe sufficiente applicare un algoritmo asimmetrico (come RSA) cifrando con la chiave pubblica del destinatario e decifrando con la sua chiave privata. Tuttavia, coem già detto, le operazioni di dicfratura e decifratura con algoritmi asimmetrici hanno un costo computazionale relativamente elevato, e su un messaggio grande sarebbe necessario eseguirle per ciascuno dei potenzialmente tanti blocchi in cui il messaggio dovrebbe essere suddiviso, dunque ciò non è pratico. Allora, la digital envelope utilizza la cifratura simmetrica (più efficiente) per cifrare i messaggi e la cifratura asimmetrica per risolvere il problema della gestione della chiave segreta:

  1. Il mittente genera casualmente una chiave segreta $k$, detta chiave di sessione (session key)

  2. Il mittente cifra il messaggio $M$ che vuole inviare con un algoritmo simmetrico, usando la chiave $k$:

    $$ M=E_k(M) $$

  3. Il mittente cifra la chiave segreta con la chiave pubblica $KP$ del destinatario, ottenendo la cifratura $E_{KP}(k)$, che prende il nome di digital envelope

  4. Il mittente invia al destinatario il messaggio cifrato $C$ e la digital envelope $E_{KP}(k)$ cioè complessivamente invia $(C, E_{KP}(k))$.

  5. Il destinatario decifra la digital envelope con la propria chiave privata $KR$, ottenendo così la chiave segreta:

    $$ D_{KR}(E_{KP}(k))=k $$

  6. Il destinatario decifra il ciphertext $C$ con la chiave segreta $k$, ottenendo così il messaggio in chiaro $M$:

    $$ D_k(C)=D_k(E_k(M))=M $$

Uno svantaggio di questo schema è che, se ci sono errori di trasmissione o se il mittente ha usato la chiave pubblica errata, il destinatario se ne accorge solo dopo aver effettuato entrambe le operazioni di decifratura (i passi 5 e 6), quando il messaggio decifrato $M$ non risulta corretto, leggibile; non se ne può accorgere dopo aver decifrato solo la digital envelope (al passo 5) perchè la chiave $k$ è un numero del tutto casuale, non ha proprietà che permettono di determinare se sia corretta senza provare a usarla per decifrare $C$.

Firma digitale

Cifrare con la chiave privata del mittente e decifrare con la sua chiave pubblica fornisce, come detto in precedenza, una prova di autenticità del documento: il destinatario può verificare la provenienza e l’integrità del documento, cioè che esso sia stato generato/approvato dal mittente e che non sia stato successivamente modificato (se fosse cambiato anche solo 1 bit, dalla decifratura non si otterrebbe un messaggio leggibile). Tuttavia, coe nel caso della segertezza, cifrare e decifrare l’intero messaggio con un algoritmo asimmetrico sarebbe troppo costoso. La soluzione è generare un “riassunto” un’impronta del messaggio originale, chiamata message digest, e cifrare soltanto quella, ottenendo così una firma indipendente dal messaggio, che può essere accodata a esso o trasmessa separatamente. Con questo schema il messaggio rimane completamente in chiaro, leggibile da tutti, ma questo non è un problema perchè l’obiettivo della firma digitale è fornire l’autenticazione, non segretezza, e anche l’approccio di cifrare l’intero messaggio non fornirebbe segretezza, dato che la chiave necessaria per decifrare è pubblica.

Funzioni hash

Un message digest è un messaggio molto più piccolo dell’originale, ottenuto dal messaggio originale tramite una funzione one-way. Il tipo di funzioni one-way più usato a tale scopo sono le funzioni hash.

Una funzione hash è una funzione $H$ che mappa una stringa di bit di lunghezza arbitraria a una di lunghezza fissa (ad esempio 256 o 512 bit). Per l’uso in ambito critografico, una funzione hash deve essere: