2011-01-08 11 views
6

Prima di tutto: so che AES è un codice a blocchi e non una funzione di hashing. Tuttavia, sono bloccato con un microcontroller con poca RAM e memoria flash, e AES-128 è già implementato su di esso e utilizzato per lo scopo previsto - la crittografia.Utilizzo di AES per i controlli di integrità dei file, sostituzione di MD5

Sfortunatamente, dovrò anche implementare una funzione di hashing per i controlli di integrità dei file sullo stesso microcontrollore. Date le risorse limitate, mi chiedevo se sarebbe stato possibile utilizzare l'algoritmo AES esistente invece di MD5 per l'hashing. Una possibilità per farlo potrebbe essere:

  1. crittografare il primo blocco del file utilizzando una chiave fittizia (come tutti gli zeri per esempio)
  2. Encrypt il blocco successivo con il blocco cifrato precedente come chiave
  3. continuare in questo modo fino a quando tutti i dati del file è stato elaborato
  4. Usa l'ultimo blocco cifrato come l'hash

in teoria, credo che questo dovrebbe funzionare. Se ci sono dati corrotti ovunque nel file, ciò porterebbe a differenze in tutti i blocchi successivi.

Ora, la grande domanda è: quanto bene questo metodo si comporterebbe in termini di collisioni? O per dirla diversamente: come sarebbe distribuito l'ultimo "hash"?

+0

Mi chiedo se lo schema personalizzato occuperebbe meno spazio sul dispositivo rispetto all'implementazione di un algoritmo SHA o almeno di CRC32. –

+0

Poiché AES è già sul dispositivo, il mio schema personalizzato non richiederebbe quasi spazio aggiuntivo. CRC32 non è sufficiente, poiché il controllo di integrità viene utilizzato per convalidare gli aggiornamenti del firmware da caricare sul microcontrollore. Anche un singolo errore di bit renderebbe il dispositivo completamente inutilizzabile. – Makai

+0

Ricorda chi è il tuo avversario. Se si tratta solo di rumore di linea, allora l'uso di un controllo progettato per catturare il rumore di linea è probabilmente soddisfacente, dal momento che non hai avversari malevoli. Stai solo evitando di essere sfortunato, quindi una possibilità di corruzione 2^32 significa ancora che puoi aspettarti di aggiornare il firmware una volta al secondo per 68 anni senza mai vedere un problema. Suggerisco caldamente di confrontare almeno la tua soluzione AES-128 con un semplice CRC32 vecchio e di vedere se esiste una differenza misurabile contro la corruzione non dannosa. – me22

risposta

4

Sembra che tu voglia utilizzare AES-CMAC, un algoritmo di autenticazione basato su AES.

+0

Grazie per il suggerimento. Si consiglia di dare un'occhiata a http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/aes-hash/aeshash.pdf Questo descrive un metodo di hashing AES. Sfortunatamente, non è molto dettagliato. – Makai

+0

@Makai: C'è un link nella mia risposta con informazioni molto dettagliate. –

+0

AES-CMAC è davvero un'opzione valida, che non solo fornisce integrità, ma anche convalida di autenticità. Se ho ottenuto il principio correttamente, il concetto è simile al metodo che ho proposto, ad eccezione di XOR-ing il blocco corrente con il blocco precedentemente crittografato e applicando lo stesso codice a tutti i blocchi. Inoltre, c'è il meccanismo di riempimento che si basa sui tasti secondari calcolati. Mi chiedo ancora come questo metodo si paragona a MD5 in termini di controlli di integrità ... – Makai

1

Più enfaticamente è possibile eseguire una funzione hash da AES. In effetti, un numero di richieste per il concorso NIST SHA3, che deciderà sulla prossima funzione di hash approvata dal governo degli Stati Uniti, fare exactly that.

Una funzione di hash tradizionale è solo uno cascaded compression function ed è facile da construct compression functions from block cyphers. (Alcune persone sono anche andate dall'altra parte e hanno utilizzato il block cypher out of SHA-2 per l'uso indipendente.)

È possibile, ovviamente, creare una funzione di hash corretta, ma se tutto ciò che serve è l'integrità del file, e quindi non bisogno di avere pre-resistenza, resistenza alle collisioni o tutte quelle altre proprietà che gli hash crittografici hanno contro avversari malevoli, quindi probabilmente puoi anche solo mettere il tuo chip AES in qualsiasi modalità di concatenamento che ha, alimentando il file come messaggio e utilizzare l'ultimo blocco come hash. (Basta scegliere valori fissi da usare per la chiave e IV. Nothing up my sleeve numbers che sembrano casuali ma non sono probabilmente buone scelte, come i primi 128 bit dopo il punto decimale in e e pi.)

0

L'algoritmo proposto non hanno una seconda resistenza pre-immagine (che implica anche che non ha resistenza di collisione), quindi non è un hash crittograficamente forte.

Se ho un messaggio P0 P1 P2 che hash per H, allora posso facilmente costruire un secondo messaggio Q0 Q1 Q2 QX che hash anche per H - scelgo Q0 Q1 Q2 arbitrariamente, quindi calcolare QX da decifrareH con l'apposita chiave (la crittografia di Q2).

Problemi correlati