Anda di halaman 1dari 42

Técnicas de expresión oral y escrita

Informe técnico
Procedimiento de encriptación con AES y testeo de software con Fuzzer
para identificar vulnerabilidades en su código de programación

Integrantes
Guerra Guerra, José
León Panti, Gerardo Bruno

DESARROLLO DE SOFTWARE E INTEGRACIÓN DE SISTEMAS


C15-B
FECHA DE ENTREGA 23/12/16
DOCENTE
Rosa Díaz Fernández
2016-II
I. OBJETIVOS
1.1 Objetivo general:

Conocer la importancia y proceso de encriptación de información con AES y; testeo de


software con Fuzzer para identificar vulnerabilidades en el software

1.2 Objetivos específicos

● Describir el funcionamiento de encriptación de información según los parámetros del


AES
● Identificar los tipos de métodos fuzzer para detectar vulnerabilidades en los software
● Reconocer la importancia del AES y fuzzer para la seguridad informática en el contexto
global actual
● Notar los usos de Fuzzer y AES en la actualidad, para la seguridad de información y
la detección de vulnerabilidades

2
Índice

I.Objetivos………………………………………………......................................................... 2
1.1. Objetivos Generales……………………………………………………………. 2

1.2. Objetivos Específicos………………………………………………………… ..… 2

II. Marco teórico (Procedimiento de encriptación con AES y testeo de software con Fuzzer
para identificar vulnerabilidades en su código de programación)…….............................. 6
2.1. Información……………………………………………………………………………........ 6

2.1.1. Seguridad de información………………………………………………………….…… 6

2.1.1.1. Protocolo de seguridad de información ………………………………... 6


2.1.2. Informática………………………………………….…………………………………… 6
2.1.2.1. Seguridad informática…………………………………………………...…….. 6
2.2. Criptografía……………………………………………………………………..………... 6
2.2.1. Criptografía en la informática………………………………………………..…………. 7
2.2.2. AES (Advanced Encryption Standard)………………………………………………… 7
2.2.2.1. Definición……………………………………………………………………………..... 7
2.2.2.2. Antecedentes……………………………………………………………….………….. 7
2.2.2.3. Concurso público AES………………………………………………………… 7
2.2.2.4. Especificación del algoritmo…………………………………….……………. 9
2.2.2.5. Estructura del algoritmo…………………………………………….…………. 9
2.2.2.6. Alfabeto hexadecimal………………………………………………………….. 9
2.3. Software……………………………………………………………………….……........ 10
2.3.2. Código fuente de un software…………………………………………………………. 10
2.3.1.1. Error de software………………...…………………………………………….. 10
2.3.2. Vulnerabilidades en el software………………………………………………………. 10
2.4. Fuzzer…………………………………………………………………………….............10
2.4.1. Historia ….…………………………………………………………………......... 10
2.4.2. Tipos………………………………………………………………………….…............. 11
2.4.2.1. Fuzzer mutativo…………………………………………………….………….. 11
2.4.2.2. Fuzzer generativo………………………………………………..…………….. 11
2.4.2.2.1. Procesos……………………………………………………………….…………… 12
2.5. Proceso de cifrado con el algoritmo AES …………………………………..….. 12
2.5.1. Funciones y tablas de cifrado ………………………..………………….…………... 12

3
2.5.1.1. Función Rotword………………………………………………..……………… 12
2.5.1.2. Función ShiftRow……………………………………………….……………… 12
2.5.1.3. Función Inverse ShiftRow……………..……………………………………… 13
2.5.1.4. Función SubByte y tablas S-Box……………………………….…………….. 13
2.5.1.4.1. Función InverseSubBytes y tabla Inverse S-Box……………….………..……. 14
2.5.1.5. Función XOR………...…………………………………………………………. 15
2.5.1.6. Función MixColumn……………………………………………………………. 16
2.5.1.6.1. Inverse MixColumn ………..…………………………………………..…… 16
2.5.1.6.2. Operador multiplicación [⨂] en 𝐺𝐹(28 ) ………….….………………….……….. 16
2.5.1.7. Función AddRoundKey………….…………………………………………….. 17
2.5.1.8. Tabla RCON…………….……………………………………………………… 17
2.5.2. Llaves y sub llaves………...…………………………………………………………… 18
2.5.3. Proceso de cifrado…………….……………………………………………………….. 20
2.5.4. Proceso de descifrado. ………………………..………………………………………. 21
2.6. Proceso de testeo con fuzzer para identificar vulnerabilidades en el software...... 21
2.6.1. Obtención de datos…………………………………………………….………………. 21
2.6.2. Proceso de datos…………………………………..…………………………………… 21
2.6.3. Obtención y análisis de resultados…………………………………………………… 21
2.7. Importancia del AES en la Informática……………..……..…………………………. 22
2.8. Importancia del Fuzzer en la informática………………...……….………………….. 22
2.9. Seguridad informática en la actualidad con AES y Fuzzer…………………………. 22
2.9.1. Supremacía del fuzzer mutativo sobre el generativo…………………………….… 22
2.9.2. Usos del AES en la Internet y en contexto de la vida real…………………………. 23

III. Herramientas y Materiales…………………………………………………………………. 24

IV. Procedimiento Experimental…………………………………………………………….…. 26

V. Resultados y Análisis……………………………………………………………………..…. 35

VI. Observaciones………………………………………………………………………………. 37

VII. Sugerencias y recomendaciones…………………………………………………………. 38

VIII. Conclusiones…………………………………………………………………….…………. 39
Bibliografía……………………………………………………………………………………..… 40

Anexos……………………………………………………………………………………………. 41

4
Introducción

Los métodos de cifrado, como el AES, han existido desde los albores de la
civilización; mientras que los testeos, o comprobaciones, de rigurosidad de un
medio de comunicación, como los actuales fuzzing, siempre han sido una
constante en la seguridad y confidencialidad. Con la evolución de las
computadoras y el inmenso flujo de contenido que, en otras palabras, es
información, lograr proteger la información se ha convertido en una prioridad no
solo para un gobierno, sino también para todas las personas. Decía ya un militar
nazi: “La información es el arma más poderosa que existe”, y no era para menos
ya que los ataques de su escuadra eran impredecibles y sus mensajes para sus
tropas, indescifrables; hasta que el famosísimo Alex Turing, padre de la criptografía
moderna, logró, para el bando de los Aliados, descifrar el mecanismo de la
máquina Enigma, el dispositivo alemán que transmitía mensajes encriptados. Es
así como se aprecia la magnitud de importancia de la seguridad de la información,
en un contexto actual, donde la mayor parte, sino toda, de la información se registra
en computadores, pasando a ser seguridad informática. Citando otro
acontecimiento más cercano a nuestros días, el viernes 21 de octubre del presente
año se perpetuó un ataque masivo a escala mundial a los grandes servidores
proveedores de los recursos informáticos más usados por la generación actual.
Debido a este ataque DDoS (Denegación de servicio en castellano), servicios
como Twitter, Spotify, Netflix y otros no pudieron ser utilizados ya que un grupo de
computadoras saturó el sistema hasta el punto de hacerlo colapsar. Dicho todo lo
anterior, se da paso describir el parámetro de cifrado global actual, AES, y un
método muy popular de testeo de software, los fuzzers, con el propósito de conocer
los procesos de encriptación AES y los procedimientos con los cuales se prueba
la rigurosidad del diseño de un software como comunicador de mensajes.

5
II. Marco teórico (Procedimiento de encriptación con AES; testeo de software con
Fuzzer para determinar vulnerabilidades en su código de programación )
2.1. Información

Es el conjunto ordenado de datos que constituyen un mensaje que cambia el estado de


conocimiento actual del receptor.

2.1.1. Seguridad de información


1. Es el conjunto de medidas de prevención que permiten resguardar y proteger
información buscando mantener su confidencialidad, disponibilidad e integridad.
2.1.1.1. Protocolos de seguridad de información

Los protocolos de seguridad son un conjunto de reglas que gobiernan dentro de la transmisión
de datos entre dispositivos para ejercer una confidencialidad, integridad, autenticación y la
aceptación de la información. Están compuestas por

 Criptografía (Cifrado de datos)


 Lógica (Estructura del medio, carrier o software)
 Identificación (Validación de autenticidad del receptor)
2.1.2. Informática

Es la ciencia que estudia los métodos, técnicas y procesos con el fin de almacenar, procesar
y transmitir información por medios digitales.

2.1.2.1. Seguridad informática

Es el área de la informática que se encarga de la protección de infraestructura de


computacional, esencialmente de la información contenida y que circula dentro de ella.

2.2. Criptografía

Del griego criptos y grafe que juntos significan literalmente <escritura oculta>. Se define como
la ciencia que estudia las técnicas cifradas o codificadas para la alteración de
representaciones lingüísticas de los mensajes, con el fin de hacerlos imposibles de leer para
los receptores no autorizados. Como lo señala:

