Implementazione degli algoritmi SHA-3 nei sistemi embedded

Implementazione degli algoritmi SHA-3 nei sistemi embedded

SHA-3, la versione più recente del Secure Hash Algorithm le cui specifiche sono state ufficialmente rilasciate nel 2015, si differenzia in modo significativo rispetto alle precedenti versioni di algoritmi della stessa famiglia (SHA-1 e SHA-2). Scopriamo in questo articolo quali sono i concetti basilari dello standard SHA-3 (e della famiglia di algoritmi Keccak da cui discende), analizzando alcune implementazioni a livello hardware dell’algoritmo.

Introduzione

Il 2 ottobre 2012 l’ente governativo americano NIST (National Institute of Standards and Technology) selezionò (al termine di una competizione ufficiale durata anni) l'algoritmo Keccak come migliore implementazione del nuovo e futuro standard per la crittografia SHA-3. Il processo che ha portato alla scelta di un nuovo standard per le funzioni di hash ebbe inizio nel lontano 2007. In quel periodo, infatti, furono registrati un certo numero di attacchi e individuati punti di debolezza nei predecessori dello standard SHA-2 (più precisamente nell’MD5 e nell'SHA-1). Si temeva allora che le implementazioni maggiormente utilizzate dello standard SHA-2 (SHA-256 e SHA-512) prima o poi sarebbero diventate vulnerabili o si sarebbe giunti alla “rottura” del codice crittografico, come avvenuto ad esempio per l’MD5. Poiché la scelta e la definizione di una primitiva per la crittografia richiede parecchio tempo, il NIST avviò il processo di creazione dell'SHA-3 con il chiaro intento di trovare un valido sostituto per l'SHA-2. In realtà le cose andarono diversamente e lo standard SHA-2 si dimostrò più robusto di quanto inizialmente ipotizzato. Con l’obiettivo dichiarato di anteporre a ogni cosa la robustezza, altri aspetti come prestazioni, velocità di esecuzione e facilità di implementazione a livello software passarono in secondo piano. Alla fine, la scelta del NIST è ricaduta sull’algoritmo Keccak, che presentava profonde differenze sia rispetto all'SHA-2 che all'AES. In questo modo si riteneva di ridurre i rischi di una "rottura" simultanea di più algoritmi. Keccak è un algoritmo sviluppato da Guido Bertoni, Joan Daemen (uno dei creatori di AES), Michaël Peeters e Gilles Van Assche. Dobbiamo a questo punto ritenere l'SHA-2 come non più sicuro? Assolutamente no, SHA-2 è tuttora valido e molto sicuro. Ci interessa, tuttavia, sapere che esiste una valida alternativa (con un maggiore grado di sicurezza) all'SHA-2 e questa si chiama SHA-3. In Figura 1 possiamo osservare una rappresentazione schematica del processo di hashing utilizzato per la validazione di una transazione nell'ambito delle criptovalute (ad esempio nel caso del Bitcoin). L’algoritmo utilizzato in questo caso è l'SHA-256, una delle varianti dell'SHA-2. I dati in ingresso sono suddivisi in blocchi di 512 bit, mentre la funzione di compressione (evidenziata dai blocchi gialli) viene eseguita una volta per ogni blocco di ingresso, inclusi i risultati dell’iterazione precedente.

Figura 1: rappresentazione schematica di una singola iterazione della funzione SHA-256

Che importanza rivestono gli algoritmi di hash e dove vengono utilizzati? Dobbiamo anzitutto fare un richiamo alle funzioni di hash, perché è da qui che nasce tutto.

Funzioni di hash

