domingo, 14 de abril de 2013

AES (Advanced Encryption Standard)

AES (Advanced Encryption Standard) es un algoritmo de cifrado por bloques, los datos se dividen en segmentos de 16 bytes (128 bits) y cada segmento se puede ver como un bloque o matriz de 4x4 bytes al que se le llama estado.


Por ser simétrico, utiliza la misma clave para encriptar y para desencriptar, realiza un número fijo de rondas que depende del tamaño de la clave:


A continuación se explicará el proceso de cifrado y descifrado, al final se encuentran anexas las tablas utilizadas para estos procesos. Se recomienda tener a la mano la última imagen de las matrices resultantes de todo el proceso de cifrado, que servirá como guía (tanto para cifrado como para descifrado), ya que por la gran cantidad de operaciones del algoritmo, es fácil perderse.

ALGORITMO DE CIFRADO



Considerando AES-128:

Partiendo de una clave inicial de 16 bytes (128 bits), que se puede ver como una matriz de 4x4, se generan 10 claves, estas claves junto con la clave inicial son denominadas subclaves.


1. Calculo de subclaves


1.1 Para calcular la primera columna de la subclave se toma la última columna de la subclave anterior (en este caso la clave inicial) y se aplica una operación llamada Rotword que consiste en realizar una rotación del primer byte hacia el último lugar en la columna.



1.2 A la columna resultante, se aplica una operación llamada SubBytes que consiste en reemplazar cada byte de la columna ya rotada por un byte almacenado en una tabla llamada S-Box, para obtener la transformación S-Box de un byte se toman los primeros 4 bits como el índice de la fila de la tabla y los segundos 4 como índice de la columna de la tabla:


1.3 Al resultado se le aplica un XOR byte a byte con la columna 4 posiciones atrás (en este caso la primer columna de la clave inicial) y un XOR byte a byte con una columna de una tabla RCON, por ser la primer subclave la que estamos calculando se toma la primer columna de la tabla RCON, para las siguientes subclaves se toma la próxima columna no utilizada de esta tabla:


1.4 Para calcular las tres columnas siguientes se hace un XOR entre la columna anterior y la columna de cuatro posiciones atrás:


1.5 Y se procede de la misma forma para calcular las siguientes subclaves. Al finalizar se tendrán 11 subclaves, cada una de estas subclaves se aplica en una de las rondas de operaciones.

2. Rondas y operaciones



El algoritmo realiza 11 rondas, donde en cada ronda se aplica una subclave diferente. Las 11 rondas se pueden clasificar en 3 tipos: 

  • 1 ronda inicial (se aplica la subclave inicial). 
  • 9 rondas estándar (se aplican las 9 subclaves siguientes). 
  • 1 ronda final (se aplica la última subclave). 

Las operaciones que realiza el algoritmo dentro de las rondas se reducen a 4 operaciones básicas: 

  • SubBytes. 
  • ShiftRows. 
  • MixColumns. 
  • AddRoundKey.

2.1 Ronda inicial

La ronda inicial aplica solamente la operación AddRoundKey que no es más que un XOR byte a byte entre el bloque a cifrar y la clave inicial.


2.2 Rondas estándar

Luego se realizan 9 rondas estándar donde cada ronda consiste en las siguientes operaciones:

2.2.1 SubBytes: Cada byte de la matriz de estado se reemplaza por otro valor de acuerdo a la tabla de sustitución de bytes S-Box ya vista en el cálculo de las subclaves.

2.2.2 ShiftRows: En cada fila de la matriz SubBytes, a excepción de la primera, se rotan circularmente hacia la izquierda los bytes, en la segunda fila se rotan una posición, en la tercera dos posiciones y en la cuarta tres posiciones.



2.2.3 MixColumns: A cada columna de la matriz ShiftRows se le aplica una transformación lineal, esto es multiplicarlo por una matriz ya predeterminada en el campo GF.


Suponiendo que la matriz ShifRows es:



Y la matriz del campo GF es:



Los valores de MixColumns son:


c1= (b1 * 2) XOR (b2 * 3) XOR (b3 * 1) XOR (b4 * 1)
c2= (b1 * 1) XOR (b2 * 2) XOR (b3 * 3) XOR (b4 * 1)
c3= (b1 * 1) XOR (b2 * 1) XOR (b3 * 2) XOR (b4 * 3)
c4= (b1 * 3) XOR (b2 * 1) XOR (b3 * 1) XOR (b4 * 2)

c5= (b5 * 2) XOR (b6 * 3) XOR (b7 * 1) XOR (b8 * 1)
c6= (b5 * 1) XOR (b6 * 2) XOR (b7 * 3) XOR (b8 * 1)
c7= (b5 * 1) XOR (b6 * 1) XOR (b7 * 2) XOR (b8 * 3)
c8= (b5 * 3) XOR (b6 * 1) XOR (b7 * 1) XOR (b8 * 2)