El término criptografía proviene de los vocablos griegos:𝝌𝝆𝝊𝝅𝝉𝝄𝝇, que significa


“escondido”, y 𝜸𝝆𝜶𝝋𝜼, “escritura”. Más tarde se añade el sufijo -ía para conferirle el
carácter de conocimiento o tratado. Según esta definición de carácter etimológico, la
criptografía es la ciencia que estudia la escritura oculta (Galende, 1995, pág. 15).

6
2.2.1. La criptografía en la informática

Con la evolución de las computadoras, la criptografía fue ampliamente divulgada, empleada


y modificada, con el paso de las generaciones de computadoras, se fue implementándole
algoritmos matemáticos complejos. Además de mantener la seguridad del usuario, la
criptografía preserva la integridad de la web, la autentificación del usuario, así como la del
remitente y del destinatario.

2.2.2. AES
2.2.2.1. Definición

AES es la abreviatura de Advanced Encryption Standard, que en castellano se traduce como


“Estándar de Cifrado Avanzado”. Es el título oficial del algoritmo criptográfico Rijndael, nombre
asignado por el Instituto Nacional de Estándares y Tecnología (NIST, por sus siglas en inglés)
en EEUU. Rijndael es un juego de fusión de apellidos de sus creadores Vincent Rijmen,
matemático, y Joan Daemen, especialista en seguridad bancaria; ambos investigadores
belgas.

2.2.2.2. Antecedentes

El 23 de noviembre de 1976 se establece el primer estándar de cifrado para las


comunicaciones, el algoritmo DES (Data Encryption Standard), en castellano “Estándar de
cifrado de datos”. Desde entonces, se han dado multitud de ataques que permitieron descifrar
el mensaje, como los de fuerza bruta, esto significó que el DES había pasado a ser obsoleto
e inseguro.

2.2.3. Concurso público AES

En 1997, el NIST llama a un concurso a nivel mundial para establecer el nuevo estándar de
cifrado AES, el cual permitiera proteger los datos confidenciales del gobierno de EEUU, así
como la información de los ciudadanos.

Ese mismo año se presentaron los criterios de evaluación y requisitos mínimos que todos los
algoritmos debían cumplir para ganar el concurso:

 El algoritmo debía ser público.


 Debía ser un algoritmo de cifrado en bloque simétrico.
 La longitud de la clave debía ser como mínimo 128 bits (16 caracteres)
 Su diseño debía permitir aumentar la longitud de la clave según las necesidades.

7
 Debía ser ejecutable tanto en software como en hardware.

Los criterios de evaluación serían los siguientes:

 Seguridad
 Eficiencia computacional
 Requisitos de memoria
 Implementación en HW y SW
 Simplificación de diseño
 Flexibilidad

El 2 de octubre del 2000, el NIST anuncio el algoritmo ganador de entre todos los finalistas.
Las votaciones del concurso se establecieron en el siguiente ranking:

RIJNDAEL 86 votos

SERPENT 59 votos

TWOFISH 31 votos

RC6 23 votos

MARS 13 votos

El algoritmo Rijndael ganó el concurso por tener la mejor combinación de seguridad, velocidad
de procesamiento, eficiencia, sencillez y flexibilidad, destacando, sobre todo, su sencillez.

Por tanto en octubre del 2000, quedó establecido que el AES (algoritmo Rijndael) sería el
estándar de cifrado de las comunicaciones de EEUU y, por consiguiente, de todo el mundo.

En su última sesión, la organización solicito (sic) una valoración de los candidatos a través
de un cuestionario. El cifrado preferido de los asistentes resulto (sic) Rijndael, el
criptosistema de los investigadores belgas. El mismo que el NIST eligió como vencedor
del concurso, cuyo anuncio oficial tuvo lugar el 2 de octubre de 2000 (Ortega, López, &
García del castillo, 2005, pág. 222).

8
2.2.4. Especificación del algoritmo

El AES es un algoritmo de sistema simétrico: la clave de cifrado es la misma para el descifrado,


por lo tanto, la comparten tanto el emisor como el receptor. Esta clave se divide por bloques
de 16 bytes de 8 bits cada uno, de 128 bits en total para el mensaje (en total 16 caracteres) y
para la clave, siempre y en cuando sean múltiplos de 4, admite 128(AES-128), 192(AES-192)
y 256(AES-256) bits.

2.2.5. Estructura del algoritmo

La estructura del AES está conformada por un conjunto de “rondas”, estas son reiteraciones
de 4 funciones o procesos diferentes e invertibles. Esto define el proceso como la aplicación
de un número de rondas a una información determinada para producir una información cifrada.

Se llama “estado” a una matriz rectangular de bytes, conformado por 4 filas y N (b) columnas,
siendo estas igual a:

N (b)=Tamaño de bloque en bits/32

En este caso, se trabaja en una matriz de 4x4, ya que es la estructura estándar de cifrado del
AES.

La clave del sistema se representa de manera similar a la del “estado”, es decir, en una matriz
de 4 por N (k), donde:

N (k)=tamaño de la clave/32

Los autores definieron que, para tamaños de bloques y claves entre 128 y 256 bits, el número
de vueltas Nr es determinado por la siguiente expresión.

Nr=máx. {N(k), N(b)}+6

2.2.6. Alfabeto hexadecimal

El alfabeto hexadecimal es un sistema de numeración posicional que tiene base 16; este fue
introducido en el ámbito computacional por primera vez por IBM en 1963, dando la siguiente
asignación.

S={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}

Esta es la representación básica, la completa consta de 255 valores asignados a cada símbolo
conocido del teclado estándar de una computadora.

9
2.3. Software

Conjunto de programas y rutinas que permiten a la computadora realizar determinadas tareas.

2.3.1. Código fuente de un software

El código fuente de un software es un conjunto de líneas de texto con los pasos que debe
seguir la computadora para ejecutar dicho programa.

2.3.1.1. Error de software

Un error de software, también llamado bug (que en castellano significa pulgas o garrapatas),
es un error o fallo de programa de computador o sistema de software que desencadena un
resultado inesperado.

2.3.2. Vulnerabilidades de software

Una vulnerabilidad de software es un fallo de seguridad en una aplicación mediante la cual un


atacante puede llegar a violar la seguridad de todo el sistema, o de una función local, sobre
el que se ejecuta esta aplicación.

2.4. Fuzzer

El fuzzer es un programa que lleva a cabo el proceso de fuzzing, el cual tiene como objetivo
poner a prueba el buen diseño de la estructura de un programa a través del tráfico abusivo de
datos de ingreso. De la misma manera en que lo confirma la siguiente cita: “Fuzzing is well
established as an excellent technique for locating vulnerabilities in software” (Knudsen &
Varpiola, 2015); el fuzzing es una herramienta efectiva para encontrar errores en el programa.

2.4.1. Historia

La historia del fuzzer se remonta a 1988, en la universidad de Wisconsin. El catedrático Barton


Miller intentaba controlar su computadora en su oficina de la universidad desde su casa con
un módem sin corrector; en aquellos instantes, había una tormenta en camino, ésta
interrumpía en la conexión añadiendo ruido blanco en los comandos que él enviaba a su
computadora de oficina, una que funcionaba con el sistema operativo UNIX, lo cual
ocasionaba que todos sus programas cayeran. Los orígenes del fuzzing lo confirma la
siguiente cita: “Professor Barton Miller (considered […] to be the “father” of fuzzing) and his […] class
developed and used a primitive fuzzer to test the robustness of UNIX applications.” (Sutton, Greene, &
Amini, 2007). Debido al sugerente ruido que producía la conexión, se sugirió el término “fuzz”.
Fue entonces cuando se le ocurrió al profesor Miller encargar un proyecto de clase a sus
alumnos para descubrir bugs en los sistemas operativos de la más alta vanguardia de aquel

10
entonces. Este objetivo se cumpliría con la inserción de datos aleatorios, masivos e
inesperados en el sistema, lo cual hacían que se comportaran de manera inesperada.

2.4.2. Tipos

A pesar de que hoy en día, el fuzzing es posible de realizar por medio de una desconocida
cantidad de fuzzers, esto debido a que todo conocedor de programación puede crear su propio
fuzzer, se puede clasificarlos en dos tipos. Aunque todos los fuzzer cumplen con las
características definidas por la siguiente cita: “[…] las herramientas semiautomáticas que
utilizan estas técnicas se llaman fuzzers. Son semiautomáticas porque pese a ser un proceso
automatizado de envío de datos, se necesita de una persona que analice los resultados y
verifique las posibles vulnerabilidades encontradas.” (Esparza, 2007):

2.4.2.1. Fuzzer mutativo