Molti tra noi sanno che le funzioni di hash rivestono un’importanza notevole e strategica nel mondo delle criptovalute, basti pensare ad esempi come Bitcoin ed Ethereum. In realtà, le funzioni di hash sono ampiamente utilizzate in tutti i sistemi crittografici (servono ad esempio alla creazione della digital fingerprint) e costituiscono la base della crittografia moderna. Una funzione di hash può essere definita come una funzione in grado di mappare una quantità di dati di dimensione arbitraria su una quantità di dati di dimensione fissa. I dati in ingresso alla funzione di hash prendono il nome di preimage, mentre i dati in uscita sono chiamati semplicemente hash. Il processo svolto da una generica funzione di hash è schematizzato in Figura 2, dove la funzione è contraddistinta semplicemente con la lettera “h”. La dimensione del dato in uscita (“hash” in Figura 2) dipende dal particolare algoritmo utilizzato (nel caso dell'SHA-256, ad esempio, è pari a 256 bit).

Figura 2: schema a blocchi di una generica funzione di hash

Una particolare categoria di funzioni di hash è rappresentata dalle funzioni crittografiche di hash, le quali presentano caratteristiche peculiari atte a garantire un elevato grado di sicurezza alle piattaforme su cui si basano le criptovalute. Una funzione crittografica di hash è una funzione di hash monodirezionale che mappa dati di dimensione arbitraria su una stringa di bit di lunghezza prefissata. La sua natura intrinseca monodirezionale garantisce che non sia fattibile, dal punto di vista computazionale, ricreare i dati in ingresso conoscendo solo i dati in uscita. L’unico modo per risalire all’informazione originaria è quello di applicare un attacco forza bruta (brute force): poiché il numero di possibili casi da testare è elevatissimo, è semplice comprendere come questo sistema non sia ragionevolmente fattibile a livello pratico. Non solo: anche se si trovasse una combinazione di dati in ingresso in grado di generare lo stesso valore di hash, non si avrebbe la certezza che si tratti dei dati in ingresso originali. A questo proposito si usa anche dire che le funzioni di hash sono funzioni “molti a uno”. Quando si riescono a individuare due insiemi di dati in ingresso in grado di generare la stessa uscita, si è creata una “collisione di hash”. Maggiore è la sicurezza di una funzione di hash, minore è la probabilità di generare delle collisioni (in criptovalute come Ethereum le collisioni sono praticamente impossibili). Con riferimento alla funzione di hash “h” schematizzata in Figura 2, possiamo osservare un esempio di collisione nella situazione rappresentata in Figura 3. In questo caso la funzione di hash applicata ai due ingressi “Peter” e “Mary” produce lo stesso valore di hash (2) e si ha perciò collisione.

Figura 3: un esempio di collisione: due valori di ingresso producono lo stesso hash in uscita

Le funzioni crittografiche di hash possiedono cinque proprietà basilari:

  • determinismo: dato un messaggio in ingresso, questo produce sempre lo stesso valore di hash;
  • verificabilità: dato un ingresso qualsivoglia, il calcolo dell’hash deve essere efficiente, deve cioè avere una complessità di tipo lineare;
  • non correlazione: una piccola variazione (rappresentata anche da un solo bit) applicata al messaggio in ingresso deve modificare il valore di hash in modo così esteso che lo stesso non possa essere correlato all’hash prodotto dal messaggio originale;
  • irreversibilità: la possibilità di risalire al messaggio originale partendo dalla sola conoscenza dell’hash non deve essere fattibile a livello pratico, equivalente come detto all’applicazione del metodo brute force su tutti i possibili messaggi in ingresso;
  • protezione dalle collisioni: non deve essere fattibile produrre due differenti messaggi in ingresso che generino lo stesso hash in uscita.

La resistenza alle collisioni è particolarmente importante per evitare la falsificazione delle firme digitali utilizzate nella blockchain. La combinazione delle cinque proprietà precedentemente illustrate rende le funzioni crittografiche di hash particolarmente adatte per molteplici applicazioni nel campo della sicurezza informatica:

  • digital fingerprint;
  • rilevamento degli errori su blocchi di dati;
  • Proof of Work (PoW);
  • autenticazione;
  • generatori di numeri pseudo casuali;
  • generazione di identificatori univoci.

La nascita di SHA-3

Come anticipato in precedenza, il principale motivo che ha spinto alla definizione dello standard SHA-3 è imputabile alla debolezza dimostrata dalla precedente versione SHA-1 e dall’MD5. Poiché SHA-1 e SHA-2 condividono lo stesso engine (Merkle-Damgard) per processare i messaggi di testo, era lecito assumere che un attacco eseguito con successo all'SHA-1 avrebbe rappresentato una minaccia potenziale anche per l'SHA-2. Nel febbraio 2005, la ricercatrice cinese Xiaoyun Wang riuscì a produrre la "rottura" dell’algoritmo SHA-1, generando una collisione attraverso un attacco brute force di 269 cicli (per ciclo si intende la singola iterazione dell’algoritmo di hash). Altri ricercatori hanno successivamente stimato che impiegando dei server cloud si potrebbe ottenere una collisione dopo 261 cicli. Sino ad ora nessun attacco è ufficialmente riuscito a produrre una collisione completa con l’algoritmo SHA-2, ma è lecito aspettarsi che numerosi tentativi siano eseguiti operando nel completo anonimato. Questo è il motivo per cui il NIST ha organizzato una vera e propria gara per selezionare il migliore algoritmo conforme allo standard SHA-3. Il vincitore è stato Keccak, la cui implementazione con hash a 256 bit (Keccak256) è stata scelta dagli sviluppatori della criptovaluta Ethereum come funzione di hash. Nella competizione organizzata dal NIST, per poter essere elette a migliore implementazione dello standard SHA-3, le funzioni di hash candidate dovevano soddisfare i seguenti quattro requisiti: [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2852 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend