Rijndael key schedule
AES (Rijndael) usa un key schedule per espandere una chiave primaria corta in un certo numero di chiavi di ciclo differenti. Questo metodo è noto con il nome key schedule di Rijndael.
Operazioni comuni
[modifica | modifica wikitesto]Il key schedule di Rijndael utilizza un numero di operazioni comuni che vengono illustrate prima di descrivere il key schedule vero e proprio.
Rotate
[modifica | modifica wikitesto]L'operazione Rotate prende una parola di 32-bit come questa (in esadecimale):
1D 2C 3A 4F
e la ruota di otto bit verso sinistra, in modo che gli otto bit più a sinistra "si avvolgano" e diventino gli otto bit più a destra del risultato.
2C 3A 4F 1D
Rcon
[modifica | modifica wikitesto]Rcon è quello che la documentazione del Rijndael chiama l'elevamento a potenza di 2 per un valore specificato dall'utente. Quest'operazione non è eseguita sugli interi regolari, ma nel campo finito di Rijndael. In forma polinomiale, possiamo scrivere 2 come , e calcolare
in o equivalentemente,
in .
Per esempio, rcon(1) = 1, rcon(2) = 2, rcon(3) = 4, e rcon(9) è il numero esadecimale 0x1b (27 in decimale).
Rcon[256] = { 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d}
S-box
[modifica | modifica wikitesto]Il key schedule usa le S-box del Rijndael.
Il cuore del Key schedule
[modifica | modifica wikitesto]Questa operazione viene utilizzata come un ciclo interno nel key schedule ed esegue i seguenti passaggi:
- L'input è una parola di 32 bit e un numero di iterazione i. L'output è una parola di 32 bit.
- La parola in input viene copiata nell'output.
- Si applica la funzione Rotate definita sopra per ruotare l'output di otto bit verso sinistra
- Si applica la S-box di Rijndael su tutti e quattro i singoli byte della parola di output
- Solo sul primo byte della parola di output, si applica l'OR esclusivo tra il byte e Rcon(i).
Il key schedule
[modifica | modifica wikitesto]Costanti
[modifica | modifica wikitesto]Siccome i key schedule per chiavi di criptatura da 128 bit, 192 bit o 256 bit sono molto simili, cambiano esclusivamente dei valori costanti, definiamo le seguenti costanti:
- n ha valore 16 per chiavi da 128 bit, 24 per chiavi da 192 bit e 32 per chiavi da 256 bit
- b ha valore 176 per chiavi da 128 bit, 208 per chiavi da 192 bit e 240 per chiavi da 256 bit
Descrizione del Key schedule
[modifica | modifica wikitesto]Il key schedule di Rijndael funziona come segue:
- I primi n byte della chiave estesa coincidono con la chiave primaria.
- L'indice di iterazione i di Rcon è inizializzato a 1
- Finché non abbiamo tutti i b byte della chiave estesa, eseguiamo i seguenti passaggi, che generano n byte aggiuntivi della chiave estesa ogni volta:
- Eseguiamo i seguenti passaggi per creare 4 byte della chiave estesa:
- Creiamo una variabile temporanea t di 4 byte
- Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
- Eseguiamo il cuore del key scheduler (vedi sopra) su t, con i come indice di iterazione di Rcon
- Incrementiamo i di 1
- Calcoliamo l'OR esclusivo tra t e il primo blocco di 4 byte degli ultimi n byte generati della chiave estesa. Questi diventano i nuovi 4 byte della chiave estesa
- Ora eseguiamo per tre volte i seguenti passaggi per calcolare ulteriori 12 byte della chiave estesa:
- Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
- Calcoliamo l'OR esclusivo tra t e il primo blocco di 4 byte degli ultimi n byte generati della chiave estesa. Questi diventano i nuovi 4 byte della chiave estesa
- Se utilizziamo una chiave primaria da 256 bit, dobbiamo eseguire i seguenti passaggi per calcolare i successivi 4 byte della chiave estesa:
- Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
- Applichiamo a ciascuno dei 4 byte di t la S-box del Rijndael
- Calcoliamo l'OR esclusivo tra t e il primo blocco di 4 byte degli ultimi n byte generati della chiave estesa. Questi diventano i nuovi 4 byte della chiave estesa
- Se utilizziamo una chiave primaria da 128 bit, non dobbiamo eseguire i passaggi seguenti. Se utilizziamo una chiave primaria da 192 bit, dobbiamo eseguire i passaggi seguenti due volte. Se utilizziamo una chiave primaria di 256 bit, dobbiamo eseguire i passaggi seguenti per tre volte:
- Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
- Calcoliamo l'OR esclusivo tra t e il primo blocco di 4 byte degli ultimi n byte generati della chiave estesa. Questi diventano i nuovi 4 byte della chiave estesa.
- Eseguiamo i seguenti passaggi per creare 4 byte della chiave estesa:
Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Rijndael specification (PDF), su fp.gladman.plus.com. URL consultato il 10 febbraio 2009 (archiviato dall'url originale l'8 luglio 2007).
- (EN) FIPS PUB 197: the official AES standard (PDF), su csrc.nist.gov. URL consultato il 10 febbraio 2009 (archiviato dall'url originale il 7 aprile 2015).
- (EN) Description of Rijndael's key schedule, su samiam.org.