El fuzzer mutativo toma los datos de una biblioteca, los inserta como datos de entrada en el
programa puesto a prueba y luego arroja resultados de la respuesta del programa. A este tipo
de ataques se los conocen como ataques de fuerza bruta. Un ejemplo de este tipo de fuzzer
sería el protocolo GET, en el cual se añadirá elementos de manera aleatoria y descontrolada.

Ejemplo:

Protocolo original: GET http://www.google.es/index.html HTTP/1.0

Protocolo corrupto: GET httadnlliidksamdkizinip://www.googl.es/index.html


HTTP/1.0

2.4.2.2. Fuzzer generativo

Antes de emplear un fuzzer generativo, es necesario comprender bien el diseño del programa
que se pondrá a prueba: saber el tipo de archivos que recibe, por ejemplo. Una vez que se
conozca esto, el fuzzer generativo se encargará de extraer la gramática de los archivos válidos
del programa. Luego, comenzará a generar otros archivos que cumplan con tal gramática,
pero con elementos anormales, en grandes cantidades, que, de haber algún bug en el código
del programa, harán que colapse el sistema o responda de manera inesperada.

11
2.4.2.3. Procesos

Para este tipo de fuzzer existen dos procesos:

a) Permutación: Se considera un alfabeto, por ejemplo, es hexadecimal, el cual consiste


de 16 caracteres, y un espacio limitado de caracteres, en este caso, 6. De esta forma
se obtiene un total de 166 posibles combinaciones y elementos de biblioteca:

Protocolo original: GET http://www.google.es/index.html HTTP/1.0

Protocolo corrupto: GET http://www.googl.es/8172AB HTTP/1.0

Protocolo corrupto: GET http://www.googl.es/123AFDE HTTP/1.0

b) Repetición: Se conoce primero el tipo de dato (String, int, char, long, etc.) que procesa
el programa y se repite un carácter de este tipo para generar algún buffer overflow.

Protocolo original: GET http://www.google.es/index.html HTTP/1.0

Protocolo corrupto: GET http://www.googl.es/AAAAAAAAAAAAAAAAAAAAAA....A


HTTP/1.0

2.5. Proceso de cifrado con el algoritmo AES.

El proceso de cifrado se hará con un texto de 128 bits y una clave de igual longitud.

2.5.1. Funciones y tablas de cifrado


2.5.1.1. Función Rotword

Sea 𝐶𝑖 , donde 𝑖 ∈ [1, 𝑛] la columna enésima de una matriz ∈ Κ 𝑚×𝑛 , donde los elementos
son valores del alfabeto hexadecimal. La función Rotword toma el primer byte de la columna
y la posiciona en último lugar, desplazando los demás bytes una posición hacia arriba.

09 𝐶𝐹
𝐶𝐹 ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ 4𝐹
𝐶𝑛 = [4𝐹 ] 𝑅𝑜𝑡𝑤𝑜𝑟𝑑 [3𝐶 ]
3𝐶 09

2.5.1.2. Función ShiftRow

Sea 𝑓𝑖 , donde 𝑖 ∈ [2, 𝑛] es la fila i-ésima de una matriz ∈ Κ 𝑛×𝑚 , donde los elementos son
valores del alfabeto hexadecimal. La función ShiftRow no modifica la primera fila, pero si las
demás 𝑓𝑖 , reubicando los primeros 𝑖 − 1 bytes en la posición final de la misma, desplazando
a las demás 𝑖 − 1 posiciones a la izquierda.

12
𝑓2 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [𝐶𝐹 4𝐹 3𝐶 09]

𝑓3 = [09 𝐶𝐹 4𝐹 ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ [4𝐹


3𝐶 ] 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 3𝐶 09 𝐶𝐹 ]

𝑓4 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [3𝐶 09 𝐶𝐹 4𝐹 ]

2.5.1.2.1. Función Inverse ShiftRow

Sea 𝑓𝑖 , donde 𝑖 ∈ [2, 𝑛] es la fila i-ésima de una matriz ∈ Κ 𝑛×𝑚 , donde Los elementos son
valores del alfabeto hexadecimal. La función ShiftRow no modifica la primera fila, pero si las
demás 𝑓𝑖 , reubicando los últimos 𝑖 − 1 bytes en la posición inicial de la misma, desplazando
a las demás 𝑖 − 1 posiciones a la derecha.

𝑓2 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝐼𝑛𝑣𝑒𝑟𝑠𝑒 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [3𝐶 09 𝐶𝐹 4𝐹 ]
𝑓3 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝐼𝑛𝑣𝑒𝑟𝑠𝑒 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [4𝐹 3𝐶 09 𝐶𝐹 ]
𝑓4 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝐼𝑛𝑣𝑒𝑟𝑠𝑒 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [𝐶𝐹 4𝐹 3𝐶 09]

2.5.1.3. Función SubByte y tablas S-Box e Inverse S-Box

Sea 𝑀𝑚𝑥𝑛 un matriz ∈ Κ 𝑚×𝑛 , donde los elementos son símbolos del alfabeto hexadecimal. La
función SubBytes consiste en sustituir cada byte de la matriz por los valores de la tabla S-Box.
Esta tabla, lógicamente, es invertible.

