You are on page 1of 72

Una guía para entender

Advanced Encryption Standard


(AES) con muñecos de palo

© Copyright 2009, Jeff Moser


http://www.moserware.com/
Traducido por Pablo Garaizar
Acto 1º: Érase una vez…
Gestiono petabytes* de datos cada día. Cifro
desde jugosa inteligencia Alto Secreto hasta
los aburridos paquetes que llegan a tu router
WiFi. ¡Lo hago todo!

* 1 petabyte = mucho
… pero aún así, no parece que a nadie le
importe yo o mi historia.
La historia de cómo logré abrir mi propio camino
para convertirme en el rey mundial del cifrado
de bloques es mejor que la de Cenicienta.
¡Guau! Todavía estás ahí ¿Quieres oírla?
Bien, empecemos...
Hace algún tiempo*, la gente -exceptuando
a las agencias de inteligencia- no tenía
manera de juzgar la buena criptografía.

¡EBG13 rf travny!

El ROT13 doble
es mejor

* ~ antes de 1975 para el público en general


Se promulgó un edicto en todo el país para
encontrar un algoritmo bueno y seguro.

¡Necesitamos un buen cifrado!


Un digno competidor llamado Lucifer
se dio a conocer.
Después de ser modificado por la Agencia Nacional
de Seguridad (NSA), fue declarado el Estándar de
Cifrado de Información (DES).

¡Yo te nombro DES!

Clave
más
corta Caja 'S'
más fuerte
DES dominó la tierra durante 20 años.
Los académicos lo estudiaron atentamente.
Por primera vez había algo específico sobre
lo que centrar su atención. Nacía el moderno
campo de la criptografía.

'… por lo que respecta a ¡Fíjate en esa red


nuestro conocimiento, DES de Feistel!
está a salvo de debilidades
estadísticas o matemáticas'.
A lo largo de los años, muchos atacantes
desafiaron a DES y fue derrotado en varias batallas.
La única manera de protegerse de esos ataques fue
usar DES tres veces seguidas para formar 'Triple-DES'.
Esto fue efectivo, pero terriblemente lento.
Se promulgó otro decreto* ...

Necesitamos algo
al menos tan robusto
como Triple-DES, pero
más rápido y flexible.

* ~ a principios de 1997
Esta invitación hizo que los cripto-magos
se reunieran para desarrollar algo mejor.

¡¡Esta es mi Usaré FROG


oportunidad
de ser famoso!! Yo usaré
Twofish
Mis creadores, Vincent Rijmen y Joan Daemen,
se encontraban entre esos cripto-magos.
Combinaron sus apellidos para darme mi
nombre: Rinjdael*.

Yo

* pronunciado 'reindal' para los que no sean belgas.


Todo el mundo se reunió para votar y...

¡Votadme!
¡¡Gané!!
… y ahora soy el nuevo rey del cripto-mundo. Puedes
encontrarme en cualquier parte. Incluso Intel está
introduciendo instrucciones nativas para mí en sus
próximos chips para hacerme asombrosamente rápido.

Hoja de ruta de los procesadores Intel


¿Alguna pregunta?

Bonita historia y
todo eso, pero ¿cómo
funciona el cifrado?
Muy raro, me largo.
Acto 2º: Cifrado básico
¡Muy buena pregunta! Solamente
necesitas conocer 3 grandes ideas
para entender el cifrado.
1ª gran idea: confusión

Es una buena idea ocultar la relación entre tu mensaje


real y tu mensaje 'cifrado'. Un ejemplo de esta '
confusión' es el viejo y fiel 'Cifrado del César':

en claro:

cifrado:

letras
2ª gran idea: difusión

Es también una buena idea esparcir el mensaje.


Un ejemplo de esta 'difusión' sería una simple
transposición de columnas.

Separado por 3 espacios


3ª gran idea: sólo la clave es secreta
Después de miles de años, hemos aprendido que
es una mala idea asumir que nadie terminará por
conocer cómo funciona tu método. Al final siempre
habrá alguien que lo termine sabiendo.

¡Dime cómo funciona! ¡Dime cómo funciona!


¡Sin problema!
¡Genial! ¡Ahora Está en la Wikipedia.
puedo descifrar Pero no sé la clave.
cualquier cosa!
¡Mierda!

MAL MEJOR
¿Responde eso a
tu pregunta?
Está bien, pero ha
sido muy general. ¿Detalles?
¿Cómo funcionas tú? ¡No soporto
los detalles!
Acto 3º: Detalles
Estaría encantado de explicaros
cómo funciono, pero antes tenéis
que firmar esto.

Uh, ¿qué es eso?


Acuerdo de Prevención de
disparo en el pie

Yo, ________ prometo que, una vez vea


lo simple que es AES realmente, no lo
implementaré en código en producción,
aunque sería realmente divertido hacerlo.

