Rijndael key schedule

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

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.

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 è 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}

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]

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]