Professional Documents
Culture Documents
SEGURIDAD EN COMPUTADORES
AES
Objetivo
Generalmente, los procesos de encriptación no son conocidos por los usuarios de los mismos.
Y, más aun, la algorítmica suele asociarse más bien a un “oscuro proceso” que no permite
análisis por ingeniería inversa. Las matemáticas no trivilaes (por ejemplo los Cuerpos Finitos)
generalmente hacen demasiado complicado entender qué hace exactamente el algoritmo de
encriptación.
Rijndael
Acrónimo formado por los nombres de sus dos autores Joan Daemen y Vincent Rijmen.
Trabajando en el COSIC lab (Bélgica) durante los años 1997-2000 los dos autores, diseñaron
un algoritmo de clave simétrica, y cifrado por bloques de tamaño variable (bloque mínimo: 128
bits). El algoritmo, tras un proceso de selección de cuatro años, se impuso como estándar de
encriptación para el FIPS en tres implementaciónes concretas: tamaño de bloque fijo de 128
bits, y tamaño de clave de 128, 192 o 256 bits.
La clave de cifrado será, en este caso una matriz de 32 bytes. (para AES-128)
Durante el proceso, será necesario calcular las sub-claves de cifrado. Este cálculo supone la
extensión de la clave de cifrado inicial hasta 11 sub-claves parciales, de igual tamaño, que irán
utilizándose durante las iteraciones del algoritmo.
El flujo del algoritmo comienza al realizar la primera iteración diferente al resto. Luego, nueve
iteraciones idénticas y finalmente la última iteración final, también distinta. Las operaciones que
se realizarán pueden verse a continuación.
Se observa una ronda inicial en la que únicamente se efectúa una
operación de RoundKey, entre matriz de estado y sub-clave (en éste punto
la matriz de estado coincide con el bloque a cifrar, y la sub-clave, coincide
con la clave de encriptación). Seguidamente se entra en un bucle de 9
iteraciones donde se repiten 4 procesos. Por último la última iteración no
efectúa la operación de MixColumns.
A lo largo de todo el proceso, el bloque de información a cifrar ira sufriendo cada operación y
para describir su estado en cada instante del proceso se define la matriz de estado. Llamada
State en el estándar, será la matriz que albergue los resultados parciales del proceso, mientras
éste avanza. Los métodos descritos en la figura anterior consisten en:
Cálculo de Sub-claves
Cada sub-clave presenta el mismo tamaño que la clave de cifrado y el cálculo para cada una
de las 10 sub-claves que se deben definir, se realiza de la siguiente manera:
Definamos una clave, a partir de la codificación ASCII (hex) de los siguientes caracateres:
UCM[esc], JLIP, IMLL y SECO. Dando lugar a la siguiente clave:
55 43 4D 1B
4A 4C 49 50
49 4D 4C 4C
53 45 43 4F
Y definamos también un mensaje a cifrar. En este punto puede ser interesante utilizar uno de
los mensajes que se suelen utilizar en criptoanálisis para observar como funciona un algoritmo
de encriptación, éstos son mensajes especiales como: todo ceros, todo unos, unos y ceros
alternando (0xAA), etc. En este caso parece interesante cifrar un mensaje con todo ceros, que
permita observar como la fases que introducen difusión y confusión impiden la distinción de
particularidades estadísticas en la frecuencia de caracteres en el mensaje cifrado.
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
Al comenzar el programa sera necesario calcular las sub-claves de cada iteración y cargar en
memoria la matriz de permutación y sustitución S-Box.
Iteración0: Comenzamos con la operación RoundKey que en esta iteración será la única
operación que deberá tener lugar. Al ser el primer paso, la sub-clave de iteración consiste en la
propia clave. Y la operación de XOR con el mensaje elegido resultará en la propia clave, debido
a que se ha elegido un mensaje con todos los bytes {00}..
FC 1A E3 AF
D6 29 3B 53
3B E3 29 29
ED 6E 1A 84
ShiftRows: Rotamos la fila 1 (la primera fila sería la fila 0), una vez hacia la izquierda.
La segunda fila 2 veces y la tercera 3 veces.
D6 - 29 - 3B - 53 --> 29 - 3B - 53 - D6
3B - E3 - 29 - 29 --> 29 - 29 - 3B - E3
ED - 6E - 1A - 84 --> 84 - ED - 6E - 1A
S’0 *= {02} S0 = {02} {FC} = {0000 0010} {1111 1100} en su representaicón binaria.
Del polinomio irreducible f(x) se extrae la base para x8: x8 = x4+x3+x+1 y entonces:
Seguimos con los términos: S’0 **= {03} S1 = {03} {29} = {0000 0011} {0010 1001} =
S’0 ** = (x+1) (x5+x3+1) = x6+x4+x+x5+x3+1=x6+x5+x4+x3+x+1= {0111 1011} = {7B}
Como ya se ha explicado, la suma en GF(28) corresponde a una XOR bit a bit, por lo que:
S’1 * = ({02} S1) = ({02} {29}) = x (x5+x3+1) = x6+x4+x = {0101 0010} = {52}
S’1 ** = ({03} S2) = ({03} {29}) = (x+1) (x5+x3+1) = x6+x5+x4+x3+x+1 = {0111 1011} = {7B}
Pero ahora, vamos a hacer uso de una particularidad a la multiplicación entre polinomios dentro
de GF(28) y con el polinomio irreducible: multiplicar por x equivale a rotar hacia la izquierda y
(solo si está presente la potencia x7) hacer un XOR con {1B}. De manera que:
35
51
10
0C
Este proceso deberá repetirse de idéntica manera para las otras 3 columnas para finalizar el
proceso MixColumns(). La matriz de estado resultará:
35 BD 7D DD
51 FA 66 3C
10 5F 74 8A
0C FD 8A EB
RoundKey: Por último en esta iteración, falta efectuar la operación RoundKey, que
consiste en efectuar una operación de XOR (suma) entre la matriz de estado y la sub-clave de
esta ronda.
50
4C
4F
1B
53
29
84
AF
Y finalmente sumar la primera columna de la clave, junto con la primera columna de la matriz
Rcon. Como ejemplo realizamos el cálculo para el primer elemento de la segunda columna
07
63
CD
FC
Ahora para el resto de columnas de la sub-clave, será necesario realizar una XOR entre
elementos de la columna análoga de la clave anterior, y la anterior columna. Por ejemplo, para
nuestro caso la segunda columna de la sub-clave que estamos calculando sera la XOR de la
segunda columna de la clave con la última columna calculada.
43 07 = 44
4C 63 = 2F
4D CD = 80
45 FC = B9
4D 44 = 09
49 2F = 66
4C 80 = CC
43 B9 = FA
1B 09 = 12
50 66 = 36
4C CC = 80
4F FA = B5
07 44 09 12
63 2F 66 36
CD 80 CC 80
FC B9 FA B5
Finalmente ya solo resta efectuar una RoundKey (XOR) entre la clave de ronda (esta última
clave calculada) y la matriz de estado. Resultando:
32 F9 74 CF
32 D5 00 0A
DD DF B8 0A
F0 44 70 5E
Bien, esta última matriz será tomará como punto de partida para volver a repetir la iteración
durante otras 8 vueltas más, hasta totalizar 9. Y pasar a la última iteración.
Itaración10: Todo se efectuará de manera idéntica a las anteriores iteraciones, salvo que no
se efectuará la función MixColumns.
Resultado Final.
68 E5 7B C5
80 1E 22 4B
87 C4 A2 F1
C7 7E D5 7E
Validación de la implementación
El NIST distribuye una serie de vectores con texto plano y su correspondiente texto cifrado, que
permiten validar cualquier implementación del AES, en sus variantes de ancho de clave, 128,
192 y 256 bits. El archivo es un .zip que puede descargarse aquí.
Mejoras a la implementación
Debido a enorme uso que tiene, multitud de estudios se han centrado en cómo mejorar el ratio
instrucciones/bytes cifrados (también es común la unidad instrucciones/bloque cifrado).
El estudio más actualizado que se ha podido localizar cifra las mejores implementaciones
lineales del algoritmo en algo cercano a los 15 ciclos/byte, y para implementaciones en paralelo
del algoritmo en torno a los 1 ciclo/byte. La siguiente figura muestra estos resultados.
(fuente)
GUI
El programa permite ir observando como se modifica la matriz de estado durante todo el
algoritmo.
Para la elaboración del programa ha sido necesario diseñar las siguientes funciones. El código
labview se adjunta. código
mix_columns - Multiplica un vector de 4 bytes GF(28) por a(x) módulo f(x) = x4+1.
Conclusiones
Después de su publicación, el mercado pronto adoptó particularmente rápido el estándar
AES para proteger comunicaciones. Actualmente hay 1462 implementaciones validadas por
NIST (National Institute of Standards and Technology). Y en gran parte se debe a una óptima
combinación de seguridad frente a eficiencia. Un análisis del coste computacional de AES,
frente otros estándares, puede observarse a continuación.
(fuente)
Referencias
1. Publicacion FIPS: Official AES Standard
3. AES S-Box