Progettazione di funzioni hash:
Senza perdita di generalità, supponiamo che $(Gen, h)$ sia tale che comprima $2n$ bit $\to$ $n$ bit
$\Rightarrow$ $(Gen, H)$ usando la trasformazione di Merkle-Damgard $x \in \{0,1\}^* \to y \in \{0,1\}^n$
Il messaggio $x$ è diviso in blocchi di $n$ bit $x_1,..,x_B$
Alla fine del messaggio viene aggiunto un extra blocco $x_{B+1}$ in cui viene codificato, sempre con $n$ bit, la lunghezza del messaggio $x$
Ad ogni passo della trasformata, viene utilizzata la funzione di compressione $h^s$ che prende in input il blocco di $n$ bit e il risultato $z_l$ prodotto dalla funzione di compressione precedente, ad eccezione del primo blocco che prende come secondo input un $IV$
Alla fine della trasformata si ottiene il valore hash per la stringa $x$
<aside> 💡
Sia $(Gen, h)$ una funzione hash con lunghezza fissa per input di lunghezza $2n$ e output di lunghezza $n$
Costruiamo la funzione hash $(Gen, H)$ come segue:
Se $(Gen, h)$ è resistente rispetto a collisioni allora anche $(Gen,H)$ lo è
Dimostrazione
Mostriamo che, per qualsiasi $s$, una collisione in $H^s$ dà una collisione in $h^s$
Siano $x$ ed $x'$ due stringhe differenti di lunghezza $L$ ed $L'$ tali che $H^s(x)=H^s(x')$ → $x= x_1..x_Bx_{B+1}$ e $x'= x'1..x'{B'}x'_{B'+1}$
Ci sono due casi da considerare: