Rijndael key schedule

Da Wikipedia, l'enciclopedia libera.

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 2 = 00000010 =  0 x^7 + 0 x^6 + 0 x^5 + 0 x^4 + 0 x^3 + 0 x^2 + 1 x + 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).

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:

  1. I primi n byte della chiave estesa coincidono con la chiave primaria.
  2. L'indice di iterazione i di Rcon è inizializzato a 1
  3. 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:
      1. Creiamo una variabile temporanea t di 4 byte
      2. Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
      3. Eseguiamo il cuore del key scheduler (vedi sopra) su t, con i come indice di iterazione di Rcon
      4. Incrementiamo i di 1
      5. 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:
      1. Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
      2. 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:
      1. Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
      2. Applichiamo a ciascuno dei 4 byte di 't la S-box del Rijndael
      3. 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:
      1. Assegniamo a t il valore degli ultimi 4 byte precedentemente calcolati
      2. 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.

Voci correlate[modifica | modifica wikitesto]

Collegamenti esterni[modifica | modifica wikitesto]