title: Rijndael key schedule
text: # 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.
  