2𝐵 28 𝐴𝐵 09 𝐹1 34 62 01
𝑀4𝑥4 = [7𝐵 𝐴𝐸 𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 [21 𝐸4
𝐹7 𝐶𝐹 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ 68 8𝐴 ]
15 𝐷2 15 4𝐹 59 𝐵5 59 84
16 𝐴6 88 3𝐶 47 24 𝐶4 𝐸𝐵

13
La función SubBytes transforma el Byte 2B o también 20 + B asignando el valor de la tabla S-
box correspondiente a la columna 20 y la fila B.

Tabla 1 Suma XOR

Nos muestra la suma de los valores hexadecimales con la función XOR

2.5.1.4. Función InverseSubBytes

Sea 𝑀𝑚𝑥𝑛 un matriz ∈ Κ 𝑚×𝑛 , donde los elementos son símbolos del alfabeto hexadecimal. La
función SubBytes consiste en sustituir cada byte de la matriz por los valores de la tabla Inverse
S-Box.

2𝐵 28 𝐴𝐵 09 𝐹1 34 62 01
𝑀4𝑥4 = [7𝐵 𝐴𝐸 𝐼𝑛𝑣𝑒𝑟𝑠𝑒𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 [21 𝐸4
𝐹7 𝐶𝐹 ] ⃖⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ 68 8𝐴 ]
15 𝐷2 15 4𝐹 59 𝐵5 59 84
16 𝐴6 88 3𝐶 47 24 𝐶4 𝐸𝐵

14
Tabla 2 Suma Inverse XOR

Nos muestra la suma de los valores hexadecimales con la función Inverse XOR

2.5.1.5. Función Suma XOR


Sea 𝐶𝑖 𝑦 𝐶𝑗 , donde 𝑖, 𝑗 ∈ [1, 𝑛] las columnas enésimas de una matriz ∈ Κ 𝑚×𝑛 , donde los
elementos son valores del alfabeto hexadecimal. La función XOR (⨁)se define como la suma
de las dos columnas byte a byte.

2𝐵 8𝐴
7𝐸
𝐶𝑖 = [ ] 𝑦 𝐶𝑗 = [ 84 ]
15 𝐸𝐵
16 01

2𝐵 8𝐴 𝐴1
7𝐸 84 𝐹𝐴
𝐶𝑖 ⨁𝐶𝑗 = [ ] ⨁ [ ] = [ ]
15 𝐸𝐵 𝐹𝐸
16 01 17

Otra forma de expresar esta función es trabajando la suma de bytes como suma de bits, donde
la función XOR operaría ceros y unos.

𝐴 𝐵 𝑋𝑂𝑅
0 0 0
0 1 || 1
1 0 1
1 1 0

Ejemplo:

[2𝐵]⨁[8𝐴] = [00101011]⨁[10001010] = [10100001] = [𝐴1]

15
2.5.1.6. Función MixColumn

Sea 𝑀4𝑥4 un matriz ∈ Κ 4𝑥4 y Sea 𝐶𝑖 y 𝐹𝑖 donde 𝑖 ∈ [1,4], columna y fila, respectivamente, de
la i-ésima posición de una matriz ∈ Κ 4𝑥4, donde los elementos pertenecen al alfabeto
hexadecimal. La función MixColumn modifica cada columna de la matriz multiplicándola, por
la izquierda, con una matriz 𝑁4𝑥4 constante predeterminada invertible, este proceso será
dentro del Cuerpo de Galois 𝐺𝐹(28 ):

𝐷4 𝐸0 𝐵8 1𝐸
𝐵𝐹 𝐵4 41 27 ]
𝑀4𝑥4 =[
5𝐷 52 11 98
30 𝐴𝐸 𝐹1 𝐸5

02 03 01 01
𝑁 = [01 02 03 01]
01 01 02 03
01 01 01 02

Entonces

𝐷4 02 03 01 01 𝐷4 02 ⋅ 𝐷4 ⨁ 03 ⋅ 𝐵𝐹 ⨁ 01 ⋅ 5𝐷 ⨁ 01 ⋅ 30
𝐵𝐹 𝑀𝑖𝑥𝐶𝑜𝑙𝑢𝑚𝑛 [01
[ ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
02 03 01] ⨂ [𝐵𝐹 ] = [01 ⋅ 𝐷4 ⨁ 02 ⋅ 𝐵𝐹 ⨁ 03 ⋅ 5𝐷 ⨁ 01 ⋅ 30]
5𝐷 01 01 02 03 5𝐷 01 ⋅ 𝐷4 ⨁ 01 ⋅ 𝐵𝐹 ⨁ 02 ⋅ 5𝐷 ⨁ 03 ⋅ 30
30 01 01 01 02 30 01 ⋅ 𝐷4 ⨁ 01 ⋅ 𝐵𝐹 ⨁ 01 ⋅ 5𝐷 ⨁ 02 ⋅ 30

2.5.1.6.1. Inverse MixColumn

Tiene el mismo proceso que el de MixColumn, solo que la matriz 𝐶 es reemplaza por 𝐶𝑖𝑚𝑣𝑒𝑟𝑠𝑒 :

14 11 13 09
𝐶𝑖𝑛𝑣𝑒𝑟𝑠𝑒 = [09 14 11 13]
13 09 14 11
11 13 09 14

2.5.1.6.2. Operador multiplicación [⨂] en el 𝑮𝑭(𝟐𝟖 )

Multiplicar bytes en el cuerpo de Galois significa representar cada byte como un polinomio de
grado 7, donde cada coeficiente está representado por los bytes respectivos del mismo; y
luego de multiplicar algebraicamente mod (2) determinar el resto de dividir por el polinomio
primo 𝑚(𝑥) = 𝑥 4 + 1:

𝐷2 ≃ 11010010 ≃ 𝑥 7 + 𝑥 6 + 𝑥 4 + 𝑥 2

16
02 ≃ 00000010 ≃ 𝑥

Entonces:

02 ⋅ 𝐷4 = [(𝑥) × (𝑥 7 + 𝑥 6 + 𝑥 4 + 𝑥 2 )𝑚𝑜𝑑2]𝑚𝑜𝑑(𝑥 4 + 1) = (𝑥 7 + 𝑥 5 + 𝑥 4 + 𝑥 3 ) = 11010001

10111000 ≃ 𝐵8

Por lo tanto

02 ⋅ 𝐷4 = 𝐵8

2.5.1.7. Función AddRoundKey

Sea 𝑀4𝑥4 y 𝑵4𝑥4 matrices ∈ Κ 4𝑥4, donde sus elementos pertenecen al alfabeto hexadecimal.
La función AddRoundKey se define como XOR la suma de matrices, en este caso 2, byte a
byte.

𝐷4 𝐸0 𝐵8 1𝐸 𝐹1 34 62 01
𝐵𝐹 𝐵4 41 27 ] ⋀ 𝑵 21 𝐸4 68 8𝐴 ]
𝑀4𝑥4 =[ 4𝑥4 = [
5𝐷 52 11 98 59 𝐵5 59 84
30 𝐴𝐸 𝐹1 𝐸5 47 24 𝐶4 𝐸𝐵

Entonces

𝐷4⨁𝐹1 𝐸0⨁34 𝐵8⨁62 1𝐸⨁01


𝐵𝐹⨁21 𝐵4⨁𝐸4 41⨁68 27⨁84
𝐴𝑑𝑑𝑅𝑜𝑢𝑛𝑑𝐾𝑒𝑦(𝑀, 𝑁) = 𝑀⨁𝑁 = [ ]
5𝐷⨁59 52⨁𝐵5 11⨁59 98⨁84
30⨁47 𝐴𝐸⨁24 𝐹1⨁𝐶4 𝐸5⨁𝐸𝐵

Donde

𝐷4⨁𝐹 = 11010100⨁11110001 = 25

25 𝐷4 𝐷𝐴 1𝐹
𝑀⨁𝑁 = [ 9𝐸 50 29 𝐴3 ]
04 𝐸7 48 1𝐶
77 8𝐴 35 0𝐸

2.5.1.8. Tabla RCON

La tabla RCON es una matriz 𝑀9𝑥10 ∈ Κ 𝑚×𝑛 , donde los elementos son símbolos del alfabeto
hexadecimal, definido especialmente para este sistema de cifrado:

01 02 04 08 10 20 40 80 1𝐵 36
00 00 00 00 00 00 00 00 00 00 ]
[
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00

17
Donde 𝐶1 se le asigna la columna 1, así sucesivamente para los 𝐶𝑖 siguientes.

2.5.2. Llave y Sub llaves

Un requerimiento para el proceso de cifrado es el de generar 10 sub llaves con la llave inicial
de 128 bits. Para esto se sigue el siguiente proceso:

Sea la clave de 128 bits, se ordena en una matriz cuadrada de 4x4 teniendo como elementos
bytes en cada bloque de arriba hacia abajo. Esto se puede comparar a cifrar 16 caracteres
entre letras y símbolos, siempre y en cuando estas tengan una representación en el alfabeto
hexadecimal, incluyendo el carácter de espacio.

La clave inicial se notara como 𝐾 y a las sub llaves siguientes 𝐾1 , 𝐾2 … … . 𝐾10.

Llave inicial:

I. Ordenar los caracteres en una matriz de 4x4:

𝐶𝑙𝑎𝑣𝑒 𝑖𝑛𝑖𝑐𝑖𝑎𝑙 = 𝑒𝑥𝑝𝑟𝑒𝑠𝑖𝑜𝑛 𝑜𝑟𝑎𝑙

𝑒 𝑒 𝑛 𝑎
𝑥 𝑠 𝑙
𝐾 = [𝑝 𝑖 𝑜 ]
𝑟 𝑜 𝑟

II. Expresarlo en el sistema hexadecimal:


𝑒 𝑒 𝑛 𝑎 65 65 6𝐸 61
𝑥 𝑠 𝑙
𝐾 = [𝑝 𝑖 𝑜 ] = [78 73 20 6𝐶 ]
70 69 6𝐹 20
𝑟 𝑜 𝑟 72 6𝐹 72 20

Para hallar la sub llave 𝐾1 se trabajara con la llave inicial 𝐾 como sigue:

[ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ]
𝐾1 =
[ ] [ ] [ ] [ ]
[[ ] [ ] [ ] [ ]]

a) Para determinar la primera columna de la matriz 𝐾1 se selecciona la última columna de


la llave inicial y se le aplica un Rotword:

61 6𝐶
6𝐶 𝑅𝑜𝑡𝑤𝑜𝑟𝑑 [ 20 ]
𝐶4 = [ ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
20 20
20 61

b) Aplicar a esta columna resultante la función SubBytes:

18
6𝐶 50
20
[ ]→ 𝐵7
[ ]
20 𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 𝐵7
61 𝐸𝐹

c) Aplicar función XOR a este nuevo resultado con la primera columna de la llave inicial;
y a este resultado XOR con la columna 1 de la tabla RCOM

50 65 01 34
[𝐵7 ] ⨁ [78] ⨁ [00] = [𝐶𝐹 ] = 𝑃1
𝐵7 70 00 𝐶7
𝐸𝐹 72 00 9𝐷

d) El resultado será la primera columna de nuestra primera sub llave:


34 [ ] [ ] [ ]
[ ] [ ] [ ]
𝐾1 = 𝐶𝐹
𝐶7 [ ] [ ] [ ]
[9𝐷 [ ] [ ] [ ]]
e) Para determinar las 3 columnas restantes:

𝐶2 (𝑙𝑙𝑎𝑣𝑒) 𝑋𝑂𝑅 𝑃1 = 𝐶2 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)

De manera general para las 3 columnas faltantes:

𝐶𝑖 (𝑙𝑙𝑎𝑣𝑒) 𝑋𝑂𝑅 𝑃1 = 𝐶1 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)

Donde:

2 <= 𝑖 ≤ 4 , 𝐶𝑖 𝑒𝑠 𝑙𝑎 𝑐𝑜𝑙𝑢𝑚𝑛𝑎 𝑖 − 𝑒𝑠𝑖𝑚𝑎 𝑑𝑒 𝑢𝑛𝑎 𝑚𝑎𝑡𝑟𝑖𝑧

Entonces:

65 34 51
73 𝐶𝐹 𝐵𝐹
𝐶2 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [ ] = 𝐶2 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
69 𝐶7 𝐴𝐸
6𝐹 9𝐷 𝐹2

65 6𝐸 0𝐵
𝐶3 (𝑙𝑙𝑎𝑣𝑒) = [ 73 ] 𝑋𝑂𝑅 [ ] = [ 53 ] = 𝐶3 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
20
69 6𝐹 06
6𝐹 72 𝐹2

