AES-CMAC

Introduzione

Gli algoritmi AES-CMAC calcolano un codice MAC attraverso l'algoritmo di crittografia AES 128 [1].

Descrizione

Generazione delle sottochiavi

Data una chiave K, si generano due sottochiavi K1 e K2 con il seguente algoritmo. Si cifra la stringa, di lunghezza 128 bit, i cui bit hanno valore 0, ovvero 0x00000000000000000000000000000000 con la chiave K. Sia L la stringa di 128 bit ottenuta: se il bit più significativo di L ha valore 0 allora si effettua lo shift a sinistra di L di un bit. Questo valore è la sottochiave K1. Se invece il bit più significativo di L ha valore 1, allora si effettua lo shift a sinistra di L di un bit e questo valore viene combinato con l'operazione di xor con una stringa di 128 bit costante che ha valore 0x00000000000000000000000000000087. In altre parole, questa stringa ha 15 byte con valore 0x00 e il 16° byte ha valore 0x87, ovvero 10000111. Il valore così ottenuto è la sottochiave K1.

In formule si ha:
const_zero = 0x00000000000000000000000000000000
const = 0x00000000000000000000000000000087
L = AES(const_zero, K)
se MSB(L) = 0 allora K1 = L << 1
se MSB(L) = 1 allora K1 = const xor (L << 1)

La sottochiave K2 è ottenuta in modo analogo a partire dalla chiave K1: se il bit più significativo di K1 ha valore 0, allora K2 è ottenuta dallo shift a sinistra di un bit di K1, mentre se il bit più significativo di K1 ha valore 1 allora K2 è ottenuta dall'operazione di xor tra il valore di K1 a cui è effettuato lo shift di un bit a sinistra con la stringa costante precedente: 0x00000000000000000000000000000087.

se MSB(K1) = 0 allora K2 = K1 << 1
se MSB(K1) = 1 allora K2 = const xor (K1 << 1)

Elaborazione

I dati da elaborare, chiamati messaggio M, sono suddivisi in n blocchi M1, M2, …, Mn da 128 bit. Se la lunghezza totale del messaggio M è un multiplo di 128 bit, Mn avrà lunghezza pari a 128 bit, altrimenti avrà lunghezza inferiore.

Si genera una sequenza di valori M'1,M'2, …, M'n in questo modo:

M'1 = AES(M1, K), M'2 = AES(M2 xor M'1, K), …, M'n-1 = AES(Mn-1 xor Mn-2, K)

L'ultimo valore, M'n viene calcolato in modo diverso. Se il messaggio M ha una lunghezza multipla di 128 bit, allora Mn ha una lunghezza di 128 bit. M'n viene calcolato cifrando il valore ottenuto dall'operazione di xor tra Mn, M'n-1 e K1 ovvero M'n = AES(Mn xor M'n-1 xor K1, K)

Nel caso in cui la lunghezza di M non sia un multiplo di 128 bit, allora Mn avrà lunghezza inferiore a 128 bit. A Mn viene aggiunto il bit con valore 1 seguito da una sequenza di bit con valore 0, fino a raggiungere la lunghezza di 128 bit. Il valore di Mn che ne risulta viene combinato con una operazione di xor ai valori di M'n-1 e K2, ovvero M'n = AES(Mn xor M'n-1 xor K2, K).

aes-mac.png

Il valore di M'n è il MAC. È possibile considerare un gruppo di byte inferiore, ad esempio è stato proposto nella variante AES-CMAC-96 [2] l'impiego dei 96 bit più significativi. In ogni caso è consigliato impiegare almeno 64 bit.

Bibliography
1. IETF RFC 4493 "The AES-CMAC Algorithm", http://www.rfc-editor.org/rfc/rfc4493.txt
2. IETF RFC 4494 "The AES-CMAC-96 Algorithm and Its Use with IPsec", http://www.rfc-editor.org/rfc/rfc4494.txt
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License