Meccanismo di incapsulamento della chiave
# Meccanismo di incapsulamento della chiave

Nei protocolli crittografici, un meccanismo di incapsulamento della chiave (o più semplicemente KEM, dall'inglese key encapsulation mechanism) viene utilizzato per proteggere il materiale della chiave simmetrica utilizzando algoritmi asimmetrici (a chiave pubblica). I cifrari a chiave pubblica non richiedono che gli utenti condividano un segreto prima di comunicare in modo sicuro, ma sono più inefficienti dei cifrari simmetrici per trasmettere messaggi lunghi. L'approccio tradizionale per risolvere questo problema consiste nel generare una chiave simmetrica casuale e inviarla utilizzando l'algoritmo di chiave pubblica scelto; questa chiave viene poi utilizzata per cifrare i messaggi successivi con un algoritmo simmetrico, più efficiente.

## Definizione formale

Un KEM è definito da una tupla di tre algoritmi probabilistici ${\textrm {KEM}}=({\texttt {Gen}},{\texttt {Encaps}},{\texttt {Decaps}})$ definiti come segue:

* ${\texttt {Gen}}(1^{n})$ è un algoritmo di generazione delle chiavi che prende in input il parametro di sicurezza $1^{n}$ e restituisce una coppia di chiavi $({\texttt {pk}},{\texttt {sk}})$
* ${\texttt {Encaps}}({\texttt {pk}})$ è un algoritmo di incapsulamento che prende in input la chiave pubblica ${\texttt {pk}}$ e restituisce un crittotesto $c$ e una chiave $k$
* ${\texttt {Decaps}}({\texttt {sk}},c)$ è un algoritmo che prende in input la chiave segreta ${\texttt {sk}}$ e un crittotesto $c$ e restituisce una chiave $k$

Un KEM così definito è corretto se per ogni coppia di chiavi $({\texttt {pk}},{\texttt {sk}})$ generate dall'algoritmo ${\texttt {Gen}}(1^{n})$, per ogni coppia $(c,k)$ generata da ${\texttt {Encaps}}({\texttt {pk}})$, si ha che ${\texttt {Decaps}}({\texttt {sk}},c)=k$.

Un modo molto semplice per ottenere un KEM è campionare una chiave in modo uniforme e utilizzare un cifrario a chiave pubblica per cifrarla.

## Esempio: RSA + AES

Usando la stessa notazione impiegata nell'articolo del sistema RSA, supponiamo che Alice abbia trasmesso la sua chiave pubblica $(n,e)$ a Bob, mantenendo segreta la sua chiave privata $d$. Bob deriva una chiave simmetrica M come $M=KDF(m)$, dove con $KDF$ si indica una funzione di derivazione della chiave (ad esempio, una funzione crittografica di hash); si noti che M potrebbe essere una chiave AES a 128 bit. Infine, Bob calcola il testo cifrato $c$ come segue:

    $c\equiv m^{e}{\pmod {n}}.$

Alice può ricavare $m$ da $c$ utilizzando la sua chiave privata $d$ dal seguente calcolo:

    $m\equiv c^{d}{\pmod {n}}.$

Dato $m$, Alice recupera la chiave M derivandola come $M=KDF(m)$.

A questo punto, Alice e Bob condividono una chiave segreta e possono iniziare a scambiarsi messaggi più lunghi e in modo efficiente.