65 61 04
𝐶4 (𝑙𝑙𝑎𝑣𝑒) = [ 73 ] 𝑋𝑂𝑅 [6𝐶 ] = [1𝐹 ] = 𝐶4 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
69 20 49
6𝐹 20 4𝐹

Quedándonos finalmente:

19
34 51 0𝐵 04
𝐾1 = [ 𝐶𝐹 𝐵𝐹 53 1𝐹 ]
𝐶7 𝐴𝐸 06 49
9𝐷 𝐹2 𝐹2 4𝐹
f) El proceso se repite para las demás sub claves usando la matriz obtenida anterior,
para la 𝐾2 se calcula con la 𝐾1.

Quedando así, la llave 𝐾 con las 10 sub llaves restantes 𝐾1. , 𝐾2 , 𝐾3 , 𝐾4 , 𝐾5 , 𝐾6 , 𝐾7 , 𝐾8 , 𝐾9 𝑦 𝐾10,
necesarias para el cifrado del mensaje.

2.5.3. Proceso de cifrado

El proceso de cifrado AES consiste en la aplicación de las funciones de cifrado, sobre la


información que vamos a cifrar. Este proceso se dará de forma reiterada en cada ronda.

1. Ronda inicial
I. El texto a cifrar de 128 bits (16 caracteres) será expresado en el alfabeto hexadecimal.
𝑀𝑒𝑛𝑠𝑎𝑗𝑒 𝑎 𝑐𝑖𝑓𝑟𝑎𝑟 = 𝑚𝑎𝑡ℎ 𝑖𝑠 𝑡ℎ𝑒 𝑏𝑒𝑠𝑡
II. Asignar estos valores en una matriz de 4x4= 𝑀 .
𝑚 𝑡 𝑏 6𝐷 20 74 62
𝑎 𝑖 ℎ 𝑒 61 69 68 65
𝑀 = [𝑡 𝑠 𝑒 𝑠] = [ ]
74 73 65 73
ℎ 𝑡 68 20 20 74
III. Aplicar AddRoundKey a esta matriz 𝑀 con la llave inicial 𝐾 , para así obtener la matriz
de la ronda estándar, a esta se le llamara 𝑬𝟏 .
𝑀 ⨁ 𝐾 = 𝐸1
2. Ronda estándar

Ronda intermedia del proceso consiste en operar 𝐸𝑖 con tres funciones y una AddRoundkey
con la llave 𝐾𝑖 correspondiente, 9 rondas en total:

I. Aplicar SubByte a la matriz 𝐸1 , obteniendo la matriz 𝐴.


II. Aplicar ShiftRow a la matriz 𝐴, obteniendo la matriz 𝐵.
III. Aplicar MixColumn a la matriz 𝐵, obteniendo la matriz 𝐶.
IV. Aplicar AddRoundKey a la matriz C con 𝐾1. (sub llave), obteniendo finalmente la matriz
𝐸2 .
V. Repetir el proceso con 𝐸2 y 𝐾2 para obtener 𝐸3 .
VI. Repetir el proceso sucesivamente hasta obtener 𝐸4 , 𝐸5 , 𝐸6 , 𝐸7 , 𝐸8 , 𝐸9 y 𝐸10 .
3. Ronda final

20
Para la última ronda solo se aplicaran 2 funciones a 𝐸10 ,y al resultado un AddRoundKey con
𝐾10 , obteniéndose al final el mensaje cifrado:

i. Aplicar SubByte a la matriz 𝐸10 , obteniéndose la matriz A.


ii. Aplicar ShiftRow a la matriz 𝐴, obteniendo la matriz 𝐵.
iii. Aplicar AddRoundKey a la matriz 𝐶 con 𝐾10.(última sub clave), obteniendo finalmente
el mensaje cifrado.

2.5.4. Proceso de descifrado

Para descifrar el mensaje se tiene que hacer el proceso inverso, seguir el camino hacia atrás,
usando AddRoundKey, InverseAddRoundKey, InverseShiftRow e InverseSubByte.

2.6. Proceso de testeo con fuzzer para determinar vulnerabilidades en el software

Antes de empezar un fuzzer, se debe conocer qué tipo de fuzzing se desea realizar: si uno
bruto, para lo cual serviría un fuzzer mutativo; o si uno inteligente, para lo cual se recomienda
un fuzzer generativo. Además, es necesario también conocer algo del software a testear. Uno
de los conocimientos básicos que se debe tener del software a prueba antes de iniciar un
fuzzing es saber qué tipo de datos acepta como entrada. A continuación, se detalla más a
profundidad sobre cada uno de los tres pasos que toma ejecutar un fuzzer:

2.6.1. Obtención de datos

Como ya se explicó anteriormente, un fuzzer es un ataque con datos no convencionales para


el sistema. Por ello, es necesario tener almacenado una biblioteca o library con datos de
entrada que correspondan con el formato que procesa el software. Para un fuzzer bruto
bastaría una biblioteca llena de palabras aleatorias; mientras que para un fuzzer inteligente
se necesitaría de una biblioteca más elaborada. En este paso, se alista el envío de datos.

2.6.2. Proceso de datos

Una vez listo el fuzzer con la biblioteca seleccionada para el fuzzing, se procede al envío de
datos. Para ello, será necesario elegir una aplicación como objetivo del testeo: o bien todo el
programa o solo una función de esta. Con el objetivo claro, se inicia el fuzzing.

2.6.3. Obtención y análisis de resultados

Como ya se tendrá estudiado el software objetivo, se conoce que debe reaccionar de una
manera ya predeterminada. Sin embargo, la misión del fuzzer es contradecir este
comportamiento normal y estable del programa. En este paso del fuzzing se analiza los

21
resultados obtenidos del testeo realizado, en busca de algún comportamiento extraño e
inestable del sistema.

2.7. Importancia del AES en la Informática

El estándar de cifrado AES, es uno de los algoritmos más seguros y más utilizados en la
actualidad, disponible para uso público. Esto está avalado por la Agencia de Seguridad
Nacional (NSA), de los Estados Unidos para la seguridad de información secreta “Top Secret”.

2.8. Importancia del Fuzzer en la informática

Muchos describen el fuzzer como una herramienta básica, pero, a la vez, innegablemente de
mucha utilidad cuando se trata de iniciar un testeo de software. Realizar un fuzzing a un
programa ayuda a identificar errores que saltarían a la vista si uno se dedicase a revisar el
código fuente línea tras línea, lo cual tomaría demasiado tiempo. Para ello, el fuzzing destaca
como proceso de detección de bugs rápido y efectivo.

2.9. Seguridad informática en la actualidad con AES y Fuzzer


2.9.1. Supremacía del fuzzer generativo sobre el mutativo

El fuzzer mutativo, en comparación al generativo, carece de una comprensión del tipo de datos
de entrada que recibe y procesa, esta última acción muy importante, el programa a ser
testeado ya que si el programa recibe un dato que no puede procesar, el fuzzing bruto no
generará nunca ningún problema, ergo tal esfuerzo será en vano. Por otra parte, el fuzzer
generativo, o también fuzzer inteligente, comprende la gramática que compone los datos de
entrada válidos para el sistema; con este conocimiento, genera datos pseudoválidos, los
cuales generarán estrés en el sistema, haciéndolo comportarse de una manera inesperada.
Es tanto así el desarrollo del fuzzer inteligente que, hoy en día, se utiliza ampliamente el fuzzer
de algoritmo genético, el cual aplica los mismos conceptos de la biología con respecto a la
selección natural, para poder generar sus datos pseudoválidos y poner en una situación
extrema al sistema en caso de que este tenga vulnerabilidades. El portal de matemática,
MathWorks, explica el algoritmo genético: “The algorithm then creates a sequence of new
populations. At each step, the algorithm uses the individuals in the current generation to create
the next population” (Mathworks, 2016). Con esto, nos dice que este algoritmo es capaz de
crear sus propios datos y luego ir evolucionándolos a través de ensayo, error y mutación.

22
2.9.2. Usos del AES en la Informática y el contexto de la vida real
 Seguridad de redes Inalámbricas

Está orientado al cifrado de la clave de los “Router”, para la administración de la conexión a


internet de los usuarios, dentro del estándar 802.11i, más conocido como WPA2.

 En el contexto de la vida real

Por ser el cifrado por excelencia, este se puede usar para cifras mensajes por vía tradicional
como los de mensajería.

 En la internet

Se llama, al conectarse a un servidor desde nuestro computador, conexión segura, si el


intercambio de información está siendo cifrado, en la actualidad se hace con el AES.

 En la programación

Las Extensiones criptográficas en JAVA, esto permite el desarrollo de software orientados a


la seguridad de información, haciéndolas confiables, más aun si está basado en el AES.

23
III. Herramientas – Materiales – Equipo

MATERIALES DEFINICION

Imagen 1 Lápiz Utensilio para escribir,