Este acuerdo tendrá validez hasta que


el abajo firmante invente una coreografía
que compare y contraste la temporización
basada en caché y otros ataques indirectos
y sus contramedidas.

Firma Fecha
Tomo tus datos y los cargo
en esta tabla de 4 x 4*.

Relleno al final,
dado que no eran
exactamente
16 bytes

* Esta es la 'matriz de estado' que siempre llevo conmigo.


En la ronda inicial calculo una OR-Exclusiva (XOR)
de cada byte con el correspondiente de la clave
para la primera ronda.
Un tributo a XOR

Hay una sencilla razón por la que uso XOR para aplicar la
clave y en otros sitios: es rápido y barato, un simple cambio
a nivel de bit. Usa muy poco hardware y puede hacerse en
paralelo ya que no se usan molestos bits de acarreo.
Expansión de la clave: parte 1

Necesito muchas claves para usarlas en rondas posteriores.


Derivo todas ellas a partir de la clave inicial usando una
sencilla técnica de mezcla que es realmente rápida. A pesar
de las críticas*, es suficientemente buena.

Clave inicial

* la mayoría -por mucho- de las quejas en contra del diseño de AES se centran en esta simplificación.
Expansión de la clave: parte 2a

Tomo la última columna de la clave de la anterior ronda


y muevo el byte de arriba del todo a abajo:

Luego, paso cada byte por una caja de sustitución que


lo traducirá en algo distinto:
Expansión de la clave: parte 2b

Entonces, hago xor de la columna con una


'constante de ronda' que es diferente para cada ronda:

Finalmente, hago xor del resultado con la primera


columna de la clave de la ronda previa:

Primera
columna
nueva
Expansión de la clave: parte 3

Las otras columnas son super-fáciles*. Solamente tengo que hacer


XOR de la columna anterior con la misma columna de la clave de la
ronda previa:

Columna de Nueva columna Nueva clave de ronda


Columna
la clave de
previa
ronda previa

* date cuenta de que las claves de 256 bits son ligeramente más complicadas.
Luego, empiezo con las rondas intermedias. Una
ronda es simplemente una serie de pasos que repito
varias veces. El número de repeticiones depende del
tamaño de la clave.

Ronda intermedia
Aplicando confusión: bytes sustitutos

Uso la confusión (1ª gran idea) para ocultar la


relación de cada byte. Pongo cada byte en una
caja de sustitución (sbox), que lo traducirá a un
byte diferente

Denota
'confusión'
Aplicando difusión, parte 1: desplazar filas

Luego desplazo las filas hacia la izquierda

… y entonces
las ajusto al
otro lado

Denota
'permutación'
Aplicando difusión, parte 2: mezclar columnas

Tomo cada
columna y
mezclo los
bits
Aplicando seguridad de la clave: añadir la clave de ronda

Al final de cada ronda, aplico la siguiente clave de ronda


con una XOR:
En la ronda final, me salto el paso de 'mezclar columnas',
ya que no va a incrementar la seguridad y solamente
ralentiza el proceso:

Ronda final

* la difusión que proporcionaría no se aprovecharía en la siguiente ronda.


… y eso es todo. Cada ronda que hago añade más
confusión y difusión a los bits. También hace que
la clave influya en ellos. ¡Cuantas más rondas, mejor!
Determinar el número de rondas siempre
implica varios compromisos

Rendimiento
Seguridad

'La seguridad siempre implica un coste en rendimiento' – Vincent Rijmen


Cuando estaba siendo desarrollado, un chico listo fue capaz
de encontrar un atajo a través de 6 rondas. ¡Eso no está
bien! Si miras cuidadosamente, verás que cada bit de la salida
de una ronda depende de cada bit de dos rondas atrás. Para
incrementar esta 'avalancha de difusión', añadí 4 rondas extra
más. Este es mi 'margen de seguridad'.

Teóricamente
'roto'

'Margen de seguridad'
Así que en imágenes, tenemos esto:
Descifrar implica hacer todo al revés
Aquí la 'ronda final'
va al principio.

la 'ronda inicial'
va al final.

Inverso de Inverso de
Inverso de añadir clave de ronda sustituir bytes desplazar columnas Inverso de mezclar columnas
Un último detalle: no debería de ser usado tal cual,
sino como pieza de construcción de un 'modo' decente.

¡MAL! Mejor
¿Tiene sentido? ¿Responde
eso a tu pregunta?
Casi... salvo cuando movías tus manos
y usabas analogías extrañas.
¿Qué es lo que realmente ocurre?
¡Otra pregunta genial!
No es difícil, pero... implica
un poco de... matemáticas.

De acuerdo.
¡Dale calor!
¡Las mates son
difíciles! ¡Vamos
de compras!
Acto 4º: Matemáticas
Volvamos a tu clase de álgebra…

Vamos clase,
¿cuál es la
respuesta?