c9= (b9 * 2) XOR (b10 * 3) XOR (b11 * 1) XOR (b12 * 1)
c10= (b9 * 1) XOR (b10 * 2) XOR (b11 * 3) XOR (b12 * 1)
c11= (b9 * 1) XOR (b10 * 1) XOR (b11 * 2) XOR (b12 * 3)
c12= (b9 * 3) XOR (b10 * 1) XOR (b11 * 1) XOR (b12 * 2)

c13= (b13 * 2) XOR (b14 * 3) XOR (b15 * 1) XOR (b16 * 1)
c14= (b13 * 1) XOR (b14 * 2) XOR (b15 * 3) XOR (b16 * 1)
c15= (b13 * 1) XOR (b14 * 1) XOR (b15 * 2) XOR (b16 * 3)
c16= (b13 * 3) XOR (b14 * 1) XOR (b15 * 1) XOR (b16 * 2)


Pero para obtener esos resultados se debe hacer lo siguiente:
  • Para resolver la operación "*" primero tenemos que sustituir cada uno de los operadores por sus valores correspondientes en la tabla llamada "tabla L". 
c1= (d4 * 02) XOR (bf * 03) XOR (5d) XOR (30) 
  • Se debe realizar la suma hexadecimal de los operadores una vez sustituidos por sus valores correspondientes en la tabla L. 
  • El resultado de la suma debe ser sustituido por su valor correspondiente en la tabla llamada "tabla E", ese será el resultado final. Si la suma hexadecimal fuera mayor a FF, hay que restarle FF tantas veces hasta que el resultado sea menor o igual a FF. 

Tabla L
Suma
Tabla E
D4
41
41+19 = 5A
B3
02
19
BF
9D
9D+01 = 9E
DA
03
01
5D
88
88+00 = 88
5D
01
00
30
65
65+00 = 65
30
01
00

c1= (b3) XOR (da) XOR (5d) XOR (30) = 04

2.2.4 AddRoundKey: Se aplica la misma operación que en la ronda inicial pero utilizando la matriz MixColumns y la subclave correspondiente (un XOR), el resultado es la matriz del siguiente estado.

2.3 Ronda final

Por último la ronda final consiste en las operaciones de:

  • SubBytes: igual al de la ronda estándar.
  • ShiftRows: igual al de la ronda estándar.
  • AddRoundKey: se utiliza la matriz ShiftRows y la última subclave (un XOR).
El resultado de la operación de AddRoundKey es el bloque cifrado.

ALGORITMO DE DESCIFRADO


El proceso de descifrado aplica las mismas operaciones que el cifrado pero de forma inversa utilizando las mismas subclaves ya generadas, además se utiliza una matriz distinta en la operación MixColumns que es la inversa de la transformación lineal aplicada en el proceso de cifrado.

1. Primero se deben obtener las matrices de la ronda final.

1.1 Obtener la Matriz ShiftRows haciendo un XOR del bloque cifrado con la última subclave.

1.2 Obtener la Matriz SubBytes (S’) realizando la operación de InvShiftRows a la matriz ShiftRows (S).



1.3 Obtener la matriz de estado realizando la operación de InvSubBytes a la matriz SubBytes, (mismo proceso que la operación SubBytes, con las tablas L y E pero utilizando la tabla Inverse S-box).


2. Obtener las matrices de las rondas estándar.

2.1. Obtener la matriz MixColumns haciendo un XOR de la matriz de estado obtenida en la ronda anterior con la subclave de la ronda actual.

2.2. Obtener la matriz ShiftRows, realizando la operación de invMixColumns a la matriz mixColumns. El proceso es igual al de la operación MixColumns utilizada en el cifrado, lo único que cambia es la matriz del campo GF:



Por ejemplo:

c1= (47 * 0E) XOR (37 * 0B) XOR (94 * 0D) XOR (ED * 09) 


Tabla L
Suma
Simplific
Tabla E
47
94
94+DF = 173
74
87
0E
DF
37
24
24+68 = 8C
8C
FA
0B
68
94
EB
EB+EE = 1D9
DA
3E
0D
EE
ED
99
99+C7 = 160
61
C4
09
C7

c1= (87) XOR (FA) XOR (3E) XOR (C4) = 87 


2.3. Obtener la Matriz SubBytes realizando la operación de InvShiftRows a la matriz ShiftRows.

2.4. Obtener la matriz de estado realizando la operación de InvSubBytes a la matriz SubBytes.

3. Obtención del bloque descifrado (bloque del mensaje original).

Se realiza un XOR entre la clave original y la última matriz de estado obtenida en las rondas estándar.

ANEXOS















REFERENCIAS:


No hay comentarios:

Publicar un comentario