dibujar o pintar.
Disponible en: http://animadib.blogspot.pe/2015/08/el-lapiz-negro-
es-tu-amigo.html

Lamina fina, conformada


por fibras vegetales, se
usa para dibujar y
Imagen 2 Papel
plasmar ideas.
Disponible en:
http://www.magpaper.com/historia.html

HERRAMIENTAS DEFINICION

Algoritmo que permite el


cifrado de información
Imagen 3 Algoritmo Rijndael

Disponible en:
http://www.computerhope.com/jargon/r/rijndael-encryption.htm

24
Imagen 4 wfuzz fuzzer Wfuzz fuzzer: programa
que realiza fuzzing, de
Extraído de:
libre circulación y
http://www.edge-security.com/img/logo-wfuzz.jpeg gratuito.

Librerías: conjunto de
datos aleatorios,
Imagen 5 Librería de datos necesarios para el fuzzer
Extraído de: fuente personal

Software que permite


Imagen 6 Rijndaelinspector visualizar los resultados
Extraído de: de los procesos de
cifrado AES.
Fuente personal

EQUIPOS DEFINICION

Laptop Asus g550:


equipo portable con
sistema operativo Kali
Linux
Imagen 7 Laptop Asus g550

Extraído de:
http://www.notebookcheck.org/uploads/tx_nbc2/asusG550JK_4.png

25
IV. Procedimiento Experimental

El proceso experimental consistirá en relacionar el Fuzzer y el cifrado AES, para determinar


su importancia de estos dos en la seguridad de información, Fuzzer pondrá a prueba la
estructura del Software, mientras que el cifrado AES resguardara la confidencialidad del
mensaje aun si por este medio (software) se detectaron factores de riesgo de seguridad.

Fuzzer Software(Pagina
web) Cifrado AES

Medio de
comunicacion
inseguro,
mensaje
protegio

Imagen 8 Esquema que representa de forma gráfica el procedimiento experimental.

4.1 Cifrado AES(Rijndael)

El algoritmo de cifrado se divide en dos procesos, la primera está destinado a la obtención de


las sub llaves, indispensables para el proceso número 2 que consiste en el cifrado en sí.

Para llevar a cabo estos dos procesos se debe tener definidos tanto el mensaje como la llave;
donde la llave irá al proceso obtención de sub llaves y el mensaje al proceso de cifrado
Rijndael. Se hará uso del lápiz y papel; se hará uso del software “Rijndaelinspector” solo
para mostrar de forma didáctica los resultados de cada proceso del algoritmo, pero no para el
encriptado en sí, ya que todo software compromete seriamente la seguridad del algoritmo
AES.

26
Tanto la llave como el mensaje a cifrar deben constar de 16 caracteres, 128 bits, cada uno (el
espacio se cuenta como tal)

𝑀𝑒𝑛𝑠𝑎𝑗𝑒 = 𝐷𝑖𝑠𝑒ñ𝑜𝐷𝑒𝑆𝑜𝑓𝑡𝑤𝑎𝑟𝑒(16 𝑏𝑦𝑡𝑒𝑠 𝑜 128 𝑏𝑖𝑡𝑒𝑠)

𝐶𝑙𝑎𝑣𝑒 = 𝑒𝑥𝑝𝑟𝑒𝑠𝑖𝑜𝑛 𝑜𝑟𝑎𝑙(16 𝑏𝑦𝑡𝑒𝑠 𝑜 128 𝑏𝑖𝑡𝑒𝑠)

1° proceso: Obtención de Sub llaves con la clave

1.-Se inicia ordenando los caracteres de la clave en una matriz de 4x4:

𝐶𝑙𝑎𝑣𝑒 𝑖𝑛𝑖𝑐𝑖𝑎𝑙 = 𝑒𝑥𝑝𝑟𝑒𝑠𝑖𝑜𝑛 𝑜𝑟𝑎𝑙

𝑒 𝑒 𝑛 𝑎
𝑥 𝑠 𝑙
𝐾 = [𝑝 𝑖 𝑜 ]
𝑟 𝑜 𝑟

2.-Luego se expresa los caracteres en el sistema hexadecimal:

𝑒 𝑒 𝑛 𝑎 65 65 6𝐸 61
𝑥 𝑠 𝑙 = 78 73 20 6𝐶 ]
𝐾 = [𝑝 𝑖 𝑜 ] [
70 69 6𝐹 20
𝑟 𝑜 𝑟 72 6𝐹 72 20

Para hallar la sub llave 𝐾1 se trabajará con la llave inicial 𝐾 como sigue:

[ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ]
𝐾1 =
[ ] [ ] [ ] [ ]
[[ ] [ ] [ ] [ ]]

3.-A continuación, para determinar la primera columna de la matriz 𝐾1 se selecciona la última


columna de la llave inicial y se le aplica un Rotword:

61 6𝐶
𝐶4 = [ ] 𝑅𝑜𝑡𝑤𝑜𝑟𝑑 [ 20 ]
6𝐶 ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
20 20
20 61

4.- Inmediatamente después, aplicar a esta columna resultante la función SubBytes:

6𝐶 50
[ 20 ] → [𝐵7 ]
20 𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 𝐵7
61 𝐸𝐹

5.-Seguido, aplicar función XOR a este nuevo resultado con la primera columna de la llave
inicial; y a este resultado XOR con la columna 1 de la tabla RCOM

27
50 65 01 34
𝐵7 78 00 𝐶𝐹
[ ] ⨁ [ ] ⨁ [ ] = [ ] = 𝑃1
𝐵7 70 00 𝐶7
𝐸𝐹 72 00 9𝐷

El resultado será la primera columna de nuestra primera sub llave:

34 [ ] [ ] [ ]
𝐶𝐹 [ ] [ ] [ ]
𝐾1 =
𝐶7 [ ] [ ] [ ]
[ 9𝐷 [ ] [ ] [ ]]

6.-A continuación, para determinar las 3 columnas restantes:

𝐶2 (𝑙𝑙𝑎𝑣𝑒) 𝑋𝑂𝑅 𝑃1 = 𝐶2 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)

De manera general

𝐶𝑖 (𝑙𝑙𝑎𝑣𝑒) 𝑋𝑂𝑅 𝑃1 = 𝐶1 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)

Donde:

2 ≤ 𝑖 ≤ 4 , 𝐶𝑖 𝑒𝑠 𝑙𝑎 𝑐𝑜𝑙𝑢𝑚𝑛𝑎 𝑖 − 𝑒𝑠𝑖𝑚𝑎 𝑑𝑒 𝑢𝑛𝑎 𝑚𝑎𝑡𝑟𝑖𝑧

Se procede de la siguiente forma:

65 34 51
73 𝐶𝐹 𝐵𝐶
𝐶2 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [ ] = 𝐶2 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
69 𝐶7 𝐴𝐸
6𝐹 9𝐷 𝐹2

6𝐸 34 3𝐹
𝐶3 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [9𝐶 ] = 𝐶3 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
20 𝐶𝐹
6𝐹 𝐶7 𝐶1
72 9𝐷 80

61 34 5𝐸
6𝐶 𝐶𝐹
𝐶4 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [𝐹0 ] = 𝐶4 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
20 𝐶7 𝐸1
20 9𝐷 𝐴0

Quedándonos la sub llave 𝐾1

34 51 3𝐹 5𝐸
𝐾1 = [ 𝐶𝐹 𝐵𝐶 9𝐶 𝐹0 ]
𝐶7 𝐴𝐸 𝐶1 𝐸1
9𝐷 𝐹2 80 𝐴0

7.-Finalmente, para determinar las 9 sub llaves restantes, se procederá a repetir el ciclo con
el único cambio en la suma de la tabla RCOM asignando el número de columna con el número
de sub llave.

28
Resultado del proceso número 1:

34 51 3𝐹 5𝐸 𝐵𝐴 𝐸𝐵 𝐷4 8𝐴 2𝐴 𝐶1 15 9𝐹
𝐾1 = [ 𝐶𝐹 𝐵𝐶 9𝐶 𝐹0 ] 𝐾 = [ 37 8𝐵 17 𝐸7] 𝐾 = [ 𝐸4 6𝐹 78 9𝐹 ]
𝐶7 𝐴𝐸 𝐶1 𝐸1 2 27 89 48 𝐴9 3 𝐷7 5𝐸 16 𝐵𝐹
9𝐷 𝐹2 80 𝐴0 𝐶5 37 𝐵7 17 𝐵𝐵 8𝐶 3𝐵 2𝐶