Debería
¡Yo lo sé! copiarle…
Es 2x.

¿Saldrá
Ashley
conmigo?


Repasando las bases…

polinomio
multiplicación
cuadrado grado

la incógnita coeficiente
suma
Cambiaremos las cosas ligeramente. Antes, los
coeficientes podían ser tan grandes como queramos.
Ahora solamente pueden ser 0 o 1:

Antes
Ahora

la nueva “suma”
Coeficientes grandes Coeficientes pequeños

* Hecho curioso: ahora, la 'nueva suma' es igual que la sustracción:


¿Recuerdas cómo las multiplicaciones podían
hacer que las cosas crecieran rápido?

¡Grande y asqueroso!
Con la 'nueva suma', las cosas son más sencillas,
pero la x13 es todavía demasiado grande. Hagamos
que no se pueda ir más allá de x7.
¿Cómo podríamos hacerlo?
Usaremos a nuestro amigo el 'reloj matemático*' para
hacer esto. Solamente suma cosas y hace la división.
Presta atención al resto de la división:

4 en punto + 10 horas = 2 en punto

+ 10 horas =

* Esto se conoce también como 'suma modular'. Los locos por las matemáticas
lo llaman 'grupo'. AES utiliza un grupo especial llamado un 'campo finito'.
Podemos hacer matemáticas 'de reloj' con polinomios. En lugar
de dividir por 12, mis creadores me dijeron que usara
Supongamos que queremos multiplicar
donde tiene coeficientes

es muy grande, tenemos que hacerlo más pequeño

* Recuerda que cada es o bien 0 o bien 1.


Lo dividimos entre y tomamos el
resto:

El resto:

Fíjate como las b's se desplazan


hacia la izquierda 1 posición. Esto es simplemente
b7 multiplicado por un
polinomio pequeño
Ahora ya estamos preparados para la explosión más
fuerte del pasado: los logaritmos. Una vez dominados,
el resto es pan comido. Los logaritmos nos permiten
convertir multiplicación en suma:

Luego…

A la inversa:
Podemos usar algoritmos en nuestro nuevo mundo.
En lugar de usar 10 como base, podemos emplear el
simple polimonio
polinomio y contemplar cómo se complica la magia*.

* Si continuas multiplicando por (x•1) y tomas el resto después de dividir


por m(x), verás que generarás todos los posibles polinomios por debajo de
X8. ¡Esto es muy importante!
¿Por qué molestarnos con todas estas matemáticas?*
El cifrado trata con bits y bytes, ¿no? Bueno, existe
una última conexión: un polinomio de 7º grado puede
Representar exactamente 1 byte, dado que ahora
solamente utilizamos 0 o 1 como coeficientes:

¡¡Un solo byte!!

* A pesar de que solamente trabajaremos con bytes a partir


de ahora, las matermáticas nos aseguran que todo se resuelve bien.
Trabajando con bytes, la suma de polinomios se convierte en una
simple xor. Podemos usar nuestros conocimientos de logartimos
para hacer una tabla para multiplicar muy rápidamente*.

* Podemos crear la tabla dado que seguimos multiplicando por


Dado que sabemos cómo multiplicarlos, podemos encontrar el
byte del polinomio 'inverso' para cada byte. Este es el byte
que deshará/invertirá el polinomio de nuevo a 1. Solamente
hay 255 posibilidades*, así que podemos usar la fuerza bruta
para encontrarlos:

encontrado por fuerza bruta usando un bucle for

* Hay solamente 255 y no 256 porque el 0 no tiene inverso.


Ahora ya podemos entender la misteriosa s-box.Toma
un byte 'a' y le aplica dos funciones. La primera es 'g',
que solamente encuentra el byte inverso. La segunda es
'f', que complica las matemáticas a propósito en contra
para frustrar ataques.
También podemos entender esas locas constantes
de ronda en la expansión de la clave. Las consigo
empezando con '1' y continuo multiplicando por 'x':

Constantes de las primeras 10 rondas


Mezclar las columnas es lo más complicado. Trato cada columna como
un polinomio. Uso entonces nuestro nuevo método para multiplicarlo por
Un polinomio especialmente preparado y entonces tomo resto después de
Dividirlo por x4+1. Esto se simplifica con una matriz de multiplicación:

polinomio especial
la columna
Guau… Creo que lo he entendido. Es
relativamente sencillo una vez encajas
Las piezas. Gracias por explicarlo.
Un placer. He de irme.
!Vuelve cuando quieras!
Pero hay mucho más de lo que hablar: mi resistencia
al criptoanálisis lineal y diferencial, mi estrategia
'Wide Trail', la implausibilidad de ataques de claves
relacionadas, y... mucho más... pero no queda nadie.
Oh, de acuerdo... todavía hay aburrido
tráfico de router que tiene que ser
cifrado. ¡Me tengo que ir!
Fin

You might also like