# 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

Il key schedule di Rijndael utilizza un numero di operazioni comuni che vengono illustrate prima di descrivere il key schedule vero e proprio.

### Rotate

L'operazione Rotate prende una parola di 32-bit come questa (in esadecimale):
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.

### Rcon

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 $2=00000010=0x^{7}+0x^{6}+0x^{5}+0x^{4}+0x^{3}+0x^{2}+1x+0=x$, e calcolare
    ${\textrm {rcon}}(i)=x^{(i-1)}$
in $\mathbb {F} _{2^{8}}$ o equivalentemente,
    ${\textrm {rcon}}(i)=x^{(i-1)}\mod x^{8}+x^{4}+x^{3}+x+1$
in $\mathbb {F} _{2}[x]$.
Per esempio, rcon(1) = 1, rcon(2) = 2, rcon(3) = 4, e rcon(9) è il numero esadecimale 0x1b (27 in decimale).

### S-box

Il key schedule usa le S-box del Rijndael.

### Il cuore del Key schedule

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
### Costanti

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

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.