𝐹9 38 2𝐷 𝐵2 𝐴𝐴 92 𝐵𝐹 0𝐷 77 𝐸5 5𝐴 57
𝐾4 = [ 𝐸𝐶 83 𝐹𝐵 64 ] 𝐾 = [3𝐷 𝐵𝐸 45 21 ] 𝐾 = [15 𝐴𝐵 𝐸𝐸 𝐶𝐹 ]
𝐴6 𝐹8 𝐸𝐸 51 5 𝐴9 51 𝐵𝐹 𝐸𝐸 6 21 70 𝐶𝐹 21
60 𝐸𝐶 𝐷7 𝐹𝐵 57 𝐵𝐵 6𝐶 97 80 3𝐵 57 𝐶0

𝐵𝐷 58 02 55 97 𝐶𝐹 𝐶𝐷 98 𝐹𝐴 35 𝐹8 60
𝐾7 = [ 𝐸8 43 𝐴𝐷 62] 𝐾 = [ 83 𝐶0 6𝐷 0𝐹 ] 𝐾 = [ 𝐶𝐴 0𝐴 67 68 ]
9𝐵 𝐸𝐵 24 05 8 6𝐸 85 𝐴1 𝐴4 9 𝐴𝐵 2𝐸 8𝐹 2𝐵
𝐷𝐵 𝐸0 𝐵7 77 27 𝐶𝐹 70 07 61 𝐴6 𝐷6 𝐷1

89 𝐵𝐶 44 24
𝐾10 = [3𝐵 31 56 3𝐸 ]
95 𝐵𝐵 34 1𝐹
𝐵1 17 𝐶1 10

2° Proceso de cifrado

Este proceso está consta de 11 rondas, en las cuales se hará uso de 4 funciones definidas
anteriormente.

El uso será de la siguiente forma:

Ronda 0: Función AddRoundKey

Ronda 1 al 9: Función SubByte, function ShiftRow, función MixColumn y función


AddRoundKey

Ronda 10: Función ShiftRow, función SubByte y función MixColumn.

29
Figura 1 Imagen detallada de las rondas y sus respectivas funciones a emplearse.

1.-Se inicia ordenando los caracteres en una matriz de 4x4:

𝑀𝑒𝑛𝑠𝑎𝑗𝑒 = 𝐷𝑖𝑠𝑒ñ𝑜𝐷𝑒𝑆𝑜𝑓𝑡𝑤𝑎𝑟𝑒(16 𝑏𝑦𝑡𝑒𝑠 𝑜 128 𝑏𝑖𝑡𝑒𝑠)

𝐷 ñ 𝑆 𝑤
𝑜 𝑎
𝐸=[𝑖 𝑜 ]
𝑠 𝐷 𝑓 𝑟
𝑒 𝑒 𝑡 𝑒

2.-Luego se expresa los caracteres en el sistema hexadecimal:

𝐷 ñ 𝑆 𝑤 44 𝐹1 53 77
𝑖 𝑜 𝑜 𝑎 6𝐴 6𝐹 6𝐹 61
𝐸=[ ]=[ ]
𝑠 𝐷 𝑓 𝑟 73 44 66 72
𝑒 𝑒 𝑡 𝑒 65 65 74 65

3.-Despues se inicia con la ronda 0, haciendo uso de la función AddRoundKey con la llave 𝐸
y la matriz estado (mensaje a cifrar)

44 𝐹1 53 77 65 65 6𝐸 61
𝐸 = [6𝐴 6𝐹 6𝐹 61 𝑦 𝐾 = 78 73 20 6𝐶
] [ ]
73 44 66 72 70 69 6𝐹 20
65 65 74 65 72 6𝐹 72 20

30
Entonces:

