In queste slide presentiamo brevemente ECHO, un algoritmo proposto per la gara di SHA3. Questa trattazione non vuole essere completa ed esaustiva ma solo una introduzione all'algoritmo.
3. Cos’è ECHO ECHO è un algoritmo candidato per SHA3 Disegnato dal Cryptographic Research Group agli Orange Labs Ispirato ad AES Attualmente accettato per il round 2 della competizione
4. Il design di ECHO Richieste del NIST: Mantenimento delle proprietà di SHA2: Dimensione dell’input (224,256,384,512bits) Preimageand second-preimageresistence Messagedigest di 224,256,384 e 512 bits Lunghezza massima del messaggio di almeno 2^64bits Implementabile ed efficiente sia hardware che in software
5. Il design di ECHO La filosofia degli autori: Semplicità: Un algoritmo semplice è anche facile da analizzare Riutilizzo di AES: Usa AES nella versione a 128bit. Questo permetterà di sfruttare future implementazioni di tale algoritmo oppure di trarre beneficio dal supporto offerto dai micriprocessori
7. Domain extention (1/2) In base alla lunghezza desiderata dell’output vengono utilizzate due diverse funzioni di compressione: Compress512 per hash di lunghezza di 224bit o 256bit Compress1024 per hash di lunghezza di 384bit o 512bit A ogni iterazione la funziona di compressione prendere in input i seguenti valori: Il valore corrente della chainingvariable , Vi-1 ,di lunghezza Csize Il blocco del messaggio da processare, che ha lunghezza Msize = 2048 – Csize Il numero totale di unpaddedmessagebits alla fine di questa iterazione, Ci Il Salt
10. 1)Inizializzazione La fase di inizializzazione consiste in: Assegnare al contatore C il valore 0 Assegnare alla chainingvariable un valore costante in base alla dimensione dell’hash che si vuole ottenere
11. 2)Messagepadding Serve per ottenere un messaggio multiplo di Msize Viene aggiunto un bit “1” a fine messaggio e X bit “0” con X = Msize – ((Hashlength + 144) modMsize) - 1
12. 3)Compressione (1/2) Il Messaggio + padding ottenuto viene suddiviso in t blocchi da MsizeconMsizeche vale: 1536 bit se 224≤Hsize ≤256 1024 bit altrimenti Viene settata la compressionfunction da utilizzare Comincia iterazione su ogni blocco: Input: Vi = compressfunction(Vi-1, Mi,Ci,SALT) 1. Suddivido il blocco Mi in blocchi da 128 bit. 2. Vi-1 suddiviso in n stringhe da 128 bit, con n che vale: 224≤Hsize ≤256: 4 stringhe (Vi=512) 384≤Hsize ≤512: 8 stringhe (Vi=1024)
13. 3)Compressione (2/2) Vengono eseguite le seguenti operazioni: Mixing Chaining 8 round (10 se compress1024 ) da 3 passi ciascuno: BIG.SubWords BIG.ShiftRow BIG.MixColumns BIG.Final
14. Mixing ChainingVariable Viene creata una matrice di stato S di dimensione 4x4 nella quale viene disposta la chainingvariable e il messaggio. Nel caso 224≤Hsize ≤256: la prima colonna di chainingvariable e le restante di messaggio. Nel caso 384≤Hsize ≤512: nelle prime due colonne la chainingvariablee nelle due restanti il messaggio. La struttura su cui si basa e il funzionamento ha delle analogie con AES.
15. BIG.SubWords(S,SALT,K) Sia k un contatore interno che inizialmente è impostato al valore Ci. Siano k1 e k2 così definiti: k1 = k||64 bit a 0 k2 = SALT Per ogni word da 128 bit di S viene eseguita la seguente operazione: wi’ = AES(AES(wi,k1),k2) k viene incrementato
16. BIG.ShiftRow(S) Il funzionamento è analogo a quello di AES. In questa implementazione però lavora su word da 128bit e non su byte.
17. BIG.MixColumns(S) Anche queste operazione è analoga a quella che troviamo nell’algoritmo AES e ovviamente è esteso poiché lavora su una matrice più ampia. Le 4 colonne di word da 128bit vengono viste come 64 colonne da un byte ciascuna. A ciascuna di queste colonne viene applicato la trasformazione MixColumns presente in AES.
18. BIG.Final(S) Si occupa alla fine degli otto round di aggiornare la chainingvariablein modo che possa diventare l’input della successiva iterazione. In figura esempio di BIG.Final nella funzione compress512: w0 ,w1 ,…w15 : Matrice contenente gli output delle iterazioni precedenti m0 ,m1 ,…m12: Blocco del messaggio considerato. vi-1: chainingvariable presa in ingresso da questa iterazione
19. 4)Finalizzazione Finiti i blocchi, l’output della funzione hash sono gli Hsizebit più significativi della chainingvariable. Esempio con compress512: La chainingvariableha dimensione 512bit. Se si vuole ottenere un output di 224bit, è sufficiente prendere i 224 più significativi. Nel caso compress1024 la dimensione della chainingvariableè doppia ma il funzionamento è analogo. Si deduce che sono supportati anche dimensione di hash intermedi rispetto a quelli richiesti dal NIST.