# S-box del Rijndael

L'S-box è utilizzata nell'algoritmo crittografico Rijndael (alias AES).

## L'S-box

Dopo che la moltiplicazione di matrici è stata completata, viene eseguito un OR esclusivo fra il numero decimale "99" (0x63 in notazione esadecimale, "1100011" in notazione binaria, "11000110" come stringa di bit con il bit meno significativo in prima posizione). Questa operazione genera la seguente S-Box, che è rappresentata in notazione esadecimale: :
| | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
| 00 | 63 | 7c | 77 | 7b | f2 | 6b | 6f | c5 | 30 | 01 | 67 | 2b | fe | d7 | ab | 76 |
| 10 | ca | 82 | c9 | 7d | fa | 59 | 47 | f0 | ad | d4 | a2 | af | 9c | a4 | 72 | c0 |
| 20 | b7 | fd | 93 | 26 | 36 | 3f | f7 | cc | 34 | a5 | e5 | f1 | 71 | d8 | 31 | 15 |
| 30 | 04 | c7 | 23 | c3 | 18 | 96 | 05 | 9a | 07 | 12 | 80 | e2 | eb | 27 | b2 | 75 |
| 40 | 09 | 83 | 2c | 1a | 1b | 6e | 5a | a0 | 52 | 3b | d6 | b3 | 29 | e3 | 2f | 84 |
| 50 | 53 | d1 | 00 | ed | 20 | fc | b1 | 5b | 6a | cb | be | 39 | 4a | 4c | 58 | cf |
| 60 | d0 | ef | aa | fb | 43 | 4d | 33 | 85 | 45 | f9 | 02 | 7f | 50 | 3c | 9f | a8 |
| 70 | 51 | a3 | 40 | 8f | 92 | 9d | 38 | f5 | bc | b6 | da | 21 | 10 | ff | f3 | d2 |
| 80 | cd | 0c | 13 | ec | 5f | 97 | 44 | 17 | c4 | a7 | 7e | 3d | 64 | 5d | 19 | 73 |
| 90 | 60 | 81 | 4f | dc | 22 | 2a | 90 | 88 | 46 | ee | b8 | 14 | de | 5e | 0b | db |
| a0 | e0 | 32 | 3a | 0a | 49 | 06 | 24 | 5c | c2 | d3 | ac | 62 | 91 | 95 | e4 | 79 |
| b0 | e7 | c8 | 37 | 6d | 8d | d5 | 4e | a9 | 6c | 56 | f4 | ea | 65 | 7a | ae | 08 |
| c0 | ba | 78 | 25 | 2e | 1c | a6 | b4 | c6 | e8 | dd | 74 | 1f | 4b | bd | 8b | 8a |
| d0 | 70 | 3e | b5 | 66 | 48 | 03 | f6 | 0e | 61 | 35 | 57 | b9 | 86 | c1 | 1d | 9e |
| e0 | e1 | f8 | 98 | 11 | 69 | d9 | 8e | 94 | 9b | 1e | 87 | e9 | ce | 55 | 28 | df |
| f0 | 8c | a1 | 89 | 0d | bf | e6 | 42 | 68 | 41 | 99 | 2d | 0f | b0 | 54 | bb | 16 |
L'S-box è generata determinando l'inverso moltiplicativo di un numero appartenente al campo finito del Rijndael (lo zero, che non ha inversi, è impostato a zero). L'inverso moltiplicativo è poi trasformato usando la seguente trasformazione affine:
    ${\begin{bmatrix}1&0&0&0&1&1&1&1\\1&1&0&0&0&1&1&1\\1&1&1&0&0&0&1&1\\1&1&1&1&0&0&0&1\\1&1&1&1&1&0&0&0\\0&1&1&1&1&1&0&0\\0&0&1&1&1&1&1&0\\0&0&0&1&1&1&1&1\end{bmatrix}}{\begin{bmatrix}x_{0}\\x_{1}\\x_{2}\\x_{3}\\x_{4}\\x_{5}\\x_{6}\\x_{7}\end{bmatrix}}+{\begin{bmatrix}1\\1\\0\\0\\0\\1\\1\\0\end{bmatrix}}$
dove [x$_0$, ..., x$_7$] è l'inverso moltiplicativo espresso come vettore.
La moltiplicazione di matrici può essere calcolata con il seguente algoritmo:
* immagazzinare l'inverso moltiplicativo del numero di ingresso in 2 variabili temporanee ad 8 bit senza segno s e x;
* ruotare s di 1 bit a sinistra; se il valore di s aveva il bit più alto (l'ottavo da destra) impostato a "1", impostare il bit più basso di s ad "1", altrimenti a "0";
* OR esclusivo fra x ed s, immagazzinando il risultato in x;
* per 3 iterazioni: ripetere i punti 2. e 3. (i punti 2. e 3. saranno eseguiti 4 volte in totale);
* x conterrà adesso il risultato della moltiplicazione
Le colonne sono determinate dal nibble meno significativo, le righe sono determinate dal nibble più significativo. Ad esempio, il valore 0x9a è convertito in 0xb8. Da notare che l'inverso moltiplicativo di 0x00 è definito come sé stesso.

## S-box invertita

La tabella seguente rappresenta l'S-box invertita del Rijndael: :
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f |
L'S-box invertita è semplicemente l'S-box eseguita alla rovescia: ad esempio, l'S-box invertita di 0xdb è 0x9f. Viene calcolata computando prima la trasformazione affine inversa del valore di ingresso e poi l'inverso moltiplicativo. La trasformata affine inversa è definita come segue:
    ${\begin{bmatrix}0&0&1&0&0&1&0&1\\1&0&0&1&0&0&1&0\\0&1&0&0&1&0&0&1\\1&0&1&0&0&1&0&0\\0&1&0&1&0&0&1&0\\0&0&1&0&1&0&0&1\\1&0&0&1&0&1&0&0\\0&1&0&0&1&0&1&0\end{bmatrix}}{\begin{bmatrix}x_{0}\\x_{1}\\x_{2}\\x_{3}\\x_{4}\\x_{5}\\x_{6}\\x_{7}\end{bmatrix}}+{\begin{bmatrix}1\\0\\1\\0\\0\\0\\0\\0\end{bmatrix}}$

## Specifiche progettuali

L'S-box del Rijndael è stata progettata specificatamente per risultare resistente alla crittoanalisi differenziale e lineare: ciò si è ottenuto minimizzando la correlazione tra le trasposizioni lineari di bit di input/output ed al tempo stesso minimizzando la probabilità di far propagare una differenza. Inoltre, per irrobustire dell'S-box contro gli attacchi algebrici è stata aggiunta la trasformazione affine.
Nel caso si sospetti la presenza di una trap door all'interno del cifrario, l'S-box corrente può essere sostituita da un'altra. Gli autori affermano che la struttura del cifrario Rijndael dovrebbe offrire abbastanza resistenza alla crittoanalisi lineare e differenziale da resistere a questi tipi di attacco anche se venisse utilizzata una S-box che presentasse o una correlazione "media" o la propagazione di differenze.

## Una equazione alternativa per la Trasformazione Affine

Una equazione alternativa per la trasformazione affine è:
    $b'_{i}=b_{i}\oplus b_{(i+4)mod8}\oplus b_{(i+5)mod8}\oplus b_{(i+6)mod8}\oplus b_{(i+7)mod8}\oplus c_{i}$
dove b', b e c sono matrici ad 8 bit e c è "01100011".

### Implementazioni

Quella che segue è un'implementazione in Java del precedente algoritmo: