El Rijndael S-box es un cuadro de sustitución ( tabla de búsqueda ) utilizado en el cifrado Rijndael, en el que se basa el algoritmo criptográfico del Estándar de cifrado avanzado (AES) . [1]
La S-box asigna una entrada de 8 bits, c , a una salida de 8 bits, s = S ( c ) . Tanto la entrada como la salida se interpretan como polinomios sobre GF(2) . Primero, la entrada se asigna a su inverso multiplicativo en GF(2 8 ) = GF(2) [ x ]/( x 8 + x 4 + x 3 + x + 1 ) , el campo finito de Rijndael . El cero, como identidad, está mapeado a sí mismo. Esta transformación se conoce como Nyberg S-box en honor a su inventora Kaisa Nyberg . [2] Luego, el inverso multiplicativo se transforma utilizando la siguiente transformación afín :
donde [ s 7 , ..., s 0 ] es la salida del S-box y [ b 7 , ..., b 0 ] es el inverso multiplicativo como vector.
Esta transformación afín es la suma de múltiples rotaciones del byte como vector, donde la suma es la operación XOR:
donde b representa el inverso multiplicativo, es el operador XOR bit a bit , es un desplazamiento circular bit a bit hacia la izquierda y la constante 63 16 = 01100011 2 se proporciona en hexadecimal .
Una formulación equivalente de la transformación afín es
donde s , b y c son matrices de 8 bits, c es 01100011 2 y los subíndices indican una referencia al bit indexado. [3]
Otro equivalente es:
donde es la multiplicación polinomial de y se toma como matrices de bits.
La S-box inversa es simplemente la S-box ejecutada al revés. Por ejemplo, la caja S inversa de b8 16 es 9a 16 . Se calcula calculando primero la transformación afín inversa del valor de entrada, seguida de la inversa multiplicativa. La transformación afín inversa es la siguiente:
La transformación afín inversa también representa la suma de múltiples rotaciones del byte como un vector, donde la suma es la operación XOR:
donde está el operador XOR bit a bit , es un desplazamiento circular bit a bit hacia la izquierda y la constante 5 16 = 00000101 2 se proporciona en hexadecimal .
La Rijndael S-box fue diseñada específicamente para ser resistente al criptoanálisis lineal y diferencial . Esto se hizo minimizando la correlación entre transformaciones lineales de bits de entrada/salida y, al mismo tiempo, minimizando la probabilidad de propagación de la diferencia.
La Rijndael S-box se puede reemplazar en el cifrado Rijndael, [1] lo que derrota la sospecha de una puerta trasera integrada en el cifrado que explota una S-box estática. Los autores afirman que es probable que la estructura de cifrado de Rijndael proporcione suficiente resistencia contra el criptoanálisis diferencial y lineal incluso si se utiliza una caja S con propiedades "promedio" de correlación/diferencia de propagación (cf. las propiedades "óptimas" de la caja S de Rijndael ).
El siguiente código C calcula la S-box:
#incluir <stdint.h> #define ROTL8(x,shift) ((uint8_t) ((x) << (shift)) | ((x) >> (8 - (shift))))void inicialize_aes_sbox ( uint8_t sbox [ 256 ]) { uint8_t p = 1 , q = 1 ; /* invariante de bucle: p * q == 1 en el campo de Galois */ do { /* multiplicar p por 3 */ p = p ^ ( p << 1 ) ^ ( p & 0x80 ? 0x1B : 0 ); /* divide q entre 3 (es igual a multiplicación por 0xf6) */ q ^= q << 1 ; q ^= q << 2 ; q ^= q << 4 ; q ^= q & 0x80 ? 0x09 : 0 ; /* calcular la transformación afín */ uint8_t xformed = q ^ ROTL8 ( q , 1 ) ^ ROTL8 ( q , 2 ) ^ ROTL8 ( q , 3 ) ^ ROTL8 ( q , 4 ); sbox [ p ] = xformed ^ 0x63 ; } mientras ( p ! = 1 ); /* 0 es un caso especial ya que no tiene inverso */ sbox [ 0 ] = 0x63 ; }