44 𝐹1 53 77 65 65 6𝐸 61 21 94 3𝐷 16
6𝐴 6𝐹 6𝐹 61 73 20 6𝐶 ] = [11 1𝐶 4𝐹
[ ] ⨁ [78 0𝐷 ]
73 44 66 72 70 69 6𝐹 20 03 2𝐷 09 52
65 65 74 65 72 6𝐹 72 20 17 0𝐴 06 45

4.-Luego con este resultado se ejecuta la ronda 1 como sigue:

21 94 3𝐷 16 𝐹𝐷 22 27 47
11 1𝐶 4𝐹 0𝐷 82 9𝐶 84 𝐷7]
4.1 𝑆𝑢𝑏𝐵𝑦𝑡𝑒 [ ]=[
03 2𝐷 09 52 7𝐵 𝐷8 01 00
17 0𝐴 06 45 𝐹0 67 6𝐹 6𝐸

𝐹𝐷 22 27 47 𝐹𝐷 22 27 47
4.2 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤𝑠 [82 9𝐶 84 𝐷7]=[9𝐶 84 𝐷7 82]
7𝐵 𝐷8 01 00 01 00 7𝐵 𝐷8
𝐹0 67 6𝐹 6𝐸 6𝐸 𝐹0 67 6𝐹

𝐹𝐷 22 27 47 31 23 30 𝐴4
9𝐶 84 𝐷7 82] = [ 𝐵3 𝐶1 78 44 ]
4.3 𝑀𝑖𝑥𝐶𝑜𝑙𝑢𝑚𝑛𝑠 [
01 00 7𝐵 𝐷8 𝐷1 𝐴𝐷 𝐴𝐹 𝐷𝐹
6𝐸 𝐹0 67 6𝐹 5𝐷 19 0𝐵 4𝐷

4.4 Por último, para esta ronda 1 se aplica AddRoundKey[⨁], con la sub llave 𝐾1 y el
resultado anterior.

31 23 30 𝐴4 34 51 3𝐹 5𝐸 05 72 0𝐹 𝐹𝐴
𝐵3 𝐶1 78 44 ⨁ 𝐶𝐹 𝐵𝐶 9𝐶 𝐹0 ] = [7𝐶 7𝐷 𝐸4 𝐵4 ]
[ ] [
𝐷1 𝐴𝐷 𝐴𝐹 𝐷𝐹 𝐶7 𝐴𝐸 𝐶1 𝐸1 16 03 6𝐸 3𝐸
5𝐷 19 0𝐵 4𝐷 9𝐷 𝐹2 80 𝐴0 𝐶0 𝐸𝐵 8𝐵 𝐸𝐷

5.- A este resultado se procesa a través de la ronda 2 que consiste en hacer el mismo proceso
que la ronda 1, con la diferencia que se usara la sub llave 2.

6.- Se repite este proceso hasta la ronda 9, donde se obtiene la matriz siguiente:

58 𝐴0 60 2𝐴
[ 𝐸𝐴 32 65 9𝐷 ]
𝐸𝐶 𝐴𝐹 0𝐵 𝐴8
𝐶𝐵 83 0𝐴 79

7.-Posteriormente, a este resultado se le procesa en la ronda 10 como sigue:

31
58 𝐴0 60 2𝐴 6𝐴 𝐸0 𝐷0 𝐸5
7.1 𝑆𝑢𝑏𝐵𝑦𝑡𝑒 [ 𝐸𝐴 32 65 9𝐷 ] = [ 87 23 4𝐷 5𝐸 ]
𝐸𝐶 𝐴𝐹 0𝐵 𝐴8 𝐶𝐸 79 2𝐵 𝐶2
𝐶𝐵 83 0𝐴 79 1𝐹 𝐸𝐶 67 𝐵6

6𝐴 𝐸0 𝐷0 𝐸5 6𝐴 𝐸0 𝐷0 𝐸5
7.2 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤𝑠 [ 87 23 4𝐷 5𝐸 ] = [ 23 4𝐷 5𝐸 87 ]
𝐶𝐸 79 2𝐵 𝐶2 2𝐵 𝐶2 𝐶𝐸 79
1𝐹 𝐸𝐶 67 𝐵6 𝐵6 1𝐹 𝐸𝐶 67

7.3 Antes de culminar, para esta ronda 10 se aplica al resultado anterior


AddRoundKey[⨁],con la sub llave número 10, obteniéndose finalmente el mensaje cifrado:

6𝐴 𝐸0 𝐷0 𝐸5 89 𝐵𝐶 44 24 𝐸3 5𝐶 94 𝐶1
[ 23 4𝐷 5𝐸 87 ] ⨁ [3𝐵 31 56 3𝐸 ] = [ 18 7𝐶 08 𝐵9]
2𝐵 𝐶2 𝐶𝐸 79 95 𝐵𝐵 34 1𝐹 𝐵𝐸 79 𝐹𝐴 66
𝐵6 1𝐹 𝐸𝐶 67 𝐵1 17 𝐶1 10 07 08 2𝐷 77

8.- Resultado del mensaje a cifrar:

𝐸3 5𝐶 94 𝐶1
𝐹 = [ 18 7𝐶 08 𝐵9]
𝐵𝐸 79 𝐹𝐴 66
07 08 2𝐷 77

Resultado del cifrado en el sistema hexadecimal: E318BE075C7C79089408FA2DC1B96677

9.-Con el mensaje cifrado, se introducirá al medio de comunicación (página web) que se


pondrá a prueba, proceso que se hará a continuación.

32
Figura 2 Tomado del software Rijndaelinspector, donde se puede apreciar la matriz estado así como la clave y la
matriz salida (mensaje cifrado), debajo en color plomo 3 de las 10 sub llaves de cifrado, como en color azul la clave
que se usara en la ronda 0(entrada).

4.2 Fuzzer

Tal y como se había dicho anteriormente, la cantidad de fuzzers existentes en la web es


incontable: hay tantas como programas existentes. Además, debido a la incertidumbre con
la que un programa pueda actuar, esto debido a diversos factores como las condiciones
de sus servers, hace impredecible los resultados que se pueda obtener con un fuzzer. Es
más, ya que se utilizará un fuzzer bruto o mutativo, puede que inclusive el programa
objetivo rechace todos sus envíos de datos. A continuación, se detalla el procedimiento
para realizar el fuzzing a un programa:

1.- Una vez encendido la computadora con sistema operativo Kali Linux, se inicia el
navegador de internet y se descarga wfuzz de la siguiente página:
https://github.com/xmendez/wfuzz

2.- Luego se abre el terminal de Kali Linux y se escribe el siguiente comando para abrir el
menú de wfuzz: root@kali:~# wfuzz -h.

3.- A continuación, se verá el menú de opciones de wfuzz: de entre todas las opciones se
utilizará -c (el cual activa la impresión de los resultados), -z (el cual será el payload o
librería con el que actuará el fuzz), y –hc (el cual significa “Hide responses with the
specified code”, en español, “Esconder las respuestas con el siguiente código”).

33
4.- Se identifica el elemento de la página web en el cual se quiere realizar el fuzzing, y lo
se reemplaza el elemento en el URL por la palabra “FUZZ”, quedando un comando como
el siguiente: root@kali:~# wfuzz -c -z file,wordlist/Injections/All_attack.txt –hc 404
http://www.mysite.com/list.asp?id=FUZZ

5.- Listo el comando, se da enter y se espera mientras el programa realiza el fuzzing.

6.- Una vez culminado el fuzzing, el fuzzer arroja resultados, mostrando el ID de los
intentos o peticiones, las respuestas del programa objetivo a estas, las líneas de código
afectadas, la cantidad de palabras insertadas, los chars capturados y la petición explícita.
Al final de todo, se apreciará algún crash o bug detectado; además, se apreciará el tiempo
que tardó el fuzzing, el total de peticiones, el total de peticiones denegadas y la rapidez de
peticiones por segundo.

Figura 3 En la captura de pantalla se observa parte de los resultados del fuzzing, el cual muestra: 468
comandos, de los cuales 367 se filtraron.

7.- Finalmente, se analiza los resultados en busca de un error detectado y se comprueba


la estabilidad y funcionalidad del programa objetivo.

34
Figura 4 Como se aprecia, se comprobó la estabilidad y funcionalidad del programa web y se obtuvo un error
DDoS o Denegación de servicio ante el chequeo, lo cual evidencia la vulnerabilidad ante un ataque fuzzer.

V. Resultados y análisis

Se realizó el proceso de fuzzing cuatro veces en dos aplicaciones web provenientes de una
misma página web. A continuación, se presenta la librería fuzz utilizada, la función o programa
objetivo, las peticiones filtradas, las peticiones totales, el hallazgo de vulnerabilidades y
observaciones:

Tabla 1: Resultados del experimento con el fuzzer Wfuzz (fuente propia)

Fuzzing Función o programa Peticion Peticione Vulnerabilid Observacio


objetivo es s totales ades nes
filtradas

All_attack www.mysite.com/list.asp?i 76 125 No


.txt d=FUZZ

All_attack www.mysite.com/list.asp?i 367 468 No


.txt d=FUZZ

35
All_attack www.mysite.com/list.asp?i 30 468 Si Error DDoS
.txt d=FUZZ (Denegació
n de
Servicio)

Text_ext.t www.mysite.com/cgi- 0 17576 Si Error DDoS


xt bin/FUZZ (908 (Denegació
procesad n de
as) Servicio)

La tabla muestra, en la columna encabezada Fuzzing, la librería usada en el ataque; en la


siguiente columna, se especifica el programa objetivo; luego, se coloca el total de peticiones
filtrada o no procesadas por el programa objetivo; después, se encuentra el total de peticiones
de la librería usada; en vulnerabilidades, se determina si es que se detectó algún
comportamiento inesperado del programa; finalmente, se detalla el tipo de vulnerabilidad
hallada.

Del total de fuzzings realizados, dos tuvieron éxito en generar errores críticos para el sistema
puesto a prueba. Los errores DDoS ocurren cuando un sistema o programa recibe tantas
peticiones que colapsa y se ve en la obligación de denegar el acceso a los usuarios de tal
programa.

Se puede observar también la librería wfuzz text_ext.txt fue la que más rápido ocasionó que
colapsara el programa objetivo.

Al ser www.mysite.com/cgi-bin/ una página web destinado al préstamo de espacios en


internet debe tener una manejo de información sensible que solo puede ser administrado por
el dueño la página, pero al demostrar que dicho sitio es inseguro, la información dentro de ella
también o es, pero hay una excepción , nuestro mensaje cifrado, esto nos asegura que si el
mensaje llega a ser visto por terceros no vulnerara su seguridad, por lo mismo que nos
asegura su cifrado de tipo AES.

Se notó que el algoritmo, se puede implementar en cualquier ámbito real, si se sigue el


procedimiento de manera correcta, pero que no se cumple en el ámbito informático, ya que la
seguridad se vería comprometida, no por el algoritmo, sino por el programa que lo alberga, ya
que este, como indica el Fuzzer, podría tener errores de programación y así de forma indirecta,
obtener el mensaje.

36
VI. Observaciones

6.1 No todo texto hexadecimal se puede traducir al alfabeto romano (latino) porque no
todo el alfabeto hexadecimal existe en el alfabeto romano, consecuencia de asignar
ciertas teclas acciones que solo una computadora puede entender.
6.2 Se generó una deficiencia en el cifrado a causa de condiciones humanas como la
mala caligrafía y un inadecuado orden al momento de operar el algoritmo.

37
VII. Sugerencias y recomendaciones
7.1 Se debe mantener el mensaje cifrado en el alfabeto hexadecimal y si se hace
su transmisión, hacerlo en este formato alfabético.
7.2 Mantener un detallado orden al efectuar el cifrado AES, escritura legible y tener
un software de respaldo, solo para corroborar el proceso (Cryp Tool).

38
VIII. Conclusiones
 Se describió completamente el funcionamiento del algoritmo de encriptación de
información con AES, en este, se detalla minuciosamente sobre cada función que
integra a ésta.
 Se identificó con claridad la diferencia entre los dos tipos generales de fuzzers, siendo
uno de formato predigitado y bruto; mientras que el segundo, es autogenerado por el
mismo fuzzer e inteligente.
 Se reconoció la importancia del algoritmo AES, a la vez que se reafirmó la utilidad del
fuzzer al detectar vulnerabilidades de un software objetivo. Con esto, se concluye que
ambas herramientas son importantes: primero, para proteger la información que se
envíe a través de un medio (software); segundo, para poner a prueba el buen diseño
del software que sirve como medio de transmisión de datos; siendo ambos atributos
de suma importancia para el contexto de la seguridad informática actual.
 Al observar los distintos usos que se le pueda dar a ambas herramientas, AES y fuzzer,
se concluyó que el algoritmo AES garantiza la encriptación del mensaje de forma
unánime será para cifrar un texto en claro o un software, ya que este último también
está basado en líneas de texto, y que el fuzzer probará indeterminadas veces la
rigurosidad del diseño del software con el cual se transmite el mensaje cifrado en AES.

39
Bibliografía

Esparza, J. (10 de Agosto de 2007). Fuzzing y seguridad. Obtenido de S21sec Labs:


https://eternal-todo.com/files/articles/fuzzing.pdf

Galende, J. (1995). Criptografía: historia de la escritura cifrada. Madrid: Complutense.

Knudsen, J., & Varpiola, M. (7 de Enero de 2015). What is Fuzzing: the Poet, the Courier, and
the Orcale. Obtenido de http://www.codenomicon.com/files/pdf/WhatisFuzzing.pdf

Mathworks. (2016). How the Genetic Algorithm Works. Obtenido de Mathworks:


https://www.mathworks.com/help/gads/how-the-genetic-algorithm-works.html

Ortega, J., López, M., & García del castillo, E. (2005). Introducción a la criptografia: historia y
actualidad. España: Universidad de Castilla La Mancha.

Sutton, M., Greene, A., & Amini, P. (2007). Fuzzing - Brute Force Vulnerability Discovery.
Donneley: Addison-Wesley.

40
Anexos:

Ilustración 1: Presentación del menú principal de Wfuzz

(fuente propia)

41
Ilustración 2: Captura de pantalla de la aplicación web objetivo

(fuente propia)

42

Anda mungkin juga menyukai