análisis y mejora del rendimiento del algoritmo aes para su

Transcription

análisis y mejora del rendimiento del algoritmo aes para su
INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERIA Y CIENCIAS
SOCIALES Y ADMINISTRATIVAS
SECCIÓN DE ESTUDIOS DE POSGRADO E INVESTIGACIÓN
ANÁLISIS Y MEJORA DEL RENDIMIENTO DEL
ALGORITMO AES PARA SU UTILIZACIÓN EN
TELÉFONOS MÓVILES
TESIS
QUE PARA OBTENER EL GRADO DE
MAESTRA EN CIENCIAS EN INFORMÁTICA
PRESENTA
L.C.I NANCY PAOLA GALVEZ MEZA
DIRECTOR DE LA TESIS:
DR. ERIC MANUEL ROSALES PEÑA ALFARO.
MÉXICO D.F. 2014
2|Página
INSTITUTO POLITÉCNICO NACIONAL
SECRETARÍA DE INVESTIGACIÓN Y POSGRADO
CARTA CESIÓN DE DERECHOS
En la Ciudad de México, D.F. el día 10 del mes de marzo del año 2014, el (la) que suscribe
Nancy Paola Galvez Meza alumna del Programa de Maestría en informática, con número
de registro B102323 , adscrita a la sección de estudios de posgrado e investigación de la
Unidad profesional interdisciplinaria de ingeniería y ciencias sociales y administrativas,
manifiesta que es la autora intelectual del presente trabajo de Tesis bajo la dirección del
Dr. Eric Manuel Rosales Peña Alfaro y cede los derechos del trabajo titulado “Análisis y
mejora del rendimiento del algoritmo AES para su utilización en teléfonos móviles” al
Instituto Politécnico Nacional para su difusión, con fines académicos y de investigación.
Los usuarios de la información no deben reproducir el contenido textual, gráficas o datos
del trabajo sin el permiso expreso del (de la) autor(a) y/o director(es) del trabajo. Este
puede ser obtenido escribiendo a las siguientes direcciones [email protected]
y/o [email protected]. Si el permiso se otorga, el usuario deberá dar el
agradecimiento correspondiente y citar la fuente del mismo.
Galvez Meza Nancy Paola
Nombre y firma del alumno(a)
3|Página
Contenido General
Agradecimientos .............................................................................................................................................. 12
Resumen .......................................................................................................................................................... 13
Abstract ........................................................................................................................................................... 14
Introducción .................................................................................................................................................... 15
Objetivos.......................................................................................................................................................... 17
CAPITULO I Fundamentos y Preliminares ........................................................................................................ 19
1.1
Introducción Histórica .................................................................................................................... 19
1.2
Conceptos Básicos .......................................................................................................................... 28
1.2.1 Seguridad de la información .......................................................................................................... 28
1.2.2 Criptografía .................................................................................................................................... 29
1.2.3 Criptosistemas ............................................................................................................................... 31
1.2.4 Criptoanálisis.................................................................................................................................. 33
1.3
Criptografía de clave secreta .......................................................................................................... 34
1.3.1 Cifrado de bloques ......................................................................................................................... 37
1.3.2 Cifrado de Flujo .............................................................................................................................. 37
1.4 Criptografía de clave pública..................................................................................................................... 38
1.5
Algoritmos HASH o de resumen ..................................................................................................... 39
1.6
Comparativa entre algoritmos Simétricos y asimétricos ................................................................ 41
CAPITULO II Criptografía en arquitecturas móviles y su programación .......................................................... 44
2.1
Seguridad en Telefonía Móvil ......................................................................................................... 44
2.1.1 El móvil como un mini PC.............................................................................................................. 44
2.1.2 La importancia de la seguridad ...................................................................................................... 46
4|Página
2.2
Incidentes de seguridad ................................................................................................................. 46
2.2.1 Tipos de Malware en los Smartphones ......................................................................................... 48
2.2.2 Malware en Sistemas Operativos Android ..................................................................................... 49
2.3
Medidas de seguridad y prevención de riesgos ............................................................................. 50
2.4
Telefonía móvil y su criptografía .................................................................................................... 51
2.5
Debilidades en la Seguridad ........................................................................................................... 52
CAPITULO III Criterios y elección de un algoritmo criptográfico para dispositivos móviles ........................... 57
3.1
Retos a superar con la elección ...................................................................................................... 57
3.1.1 Creciente capacidad de cómputo de los computadores modernos. .............................................. 57
3.1.2 Recursos Computacionales. ........................................................................................................... 58
3.1.3 Incremento de dispositivos móviles............................................................................................... 58
3.1.4 Velocidad en el proceso de encriptación y desencriptación. ........................................................ 58
3.1.5 Comparativa energética entre los dispositivos móviles con mayor cuota del mercado. ............... 59
3.2
Fundamentación de la elección ..................................................................................................... 63
3.2.1 Criterios de elección del algoritmo base AES ................................................................................. 63
3.2.2 Algoritmo simétrico ....................................................................................................................... 63
3.2.3 Análisis y comparativa de algoritmos simétricos .......................................................................... 64
3.2.4 Algoritmo elegido AES: Conceptos básicos ................................................................................... 72
3.2.5 Desarrollo....................................................................................................................................... 74
3.2.6 Seguridad de AES .......................................................................................................................... 74
3.2.7 Funcionamiento básico del algoritmo elegido: AES ....................................................................... 76
CAPITULO IV Propuesta de mejoras al algoritmo ............................................................................................ 81
4.1
Entorno de trabajo ......................................................................................................................... 82
4.1.1 Microprocesador para móviles ..................................................................................................... 82
5|Página
4.1.2 Kit de desarrollador ARM- Keil uVision4 ....................................................................................... 82
4.1.3 Lenguaje de programación C ......................................................................................................... 83
4.1.4 Rijndael Inspector 1.1 .................................................................................................................... 83
4.1.5 Battery Monitor Widget ................................................................................................................ 84
4.2
Implementación de AES ................................................................................................................. 85
4.2.1 Funcionamiento del programa ....................................................................................................... 85
4.2.2 Distribución del programa ............................................................................................................. 86
4.3
Mejoras de rendimiento ................................................................................................................ 88
4.3.1 Complejidad temporal del Algoritmo ............................................................................................ 89
4.3.2 Análisis del algoritmo AES .............................................................................................................. 89
4.3.3 Implementación de las mejoras ..................................................................................................... 92
4.3.4 Rendimiento tras la aplicación de todas las mejoras ................................................................... 106
4.3.5 Mejoras al Consumo de energía .................................................................................................. 111
4.4
Propuestas a futuro de mejoras para la seguridad....................................................................... 112
4.4.1 Obtención de números aleatorios ............................................................................................... 113
4.4.2 Uso de máscaras aleatorias.......................................................................................................... 114
Conclusiones .................................................................................................................................................. 116
Glosario ......................................................................................................................................................... 120
Bibliografía..................................................................................................................................................... 123
Anexos ........................................................................................................................................................... 133
Anexos ........................................................................................................................................................... 133
Resultados de las rondas del algoritmo AES al funcionar con una matriz de ejemplo ............................. 133
Modificaciones .............................................................................................................................................. 134
Modificaciones: Archivo main.h ................................................................................................................ 134
6|Página
Modificaciones: aes.h ................................................................................................................................ 134
Modificaciones: main.c ............................................................................................................................. 135
Modificaciones: aes.c ................................................................................................................................ 141
Tablas S-Box ............................................................................................................................................... 150
Código fuente de la implementación del algoritmo Aes. .......................................................................... 151
Main.c ................................................................................................................................................... 151
Aes.c ...................................................................................................................................................... 157
Main.h ................................................................................................................................................... 172
Aes.h ..................................................................................................................................................... 172
7|Página
Índice de figuras
Figura 1-1 Escítala espartana ........................................................................................................................... 20
Figura 1-2 Disco de Alberti .............................................................................................................................. 22
Figura 1-3 Cuadro de Vigenère ........................................................................................................................ 23
Figura 1-4 Máquina Enigma ............................................................................................................................ 24
Figura 1-5 Bombe de Turing ............................................................................................................................ 25
Figura 1-6 Colossus .......................................................................................................................................... 25
Figura 1-7 Eniac ............................................................................................................................................... 26
Figura 1-8 Criptografía ..................................................................................................................................... 31
Figura 1-9 Esquema de los algoritmos de clave secreta .................................................................................. 35
Figura 1-10 Esquema de algoritmos de clave pública ..................................................................................... 38
Figura 2-1 Criptografía en redes GSM ............................................................................................................. 51
Figura 3-1: Promedio en Mbits/s para distintas computadoras con true crypt ............................................... 66
Figura 3-2 Tiempo de ejecución en cada prueba por algoritmo en la herramienta CyaSSL .......................... 67
Figura 3-3 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta Cryptool ...... 68
Figura 3-4 Comparativa en función del software (en Mbits/s) ........................................................................ 70
Figura 3-5 Rendimiento promedio en Mbits/s de todos los algoritmos analizados en los correspondientes 5
equipos ............................................................................................................................................................ 71
Figura 3-6 Proceso de encriptación del algoritmo AES .................................................................................... 72
Figura 3-7 Diagrama general del algoritmo AES y su funcionamiento ............................................................ 77
Figura 3-8 Función Addround .......................................................................................................................... 78
Figura 3-9 Función Bytesub ............................................................................................................................. 78
Figura 3-10 Función Shiftrows ......................................................................................................................... 78
Figura 3-11 Función MixColumns .................................................................................................................... 79
8|Página
Figura 3-12 Proceso de descifrado del Algoritmo AES ................................................................................... 79
Figura 4-1 Pantalla principal del software KeilUvision .................................................................................... 82
Figura 4-2 Pantalla principal de Battery Monitor Widget................................................................................ 84
Figura 4-3 Diagrama de funcionamiento del algoritmo .................................................................................. 85
Figura 4-4 Proceso para un bloque de cifrado dependiendo del tamaño de clave ........................................ 90
Figura 4-5 Generación de claves transpuestas ............................................................................................... 95
Figura 4-6 : Tiempo total de cifrado de un bloque ........................................................................................ 107
Figura 4-7: Tiempo total de descifrado de un bloque ................................................................................... 107
Figura 4-8 Rendimiento de las mejoras en un bloque .................................................................................. 108
Figura 4-9 Rendimiento total de las mejoras con 10 bloques....................................................................... 109
Figura 4-10 eficiencia durante el proceso de descifrado .............................................................................. 110
9|Página
Índice de Tablas
Tabla 1-1 Comparativa entre criptografía simétrica y asimétrica .................................................................... 41
Tabla 2-1 Empresas líderes en el mercado móvil ............................................................................................ 44
Tabla 2-2 Sistemas operativos lideres para mercado móvil ............................................................................ 45
Tabla 2-3 Malware principal para telefonía móvil ........................................................................................... 48
Tabla 2-4 Malware atacante en sistema operativo Android ............................................................................ 49
Tabla 2-5 Medidas de seguridad ...................................................................................................................... 50
Tabla 3-1 Velocidad de los algoritmos de Encriptación. .................................................................................. 59
Tabla 3-2 Rendimiento de batería y especificaciones de móviles con mayor afluencia en el mercado actual
(año 2012-2013) .............................................................................................................................................. 60
Tabla 3-3 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta truecrypt ........ 66
Tabla 3-4 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta CyaSSL ............ 67
Tabla 3-5 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta Cryptool ........ 67
Tabla 3-6 Resultados Finales: Uniendo las tres herramientas. Unidad/MB-S .................................................. 70
Tabla 3-7 Velocidad promedio en Mbits/s de todos los algoritmos analizados en los correspondientes 5
equipos ............................................................................................................................................................ 71
Tabla 4-1 parámetros de inicialización ............................................................................................................ 86
Tabla 4-2 resumen de funciones de la implementación del algoritmo AES ..................................................... 86
Tabla 4-3 Medición del tiempo en cada función del algoritmo AES medidos en microsegundos (µs) ............ 90
Tabla 4-4 Mejoras de rendimiento en la extracción de datos.......................................................................... 94
Tabla 4-5 Mejoras en la función keyexpansion ................................................................................................ 96
Tabla 4-6 Mejoras Addroundkey ...................................................................................................................... 97
Tabla 4-7 Mejoras subBytes(). ......................................................................................................................... 98
Tabla 4-8 Mejoras en ShiftRows ...................................................................................................................... 99
10 | P á g i n a
Tabla 4-9 Pasos de mixcolumns .................................................................................................................... 100
Tabla 4-10 Mejoras en mixcolumns ............................................................................................................... 101
Tabla 4-11 Mejoras en invshiftrows ............................................................................................................... 102
Tabla 4-12 Mejoras en inv subytes ................................................................................................................ 102
Tabla 4-13 Mejoras invMixColumns(). ........................................................................................................... 105
Tabla 4-14 Tiempo total cifrando un bloque ................................................................................................. 106
Tabla 4-15 Uso de la batería antes y después de las mejoras en miliamperios ............................................. 112
11 | P á g i n a
Agradecimientos
Al término de este trabajo que ahora presento como culminación de todo el esfuerzo, desvelos y lágrimas
que conllevó, no puedo dejar de lado a las personas que me han apoyado durante todo este proceso y que
con sus cuidados y consejos han sido participes de este logro:
A mis padres con todo mi cariño y mi amor; las personas que hicieron todo en la vida para que yo pudiera
lograr mis sueños, por motivarme y darme la mano cuando sentía que el camino se terminaba, a ustedes por
siempre mi corazón y mi agradecimiento. A mi madre la Lic. Rosa Lilia Meza Torres por ser siempre el
ejemplo, guía y ángel guardián que necesitaba en los momentos más oscuros de agonía y desesperación. A
mi padre el Lic. Javier Galvez Zarazúa por sus consejos, apoyo y enseñanzas a lo largo de mi vida; A ambos
por que fueron los primeros maestros que tuve y cada palabra y acción han sido lecciones que han forjado lo
que ahora soy.
A mis hermanas Lilia Alejandra y Leslie Jackeline, con quienes tengo un vínculo invaluable, agradeciendo su
apoyo y ayuda incondicional en los momentos en los que la incertidumbre me ganaba la partida. Por sus
sempiternas conversaciones sobre cualquier tema y su efectiva mansedumbre en mis días más hastiosos.
A mi Familia quienes siempre han pensado lo mejor de mí, creyendo en mi capacidad aun cuando yo misma
dudaba de ella.
Al Dr. Eric Manuel Rosales Peña Alfaro por sus consejos y guía en la realización de esta tesis y en mi
desarrollo académico, por ser un ejemplo de un profesional comprometido y ávido de conocimiento; un gran
modelo a seguir. Al Dr. Mauricio Procel Moreno por guiarme desde el inicio de la maestría, por su interés y
por compartir todo su conocimiento y su tiempo con mis ilimitadas dudas. A mis profesores, que en este
andar por la vida, influyeron con sus lecciones y experiencias en formarme como una persona de bien y
preparada para los retos que pone la vida.
A mis amigos que han sido protagonistas de los ratos más amenos y divertidos que guardo en mi memoria.
Finalmente, mis agradecimientos a todo el cuerpo docente y administrativo de UPIICSA del Instituto
Politécnico Nacional por su guía y conocimientos trasmitidos. Los llevare siempre como una parte de mi y
espero enorgullecer a la alma mater que me abrió sus puertas permitiéndome convertirme en una
profesional que enaltezca el nombre del IPN.
Nancy Paola Gálvez Meza
12 | P á g i n a
Resumen
La presente tesis se enmarca dentro del estudio y desarrollo de algoritmos criptográficos para dispositivos
móviles. Concretamente, se enfoco en el desarrollo de una mejora en la implementación del algoritmo AES
en un dispositivo móvil (teléfono celular) con arquitectura ARM de 32 bits. Se realizó un análisis de los
Algoritmos más utilizados con respecto a su desempeño (en tiempo y seguridad) y tras elegir el algoritmo
más idóneo (AES) se han aplicado diversas técnicas para mejorar su implementación de manera que se
ahorren al máximo los recursos limitados que un dispositivo móvil posee.
Para lograr reducir el tiempo de procesamiento se han aplicado técnicas específicas, como el Loop unrolling
y transposición de matrices, con las que se ha conseguido reducir el tiempo de procesamiento en un
aproximado de 50% en la operación de cifrado y un 80% en la operación de descifrado.
En conclusión, con estas mejoras se logra extender la vida de la batería permitiendo que el dispositivo móvil
pueda tener una mejor administración de sus recursos y al tratarse de una mejora sobre una
implementación, no se toca la estructura o seguridad del algoritmo en cuestión.
Palabras clave: Arquitectura móvil, dispositivos móviles, algoritmos criptográficos, AES, cifrado, seguridad,
eficiencia, mejora, ARM.
13 | P á g i n a
Abstract
The present thesis places inside the study and development of cryptographic algorithms for mobile devices.
Concretely, It focus in the development of an improvement in the implementation of the algorithm AES in a
mobile device (cell phone) with ARM architecture over 32 bits. There was done an analysis of the most used
Algorithms regard to the performance (in time and safety) and, after choosing the most suitable algorithm
(AES), there have applied diverse technologies in order to improve the implementation so it can save the
maximum of the limited resources that a mobile device possesses.
To manage to reduce the time of processing specific technologies have been applied, as the Loop unrolling
and transposition of matrices,
it has managed to reduce the time of processing in about 50 % in the
operation of coding and 80 % in the operation of deciphered.
In conclusion, with these improvements it is achieved to extend the battery life allowing that the mobile
device could have a better administration of his resources and being itself an improvement on an
implementation there does not touch the structure or security of the algorithm in question.
Key words: Mobile Architecture, Mobile devices, Cryptographic algorithms, AES, coding, security, efficiency,
improvement, ARM.
14 | P á g i n a
Introducción
Diariamente más dispositivos móviles (como teléfonos celulares, tabletas, PDAs, tarjetas inteligentes, por
mencionar algunos) se conectan a redes inalámbricas, ya sea para realizar consultas o transacciones
comerciales. Sin embargo, los dispositivos móviles son aún más inseguros que los tradicionales teléfonos
debido a que utilizan el aire para transmitir la comunicación, por tanto cualquier persona está en posibilidad
de alterarla o robarla. Por lo anterior es necesario tener herramientas altamente confiables y eficientes que
permitan proteger los datos y así satisfacer las demandas de seguridad de los usuarios.
En los últimos años, la telefonía móvil ha redefinido la forma de comunicación entre las personas. Los
dispositivos electrónicos han evolucionado vertiginosamente en potencia, rendimiento y sobre todo en
nuevas funcionalidades.
En consecuencia, si bien las innovaciones en tecnología para dispositivos móviles vienen a simplificar
muchas tareas diarias que en otro caso requerirían de un equipo de escritorio o portátil, también quedan
expuestos a riesgos de seguridad.
Según recientes investigaciones, el 55% de los empleados almacenan archivos importantes de su trabajo,
correos electrónicos y documentos privados sin seguridad alguna. Un 40% almacenan sus archivos fuera de
la red de la empresa, un 21% en memorias USB, 14% en sus computadoras personales y un 9% en celulares y
PDAs.
Además de eso, las pérdidas por delitos informáticos ascienden a miles de millones de pesos al año lo cual
es un número alarmante si tomamos en cuenta el auge que han tenido los pagos por medios móviles.
Sin embargo, a medida que el poder de cómputo y la memoria varían de un dispositivo a otro también lo
hace el nivel de protección a la que puede acceder. La criptografía juega un papel sumamente importante en
ésta protección por tanto, esta tesis pretende delimitar cual es el mejor algoritmo para implementar en uno
de estos dispositivos y a su vez proponer mejoras en su desempeño y sin sacrificar la seguridad. La premisa
es lograr una mejora sin sacrificar la batería del teléfono ya que ésta es la que debe dar vida a todo el
sistema y su uso debe ser prioritario.
El primer capítulo dará una semblanza histórica a la criptografía y su evolución, así como los tipos de
criptografía existentes y los conceptos básicos que se usaran a lo largo de este documento.
En el segundo capítulo nos centraremos en la criptografía aplicada a los teléfonos celulares, la arquitectura
que estos usan (en su gran mayoría ARM) y sus elementos determinantes.
15 | P á g i n a
Posteriormente, en el tercer capítulo Se analizarán diferentes tipos algoritmos de cifrado y se elegirá aquel
que represente una mejor opción para un teléfono de lo que se le conoce como gama baja-media que
usualmente usan procesadores de arquitectura ARM.
Por último, una vez elegido y probado se procederá, en el cuarto capítulo, a proponer mejoras sobre su
implementación y hacer pruebas básicas que denoten resultados positivos en el algoritmo mejorando el
cálculo y por tanto su velocidad con menos recursos.
16 | P á g i n a
Objetivos
Determinar cuál es el mejor algoritmo criptográfico tomando como base su posibilidad de implementación
en dispositivos móviles y seguridad que este posea. Proponer mejoras en la implementación del mismo para
lograr un balance entre velocidad y consumo energético sin sacrificar la seguridad ni la integridad del
algoritmo con el fin de obtener una adecuada utilidad para el usuario de cómputo móvil.
Objetivos Particulares:

Atender los actuales requerimientos de los dispositivos móviles en cuanto a poder de cómputo y
seguridad se refiere.

Proponer mejoras, en caso de existirlas, para el algoritmo más idóneo elegido por la investigación
de manera que sea aplicable en al menos el 80% de los teléfonos móviles tipo smartphone del
mercado actual, dentro de la arquitectura ARM y pertenecientes a la gama baja-media.
17 | P á g i n a
18 | P á g i n a
CAPITULO I
Fundamentos y Preliminares
En la actualidad la demanda de cómputo móvil ha ido en aumento. Dado que el valor de los datos que se
manejan en dispositivos móviles varía con respecto a cada usuario, es necesario contar con herramientas
eficientes para protegerla, tanto en el dispositivo móvil como cuando se transmite en una red inalámbrica.
En este capítulo se explican algunos conceptos básicos de criptografía y los algoritmos que la constituyen,
las ventajas y desventajas de la criptografía de llave secreta, de la criptografía de llave pública y un
panorama general del proceso de autenticación básica.
1.1 Introducción Histórica
Desde los tiempos más remotos, las personas han utilizado diversos métodos con el fin de lograr que un
mensaje no llegara a manos de personas no autorizadas a leerlo. Algunos de los testimonios más antiguos
sobre la escritura oculta que se conocen se remontan a Heródoto quien hizo una crónica de los conflictos
entre Grecia y Persia en el siglo V a.C. Fue este método el que salvó a Grecia de ser ocupada por Jerjes, Rey
de Reyes persa. [10, 11, 28, 34, 64, 114]
Heródoto cuenta en su crónica que Demarato, un griego exiliado en la ciudad Persa de Susa, tuvo
conocimiento de los preparativos de Jerjes para atacar Grecia y decidió alertar a los espartanos mediante un
mensaje oculto en tablillas de madera. El método de ocultación consistió en retirar la cera de las tablillas,
escribir el mensaje y luego volver a cubrir con cera ocultando de esta manera los planes persas que estaban
escritos debajo de ella.
En los dos mil años que han transcurrido desde Heródoto, diversas formas de ocultación de mensajes han
sido utilizadas por todo el mundo. Por ejemplo, en la China antigua se escribían mensajes sobre seda fina,
que luego era aplastada hasta formar una pelotita diminuta que se recubría de cera. Entonces, el mensajero
se tragaba la bola de cera. En el siglo XV, el científico italiano Giovanni Porta describió una antigua técnica
para esconder mensajes dentro de un huevo cocido haciendo una tinta con una mezcla de una onza de
alumbre y una pinta de vinagre, y luego escribiendo en la cáscara.
La solución penetra a través de la cáscara porosa y deja un mensaje en la superficie del huevo duro, que sólo
se puede leer si se pela el huevo. La ocultación de la información ofrece sin duda un nivel de seguridad, pero
adolece de una debilidad fundamental. Si se descubre el mensaje, el contenido de la comunicación secreta
se revela en el acto, es decir, interceptar el mensaje compromete inmediatamente toda la seguridad. Por
19 | P á g i n a
eso, paralelamente al desarrollo de la ocultación de mensajes, se produjo la evolución de la criptografía,
término derivado de los vocablos griegos “kryptos” que significa oculto y “graphein” que significa escritura.
El objetivo primordial de la criptografía es que si el enemigo intercepta un mensaje cifrado, éste es
ininteligible ya que no se busca ocultar la existencia del mensaje si no de su significado y de esta manera
dotar a la comunicación de seguridad; A éste proceso se le conoce como cifrado.
La criptografía clásica utiliza fundamentalmente técnicas de transposición y sustitución. En la transposición,
las letras del mensaje simplemente se colocan de otra manera, generando así un anagrama. Para que esta
transposición sea efectiva, la combinación de letras necesita seguir un sistema sencillo, establecido
previamente por el emisor y el receptor. Como ejemplo se tiene la transposición de “riel”, en la que el
mensaje se escribe alternando las letras en dos líneas separadas:
Tu secreto es tu prisionero; si lo sueltas, tu eres su prisionero
tsceosursoeoiiulateespiinr
u e r t e t p i i n r s l s e t s u r s u r s o e o.
Otra forma de transposición es la producida en el primer aparato criptográfico militar de la Historia, la
escítala espartana (siglo V a.C.). Se trata de una vara de madera sobre la que se enrosca una tira de cuero o
pergamino, tal como se muestra en la figura 1.1. El emisor escribe el mensaje a lo largo de la longitud de la
escítala y luego desenrosca la tira, que ahora parece llevar una lista de letras sin sentido. Para recuperar el
mensaje, el receptor simplemente enrosca la tira de cuero en torno a una escítala del mismo diámetro que
el usado por el emisor. La alternativa a la transposición es la sustitución. Una de las descripciones más
antiguas de cifrado por sustitución aparece en el Kamasutra, donde se recomienda a las mujeres que
estudien el arte de la escritura secreta, proponiéndoles emparejar al azar las letras del alfabeto y
posteriormente sustituir cada letra del mensaje original por su pareja. Esta forma de escritura secreta se
conoce como cifrado por sustitución dado que cada letra del texto llano se sustituye por una letra diferente.
La diferencia entre transposición y sustitución radica en la identidad y posición de cada letra, mientras que
en la transposición se cambia la posición manteniendo la identidad, en la sustitución es la identidad la que
varía.
Figura 1-1 Escítala espartana
20 | P á g i n a
El primer uso documentado de un cifrado de sustitución con propósitos militares aparece en La Guerra de
las Galias, de Julio Cesar (año 100-49 a.C.). César utilizó la escritura secreta tan frecuentemente que Valerio
Probo escribió un tratado entero acerca de sus cifrados, que desgraciadamente no ha sobrevivido. Sin
embargo, gracias a la obra de Suetonio, “Vidas de los Césares LVI”, escrita en el siglo II de nuestra era,
tenemos una descripción detallada de uno de los tipos de cifrado de sustitución utilizado por César. El
emperador sencillamente sustituía cada letra del mensaje con la letra que está tres lugares más adelante en
el alfabeto. Este método es llamado “cifrado César”. Aunque Suetonio sólo menciona un cambio del César
de tres lugares, es evidente que al utilizar cualquier cambio de entre 1 y 25 lugares es posible generar 25
cifrados diferentes.
El algoritmo de sustitución tiene la ventaja de su sencillez a la hora de ponerlo en práctica, a su vez ofrece
un alto nivel de seguridad. Esta simplicidad y fortaleza hicieron que el cifrado de sustitución dominara el
arte de la escritura secreta a lo largo del primer milenio de nuestra era.
El gran paso adelante sucedió en Oriente. Los eruditos árabes fueron capaces de encontrar un método para
descifrar la cifra de sustitución mono alfabética, descubriendo que algunas letras son más corrientes que
otras. Esta observación aparentemente inocua conduciría al primer gran avance hacia el criptoanálisis.
Los monjes europeos comenzaron a redescubrir viejas cifras de sustitución, inventaron otras nuevas y
ayudaron a reintroducir la criptografía en la civilización occidental. Así, en el siglo XIV el uso de la
criptografía se había extendido considerablemente.
El primer gran criptoanalista europeo fue Giovanni Soro, nombrado secretario de cifras en Venecia en 1506.
La reputación de Soro se extendió por toda Italia y fueron muchos los mensajes que llegaron a sus manos
para ser descifrados.
Incumbía a los criptógrafos inventar un nuevo cifrado más sólido, algo que pudiese desconcertar a los
criptoanalistas. Dicho cifrado surgió a finales del siglo XVI y su creador fue el polifacético erudito Florentino
León Battista Alberti. Una conversación sobre criptografía incitó a Alberti a escribir un ensayo sobre este
tema, esbozando lo que él consideraba una nueva forma de cifra. Alberti propuso utilizar dos o más
alfabetos cifrados, alternando entre ellos durante el cifrado, confundiendo de esta manera a los potenciales
criptoanalistas (figura 1.2).
21 | P á g i n a
Figura 1-2 Disco de Alberti
A pesar de que Alberti había dado con el avance más significativo en más de mil años, no logró convertirlo
en un sistema plenamente formado. Fueron varios los intelectuales que estudiaron este sistema pero fue
finalmente Blaise de Vigenère, un diplomático francés nacido en 1523, quién dio con un nuevo cifrado,
coherente y poderoso.
Al nuevo método se le conoce como “cifrado de Vigenère” y su fuerza radica en que no utiliza uno, sino 25
alfabetos de cifrado distintos para ocultar un mensaje. El primer paso del cifrado era trazar lo que se
denomina un cuadro Vigenère, tal y como se muestra en la figura 1.3. Se trata de un alfabeto llano seguido
de 25 alfabetos de cifrado, donde cada uno de ellos comienza en la siguiente letra que el anterior. De esta
forma, la línea 1 representa un alfabeto cifrado con un cambio César de una posición, la segunda línea con
un cambio César de dos posiciones, y así sucesivamente. Se puede cifrar cada letra del texto llano según uno
de los 25 alfabetos cifrados.
La gran ventaja de la cifra Vigenère es que resulta inexpugnable para el análisis de frecuencia. El hecho de
que una letra que aparece varias veces en el texto cifrado pueda representar en cada ocasión una letra
diferente del texto llano genera una ambigüedad tremenda para el criptoanalista. La cifra Vigenère
pertenece a una clase conocida como poli alfabética puesto que emplea varios alfabetos en cada mensaje.
22 | P á g i n a
Figura 1-3 Cuadro de Vigenère
Uno de los padres del criptoanálisis del siglo XIX es Charles Babbage, quien descifró el cifrado de Vigenère.
El criptoanálisis de Babbage consistió en buscar secuencias de letras que aparecían más de una vez en el
texto cifrado. Lo más probable es que la misma secuencia de letras del texto llano haya sido cifrada usando
la misma parte de la clave.
Gracias a los avances realizados por Charles Babbage y Friedrich Kasiski, la cifra Vigenère ya no era segura,
por lo que los criptógrafos trataron de diseñar nuevos métodos de cifrado.
Al finalizar la primera guerra mundial, el comandante Joseph Mauborgne, jefe de la investigación
criptográfica del ejército de Estados Unidos, introdujo el concepto de la clave aleatoria. Se trataba de una
clave que no poseía palabras reconocibles, sino letras mezcladas al azar y las utilizó como parte de la cifra
Vigenère para proporcionar un nivel de seguridad sin precedentes. [103-106].
En 1918 el inventor alemán Arthur Scherbius desarrolló una máquina criptográfica denominada Enigma
(figura 1.4) que era esencialmente una versión eléctrica del disco de cifras de Alberti. La forma básica del
invento de Scherbius consiste en tres elementos conectados por cables: un teclado para escribir cada letra
de texto llano, una unidad modificadora que cifra cada letra de texto llano en la correspondiente letra de
texto cifrado y por último un tablero expositor consistente en varias lámparas que indica la letra de texto
cifrado. El invento de Scherbius proporcionó al ejército alemán el sistema criptográfico más seguro del
mundo.
23 | P á g i n a
Figura 1-4 Máquina Enigma
Por ello al estallar la segunda guerra mundial sus comunicaciones estaban protegidas con un nivel de cifrado
sin precedentes. Los estadounidenses y los franceses intentaron abordar el descifrado de la máquina Enigma
pero sus tentativas resultaron infructuosas.
Un alemán, Hans-Thilo Schmidt jefe del personal de cuerpo de señales del ejército, vendió información
secreta sobre Enigma a las potencias extranjeras y gracias a esta traición, los aliados pudieron crear una
réplica exacta de esta máquina. Sin embargo, esto no resultó suficiente para permitirles descifrar mensajes
cifrados por Enigma. Los franceses e ingleses estaban convencidos que era imposible encontrar la clave
requerida para descifrar un mensaje Enigma concreto, por lo que entregaron a sus aliados, los polacos, las
fotografías de los documentos de Schmidt y dejaron la imposible tarea de descifrar Enigma en manos de un
equipo de científicos capitaneados por Rejewski.
La estrategia de Rejewski para atacar Enigma se centró en el hecho de que la repetición es el enemigo de la
seguridad, esta repetición conduce a patrones y es el arma favorita de los criptoanalistas.
Su equipo realizó la tarea de probar cada una de las 105,456 posiciones de los modificadores, catalogando la
longitud de las cadenas generadas por cada una de ellas. Esta tarea requirió un año de labor, pero una vez
recopilados todos los datos, Rejewski finalmente comenzó a descifrar Enigma, ya que podía encontrar la
clave del día antes que acabara el propio día.
Al ir evolucionando la máquina Enigma se buscaban nuevos métodos de criptoanálisis, pero fue Alan Turing
quien identificó el punto más débil de Enigma. Llegó a la conclusión de que había puntales en los
criptogramas que son fragmentos de texto llano. Estos pueden asociarse a fragmentos de texto cifrado lo
24 | P á g i n a
que resultaba una forma extraordinaria de criptoanálisis.
Además de la máquina utilizada para derrotar el cifrado de Enigma (llamada bombes de Turing, figura 1.5),
los británicos desarrollaron otro instrumento de descifrado: Colossus (figura 1.6), utilizado para combatir el
llamado código Lorenz que se empleaba para cifrar las comunicaciones más importantes de la inteligencia
alemana y su funcionamiento era parecido al de la máquina Enigma pero con una complejidad muy
superior.
Figura 1-5 Bombe de Turing
Figura 1-6 Colossus
Colossus junto con los documentos de su diseño fueron destruidos después de la guerra y a todo aquel que
trabajó en este o en cualquier otro proyecto de Bletchley Park se les prohibió dar información. Los planos
del primer PC de la historia se perdieron para siempre. Su lugar fue ocupado por el proyecto ENIAC (figura
1.7), desarrollado en la Universidad de Pensilvana de los Estados Unidos. A partir de entonces los
criptoanalistas comenzaron a utilizar y comprender la potencia que las maquinas proporcionaban para
descifrar cualquier tipo de cifra.
25 | P á g i n a
Figura 1-7 Eniac
En principio, el cifrado con estas grandes máquinas estaba restringido a los gobiernos y al ejército, sin
embargo, una serie de avances científicos y tecnológicos durante las siguientes décadas, permitieron que
este cifrado por PC fuera asequible para el público en general.
Durante la década de 1970 se produjo el primer microprocesador y con él sobrevino una nueva generación
de máquinas más pequeñas y que podían ser operadas por una sola persona: Las computadoras personales.
Éstas, con el paso de los años, bajaron de precio y se comercializaron en mayor número. Numerosas
empresas comenzaron a utilizarlas para cifrar sus mensajes privados, lo que creó un nuevo problema: la
estandarización. Una compañía podía usar un sistema de cifrado en particular para garantizar la seguridad
de sus comunicaciones internas, pero no podía enviar un mensaje oculto a una organización externa a no
ser que el receptor usara el mismo sistema de cifrado. Finalmente, el 15 de mayo de 1973, la Oficina
Nacional de Estándares norteamericana planeó resolver el problema y solicitó propuestas de cifrado
estándar que permitieran a las empresas comunicarse entre sí. El 23 de noviembre de 1976 se adoptó un
estándar de cifrado con una longitud de clave de 56 bits, dándole el nombre de DES [88]. Superado el
problema de la estandarización, se planteó una nueva dificultad: un método seguro de distribución de
claves.
Fueron Whitfield Diffie y Martin Hellman [36, 35] quienes iniciaron el camino hacia la resolución de este
problema. En la primavera de 1976 Hellman presentó una estrategia para el problema de la distribución de
claves. Demostró que el emisor y el receptor podían acordar una clave sin necesidad de reunirse,
deshaciendo así un axioma que había durado siglos. La idea de Hellman se basaba en una función
unidireccional de la forma IndG (y) = x(mod P). Había conseguido invalidar uno de los axiomas menos
cuestionados de la criptografía y ahora solo se necesitaba que otro perfeccionara el sistema de distribución
de claves para hacerlo más eficaz.
Paralelamente al trabajo de Hellman, Diffie había estado probando otro tipo de enfoque para la resolución
del problema de distribución de claves. Descubrió un nuevo tipo de cifra: la clave asimétrica. Hasta ese
momento las técnicas de cifrado utilizadas habían sido simétricas, es decir, tanto el emisor y el receptor
26 | P á g i n a
utilizaban la misma clave para cifrar y descifrar el mensaje. Sin embargo, en un sistema de clave asimétrica,
la clave de cifrado y la de descifrado no son idénticas. Fueron tres investigadores del laboratorio de
informática del MIT (Massachussets Institute of Technology), Ronald Rivest, Adi Shamir y Leonard Adleman,
quienes consiguieron encontrar una función que convirtiera la teoría de la clave pública en un instrumento
práctico y eficaz. Este sistema se denomina RSA en honor a sus tres descubridores Rivest, Shamir y Adleman
[103].
En 1984 T. ElGamal creó otro criptosistema cuya seguridad se basa en una función unidireccional
denominada logaritmo discreto, que todavía no ha podido resolverse de forma eficiente [37].
Las matemáticas proporcionan las herramientas adecuadas para la creación de algoritmos de ocultación de
información. Así, algunas de las áreas de las matemáticas que se han usado (y se usan) para crear
criptosistemas [18] son:
1. En 1970 R. J. McEliece desarrolló un criptosistema de clave pública basado en códigos detectores correctores de errores [78, 79].
2. En los años 80 V. Varadharajan propuso distintas estructuras de anillos que pueden ser aplicados en
la generalización del sistema RSA [92].
3. En 1984 Lidl y Müller proponen polinomios de permutación [73].
4. En 1985, de forma independiente V. Miller [84] y N. Koblitz [67,68] usan la teoría de curvas elípticas
para crear criptosistemas. Estas curvas fueron propuestas por Lenstra para factorizar números
enteros.
5. En 1988 J. Buchmann y H. Williams proponen usar campos cuadráticos reales e imaginarios [25,
107].
6. En 1995 R. Scheidler y H. Williams usan campos ciclotómicos [108].
Por último, existe otro tipo de protocolos que usa la teoría de incertidumbre y se le conoce como
criptografía cuántica [14, 19, 17].
27 | P á g i n a
1.2 Conceptos Básicos
1.2.1 Seguridad de la información
Hay muchas formas de clasificar los servicios y mecanismos que proporcionan seguridad a los sistemas
informáticos. Una de las clasificaciones que más se utilizan es la que se recoge en el estándar internacional
“ISO 7498-2, Arquitectura de Seguridad”, cuyas definiciones y términos se han extendido ampliamente.
Desde el punto de vista de esta norma, los servicios de seguridad son:
(a) Autenticación. Es la identificación ante un sistema, subsistema, red o aplicación, mediante algún
mecanismo o combinación de mecanismos. Una vez que una entidad se ha autenticado puede que necesite
volver a autenticarse para otros fines.
Algunos mecanismos de autenticación son:

Nombre de usuario y contraseña.

Tickets de acceso.

Certificados digitales.

Tarjetas inteligentes

Tokens (Fichas).

Dispositivos biométricos.
(b) Control de acceso. Protege contra el uso no autorizado de recursos. Generalmente, hay un orden
implícito, según el cual una entidad primero se identifica y autentifica y a continuación se le proporciona el
acceso o se le niega, basándose en mecanismos de control de acceso asociados a las credenciales de la
entidad. Cada entidad tiene sus permisos de acceso a cada recurso especificado.
Ejemplos de dichos mecanismos son:

Listas de control de acceso.

Etiquetas de seguridad.

Roles.

Barreras físicas.

Firewalls.
28 | P á g i n a
(c) Confidencialidad. Consiste en proteger los datos trasmitidos o almacenados de difusiones no
autorizadas. Este aspecto de la seguridad se ha vuelto cada vez más importante puesto que cada vez mayor
cantidad de información se trasmite sobre redes inseguras y cada vez mayor volumen de información
sensible llega a los equipos menos protegidos de una red. Se debe asumir que la red no es fiable y que la
información trasmitida puede ser interceptada. En la actualidad el cifrado de la información es la principal
herramienta utilizada para conseguir la confidencialidad.
(d) Integridad de Datos. Consiste en detectar cuando los datos almacenados o trasmitidos han sido
modificados, borrados o reproducidos.
(e) No rechazo. Consiste en asociar la identidad de un individuo con su participación en un proceso. Los
mecanismos de no rechazo proporcionan pruebas de un intercambio digital significativo de algún tipo.
(f) Gestión. Consiste en la administración y gestión de los mecanismos asociados con
las categorías de
seguridad.
1.2.2 Criptografía
La palabra criptología proviene de las palabras griegas Krypto y Logos, y significa estudio de lo oculto. Una
rama de de la criptología es la criptografía (Kryptos y Graphos que significa descripción), que se ocupa del
cifrado de mensajes. Esta se basa en que el emisor emite un mensaje en claro, que es tratado mediante un
cifrador con la ayuda de una clave, para crear un texto cifrado. Este texto cifrado, por medio de un canal de
comunicación establecido, llega al descifrador que apoyándose en diversos métodos como veremos más
adelante, extrae el texto original.
Una definición básica para la criptografía se puede encontrar En el libro “Aplicaciones criptográficas” de la
Universidad de Madrid, la cual plantea que es la ciencia que estudia los métodos y procedimientos para
modificar los datos, con objeto de alcanzar las características de seguridad.
1
Las principales características que un sistema de seguridad quiere obtener son:

Confidencialidad. Consiste en verificar que sólo las personas autorizadas tienen acceso a la
información.
1
“Aplicaciones Criptográficas” segunda edición de junio de 1999, ISBN 83-87238-57-2, publicado por el departamento de Publicaciones
de la Escuela Universitaria de Informática de la Universidad Politécnica de Madrid, España.
29 | P á g i n a

Integridad. Consiste en garantizar que el documento original no ha sido modificado. El documento
puede ser tanto público como confidencial.

Autenticación. Permite garantizar la identidad del autor de la información.
Según explica Jorge Ramió Aguirre en su libro “Cifrado de comunicaciones digitales”2 la criptografía es:
“Rama inicial de las Matemáticas y en la actualidad de la Informática y la Telemática, que hace uso de
métodos y técnicas con el objeto principal de cifrar y/o proteger un mensaje o archivo por medio de un
algoritmo, usando una o más claves. Esto da lugar a diferentes tipos de sistemas de cifra que permiten
asegurar estos cuatro aspectos de la seguridad informática: la confidencialidad, la integridad, la
disponibilidad y el no repudio de emisor y receptor.”
Que como podemos pensar es una descripción mucho más acertada que la que nos podemos encontrar en
muchos libros, así como la definición que nos hace la Real Academia de la Lengua RAE.
La palabra criptografía sólo hace referencia al uso de códigos, por lo que no engloba las técnicas que se usan
para romper dichos códigos, conocidas como criptoanálisis. Las dos disciplinas están íntimamente ligadas y
al conjunto de ambas y se le conoce con el nombre de criptología.
La criptografía hace años que dejó de ser un arte para convertirse en una técnica
o más bien un
conglomerado de técnicas, que tratan sobre la protección de la información (figura 1.8). Entre las disciplinas
que engloba cabe destacar a la Teoría de la Información, la Teoría de Números y la complejidad algorítmica.
Existen dos trabajos fundamentales sobre los que se apoya prácticamente toda la teoría criptográfica actual.
Uno de ellos, desarrollado por Claude Shannon en sus artículos “A Mathematical Theory of Communication”
[111] y “Communication Theory of Secrecy Systems” [112], sienta las bases de la teoría de la información y
de la criptografía moderna. A partir de entonces la criptografía alcanza nuevos horizontes. El segundo
trabajo, desarrollado en el artículo “New directions in Cryptography” [35] por Whitfield Diffie y Martin
Hellman en 1976, introduce el concepto de criptografía asimétrica, abriendo enormemente el abanico de
aplicación de esta disciplina.
2
”Cifrado de las comunicaciones digitales” Jorge Ramió Aguirre 2006
30 | P á g i n a
Figura 1-8 Criptografía
Existen diversos algoritmos matemáticos que intentan cubrir una o varias de estas características básicas de
seguridad. El nivel de cumplimiento de sus objetivos es difícil de evaluar, ya que diversos algoritmos pueden
ser vulnerables ante técnicas de ataque diferentes, además la mayoría de los algoritmos pueden trabajar
con claves de distinta longitud lo cual afecta directamente a la robustez. Por otro lado, existen otras
características, a parte de la robustez del algoritmo, que también influyen en el proceso de selección del
algoritmo más apropiado para una determinada aplicación. Algunas de estas características son: el tiempo
de cálculo del proceso de cifrado, el tiempo de cálculo del proceso de descifrado, la relación de tamaño
entre el documento original y el documento cifrado, etc.
Los algoritmos más conocidos son los que obtienen un documento a partir de un documento original al
aplicar un algoritmo que utiliza una clave secreta como argumento. En general los algoritmos criptográficos
se pueden clasificar en tres grandes familias:

Criptografía de clave secreta o criptografía simétrica.

Criptografía de clave pública o criptografía asimétrica.

Algoritmos HASH o de resumen.
1.2.3 Criptosistemas
Se define un criptosistema como una quíntupla (M, C, K, E, D), donde:
M representa el conjunto de todos los mensajes sin cifrar (lo que se denomina texto claro o plaintext) que
pueden ser enviados. Son componentes de un mensaje inteligible (bits, bytes, pixels, signos, caracteres, etc.)
que provienen de un alfabeto previamente establecido. Este lenguaje tiene unas reglas sintácticas y
semánticas y en algunos casos (sistemas de cifrado clásicos) la longitud del alfabeto indicará el módulo en el
cual se trabaja. En los modernos, no guarda relación.
31 | P á g i n a
Además, hay mensajes con sentido y mensajes sin sentido
M = {m1, m2, m3, . . . , mn}.
C representa el conjunto de todos los posibles mensajes cifrados, o criptogramas. Normalmente el alfabeto
es el mismo que el utilizado para crear el mensaje en claro. Además, se supone que el espacio de los textos
cifrados C y el espacio de los mensajes M (con y sin sentido) tienen igual magnitud y, en este caso, a
diferencia del espacio de mensajes M, son válidos todo tipo de criptogramas,
C = {c1, c2, c3, . . . , cn}.
K representa el conjunto de claves que se pueden emplear en el sistema criptográfico. Se supone que es un
conjunto altamente aleatorio de caracteres, palabras, bits, bytes, etc., en función del sistema de cifra. Al
menos una de las claves en un criptosistema se guarda en secreto,
K = {k1, k2, k3, . . . , kn}.
E es el conjunto de transformaciones de cifrado o familia de funciones que se aplica a cada elemento de M
para obtener un elemento de C. Existe una transformación diferente Ek para cada valor posible de la clave k.
Es decir, Ek es una aplicación (con una clave k que está en el espacio de claves K) de M en C:
Ek: M → C
con
k ∈ K.
En general el algoritmo de cifrado es de dominio público.
D es el conjunto de transformaciones de descifrado, análogo a E. En este caso, D k es una aplicación con una
clave k (en el espacio de claves K) de C en M . Se utiliza el concepto de inverso. En consecuencia Dk es la
operación inversa de Ek o bien, se utiliza la misma transformación Ek para descifrar pero con una clave k0 que
es la inversa de k dentro de un cuerpo,
Dk: C → M
con
k ∈ K.
Todo criptosistema debe cumplir la siguiente condición:
Dk(Ek(m)) = m,
Es decir, dado un mensaje en claro m, si se cifra empleando la clave k y luego se descifra empleando la
misma clave, se obtiene el mensaje original m.
Existen dos tipos fundamentales de criptosistemas:
(a) Criptosistemas simétricos o de clave privada: Son aquellos que emplean la misma clave
k tanto para
32 | P á g i n a
cifrar como para descifrar. Presentan el inconveniente de que para ser empleados en comunicaciones, la
clave k debe ser conocida tanto por el emisor como por el receptor, lo cual plantea el problema de
transmitir la clave de forma segura.
(b) Criptosistemas asimétricos o de clave pública: Son aquellos que emplean una doble clave (kp, kP). La
clave kp se conoce como clave privada y se emplea para la transformación de descifrado D, mientras que kP
se conoce como clave pública y sirve para el cifrado E.
En la práctica se emplea una combinación de estos dos tipos de criptosistemas, debido a que los asimétricos
presentan el inconveniente de ser computacionalmente más costosos que los simétricos los cuales suelen
ser muy eficientes en mensajes largos; luego se hace uso de la criptografía asimétrica para cifrar las claves
simétricas (cortas).
1.2.4 Criptoanálisis
El criptoanálisis se define como la ciencia del descifrado de los criptogramas por análisis y deducción, sin
tener conocimiento previo de la clave. No se considera criptoanálisis el descubrimiento de un algoritmo
secreto de cifrado; se supone, por el contrario, qué los algoritmos siempre son conocidos.
El criptoanálisis se realiza estudiando grandes cantidades de pares (mensaje, criptograma) generados con la
misma clave. El mecanismo que se emplea para obtener estos pares es indiferente y puede ser resultado de
escuchar un canal de comunicaciones o puede ser que el objeto de ataque responda con un criptograma
cuando se le envíe un mensaje, o que se tenga acceso al dispositivo de cifrado y éste permita efectuar
operaciones pero no permita leer su clave (por ejemplo, las tarjetas de los teléfonos móviles GSM). Cuando
el sistema es débil, pueden ser suficientes unos cientos de mensajes para obtener información que permita
deducir la clave empleada.
Como el algoritmo de cifrado es conocido, se puede intentar criptoanalizar un sistema aplicando para cada
una de las claves el algoritmo de descifrado hasta encontrar una salida que tenga sentido como posible
texto claro. Este tipo de técnicas que buscan exhaustivamente en todo el espacio de claves K, se denominan
“fuerza bruta” y no se consideran como auténticas técnicas de criptoanálisis, reservándose este término
para mecanismos que explotan posibles debilidades intrínsecas en el algoritmo de cifrado. Se denomina
ataque a cualquier técnica que permite recuperar un mensaje cifrado empleando menos esfuerzo
computacional que el que se utiliza por fuerza bruta.
En cualquier criptosistema digno de interés el espacio de claves es lo suficientemente grande como para
que los métodos basados en fuerza bruta sean inviables. No obstante, hay que tener en cuenta que la
capacidad de cálculo de las computadoras crece a gran velocidad, por lo que algoritmos que hace unos años
33 | P á g i n a
eran resistentes a ataques por fuerza bruta hoy pueden resultar inseguros. A pesar de eso, existen
longitudes de clave para las que resulta imposible, empleando la computación actual, tener éxito al aplicar
un método de este tipo.
Dos métodos de criptoanálisis simétrico que proporcionan resultados interesantes son el análisis diferencial
y el análisis lineal. El primero de ellos, parte de pares de mensajes con diferencias mínimas (usualmente de
un bit), estudia las variaciones que existen entre los mensajes cifrados correspondientes y trata de
identificar patrones comunes. El segundo emplea operaciones XOR entre algunos bits del texto claro y
algunos bits del texto cifrado, obteniendo finalmente un único bit. Si se realiza esto con muchos pares (texto
claro, texto cifrado) se puede obtener una probabilidad en ese bit que se calcula y si está suficientemente
sesgada (no se aproxima a 1 ) se tiene posibilidad de que la clave sea recuperada.
Un tipo de análisis para algoritmos asimétricos consiste en deducir la clave privada a partir de la pública. Por
lo general, se suelen emplear técnicas analíticas que intentan resolver los problemas de elevado coste
computacional (factorización, logaritmos discretos, etc) en los que se apoyan estos criptosistemas. Mientras
estos problemas permanezcan sin resolver de forma eficiente se puede seguir confiando en estos
algoritmos. La gran variedad de sistemas criptográficos existentes produce necesariamente una gran
variedad de técnicas de criptoanálisis, cada una de ellas asociada a un algoritmo o familia de ellos.
1.3 Criptografía de clave secreta
En este tipo de criptografía se incluyen el conjunto de algoritmos diseñados para cifrar un mensaje
utilizando una única clave conocida por los dos interlocutores, de manera que el documento cifrado sólo
pueda descifrarse conociendo dicha clave secreta. Algunas de las características más destacadas de este tipo
de algoritmos son las siguientes:

A partir del mensaje cifrado no se puede obtener el mensaje original ni la clave que se ha
utilizando, aunque se conozcan todos los detalles del algoritmo criptográfico utilizado. 3

Se utiliza la misma clave para cifrar el mensaje original que para descifrar el mensaje codificado.

Emisor y receptor deben haber acordar una clave común por medio de un canal de comunicación
confidencial antes de poder intercambiar información confidencial por un canal de comunicación
inseguro.
3
Hay que tener en cuenta que la mayoría de los algoritmos de cifrado son públicos, ya que la seguridad reside en el diseño del propio
algoritmo.
34 | P á g i n a
El esquema general de cifrado y descifrado mediante algoritmos de clave privada se muestra en la figura 1.9.
A partir de un documento original se obtiene un documento cifrado al aplicar una clave secreta; esa misma
clave secreta se utiliza posteriormente para volver a obtener el documento original.
Figura 1-9 Esquema de los algoritmos de clave secreta
Los algoritmos simétricos más conocidos son: DES, 3DES, RC2, RC4, RC5, IDEA, Blowfish y AES.
El algoritmo DES4 basado en Lucifer de IBM (1975), fue seleccionado como algoritmo estándar de cifrado en
1977 por NIST (National Institute of Standards and Technology, USA). Utiliza claves de cifrado bastante
cortas (56 bits, de los cuales sólo se utilizan 48 bits) y hoy en día se considera poco robusto, sobre todo
desde que en 1998 la Electronica Frontier Foundation hizo público un crackeador de código DES capaz de
descifrar mensajes DES en menos de 3 días.
El algoritmo 3DES5, desarrollado por Tuchman en 1978, es una manera de mejorar la robustez del algoritmo
DES que consiste en aplicarlo tres veces consecutivas. Se puede aplicar con la misma clave cada vez, o con
claves distintas y combinando el algoritmo de cifrado con el de descifrado, lo cual da lugar a DES-EEE3, DESEDE3, DES-EEE2 y DES-EDE2. El resultado es un algoritmo seguro y que se utiliza en la actualidad, aunque
resulta muy lento comparado con otros algoritmos más modernos que también son seguros.
En 1989, Ron Rivest desarrolló el algoritmo RC2 (Rivest’s Cipher) para RSA Data security, Inc 6 . Se trata de un
algoritmo de cifrado por bloques, que utiliza una clave de tamaño variable. Es de dos a tres veces más
rápido que el algoritmo DES, siendo más seguro7
4
National Bureau of Standards, Data Encryption Standard,FIPS-Pub.46. National Bureau of Standards, U.S. Department of Commerce,Washington D.C., Jan 1977.
5
National Bureau of Standards, Data Encryption Standard, FIPS-Pub.46-3. National Bureau of Standards, U.S. Department of Commerce,Washington D.C., Oct 1999.
6
Lars R. Knudsen,Vincent Rijmen, Ronald L. Rivest, and M.J.B. Robshaw: “On the Design and Security of RC2”, Proceedings Fifth Fast
Software Encryption Workshop FSE’98, pages 206—221, (1998).
7
(http://theory.lcs.mit.edu/~rivest/).
35 | P á g i n a
Ron Rivest desarrolló el algoritmo RC4 en 1987 para RSA Data Security, que se hizo público en 1994 8 . Se
considera inmune al criptoanálisis diferencial y lineal. Es el algoritmo utilizado en el cifrado WEP de la
mayoría de los puntos de acceso WiFi. Es necesario comentar que el protocolo WEP se considera vulnerable,
pero no por problemas con el algoritmo de cifrado RC4 sino por otros aspectos del propio protocolo que
permiten determinar la clave de cifrado en un tiempo corto (pocas horas en una red con mucho tráfico).
Otro algoritmo de Ron Rivest es RC5, publicado en 1994 9. Se trata de un algoritmo de cifrado por bloques,
que utiliza claves de tamaño variable. Se caracteriza por la sencillez del algoritmo, que lo hacen muy rápido
y fácil de implementar tanto en software como en hardware.
International Data Encription Algorithm, IDEA, diseñado por Xuejia Lai y James L. Massey de ETH-Zürich. Es
un algoritmo de cifrado por bloques de 64 bits que emplea claves de 128 bits, que se presentó por primera
vez en 199110. Es dos veces más rápido que DES, a pesar de utilizar claves mucho más largas. Es un
algoritmo patentado en algunos países (entre ellos España), salvo para usos no comerciales.
Blowfish es un algoritmo de cifrado por bloques de 64 bits diseñado por Bruce Schneier en 199311. Utiliza
claves de longitud variable entre 32 y 448 bits. A pesar de utilizar un tamaño de bloque pequeño, que podría
facilitar su vulnerabilidad al procesar textos largos, se considera un algoritmo seguro y es más rápido que
DES.
Twofish es una variante de Blowfish que utiliza bloques de 128 bits y claves de 256 bits 12. También diseñado
por Bruce Schneier, en colaboración con John Kelsey, Doug Whiting, David Wagner, Chris Hall, y Niels
Ferguson, fue uno de los cinco finalistas en el proceso de selección de NIST para sustituir a DES como
algoritmo estándar.
Advanced Encryption Standar (AES) es el estándar para cifrado simétrico del NIST desde el 26 de mayo de
2002 en sustitución de DES. AES también es conocido como “Rijndael”, nombre original del algoritmo
propuesto en 199913 que cambió al ser seleccionado por NIST. Fue desarrollado por dos criptógrafos Belgas,
Joan Daemen y Vincent Rijmen. Es un algoritmo de cifrado por bloques con longitud de bloque y longitud de
clave variables. Los valores adoptados para el estándar son bloques de 128 bits, y claves de longitud 128,
8
R.L. Rivest: “The RC4 Encryption Algorithm”. RSA Data. Security, Inc., Mar 12th, 1992
Ronald L. Rivest: “The RC5 Encryption Algorithm”, Proceedings of the 1994 Leuven Workshop on Fast Software Encryption, pages 86-96.
(Springer 1995).
10
Xuejia Lai, James L. Massey: “A Proposal for a New Block Encryption Standard”, EUROCRYPT 1990. W orkshop on the Theory and Application of Cryptographic Techniques, Aarhus, Denmark, May 1990, pp389–404.
11
B. Schneier: “Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)”, Fast Software Encryption, Cambridge Security
Workshop Proceedings (December 1993), Springer-Verlag, 1994, pp. 191-204.
12
B. Schneier, J. Kelsey, D. Whiting, D.Wagner, C. Hall, N. Ferguson: “Twofish: A 128-Bit Block Cipher”, Jun 1998.
http://www.schneier.com/paper-twofish-paper.html.
9
13
Joan Daemen,Vincent Rijmen: “The Rijndael BlockCipher”, sep 1999. http://csrc.nist.gov/CryptoToolkit/aes/rijndael/Rijndael.pdf.
36 | P á g i n a
192 ó 256 bits14.
La recomendación general es utilizar el algoritmo AES, ya que fue cuidadosamente analizado durante el
proceso de selección desarrollado por NIST y se considera muy bueno. Además, al convertirse en el estándar
se ha extendido muchísimo y seguramente se ha convertido en el algoritmo que más criptoanálisis ha
experimentado lo que demuestra su robustez.
1.3.1 Cifrado de bloques
En Criptografía, una unidad de cifrado por bloques (block cipher en inglés) es una unidad de cifrado de clave
simétrica que opera en grupos de bits de longitud fija, llamados bloques, aplicándoles una transformación
invariante. Cuando realiza cifrado, una unidad de cifrado por bloques toma un bloque de texto plano o claro
como entrada y produce un bloque de igual tamaño de texto cifrado. La transformación exacta es controlada
utilizando una segunda entrada — la clave secreta. El descifrado es similar: se ingresan bloques de texto
cifrado y se producen bloques de texto plano.
Las unidades de cifrado por bloques se diferencian de las unidades de flujo de cifrado en que un flujo de
cifrado trabaja sobre dígitos individuales, uno después del otro, y la transformación varía durante el proceso
de cifrado. La diferencia entre los dos tipos de unidades es algo difusa, dado que una unidad de cifrado por
bloques puede ser operada en un modo que permite utilizarla como una unidad de flujo de cifrado, donde
en lugar de dígitos se opera con bloques.
1.3.2 Cifrado de Flujo
Los cifradores de flujo son algoritmos de cifrado que pueden realizar el cifrado incrementalmente,
convirtiendo el texto en claro en texto cifrado bit a bit. Esto se logra construyendo un generador de flujo de
clave. Un flujo de clave es una secuencia de bits de tamaño arbitrario que puede emplearse para oscurecer
los contenidos de un flujo de datos combinando el flujo de clave con el flujo de datos mediante la función
XOR. Si el flujo de clave es seguro, el flujo de datos cifrados también lo será.
Se puede construir un generador de flujo de clave iterando una función matemática sobre un rango de
valores de entrada para producir un flujo continuo de valores de salida. Los valores de salida se concatenan
entonces para construir bloques de texto en claro, y los bloques se cifran empleando una clave compartida
por el emisor y el receptor.
14
National Bureau of Standards, Data Encryption Standard, FIPS-Pub.197. National Bureau of Standards, U.S. Department of Commerce,Washington D.C.,Nov. 2001.
37 | P á g i n a
Para conservar la calidad de servicio del flujo de datos, los bloques del flujo de clave deberían producirse
con un poco de antelación sobre el momento en que vayan a ser empleados, además el proceso que los
produce no debiera exigir demasiado esfuerzo de procesamiento como para retrasar el flujo de datos.
1.4 Criptografía de clave pública
Esta categoría incluye un conjunto de algoritmos criptográficos que utilizan dos claves distintas para cifrar y
para descifrar el mensaje. Ambas claves tienen una relación matemática entre sí, pero la seguridad de esta
técnica se basa en que el conocimiento de una de las claves no permite descubrir cuál es la otra clave. En
realidad sería necesario conocer todos los números primos grandes para ser capaz de deducir una clave a
partir de otra, pero está demostrado que en la práctica se tardarían demasiados años sólo en el proceso de
obtención de los número primos grandes.
Cada usuario cuenta con una pareja de claves, una la mantiene en secreto y se denomina clave privada y
otra la distribuye libremente y se denomina clave pública. Para enviar un mensaje confidencial sólo hace
falta conocer la clave pública del destinatario y cifrar en mensaje utilizando dicha clave. En este caso los
algoritmos asimétricos garantizan que el mensaje original sólo pueda recuperarse utilizando la clave privada
del destinatario. Dado que la clave privada se mantiene en secreto, sólo el destinatario podrá descifrar el
mensaje.
Figura 1-10 Esquema de algoritmos de clave pública
Estos algoritmos pueden trabajar indistintamente con cualquiera de las claves, de manera que un mensaje
cifrado con la clave pública sólo puede descifrarse con la clave privada, pero cualquier mensaje cifrado con
la clave privada sólo puede ser descifrado con la clave pública. Esta característica permite utilizar este
método para otras aplicaciones además de las que sólo requieren confidencialidad, como es el caso de la
firma electrónica.
38 | P á g i n a
Algunas de las características más destacadas de este tipo de algoritmos son las siguientes:

Se utilizan una pareja de claves denominadas clave pública y clave privada, pero a partir de la clave
pública no es posible descubrir la clave privada.

A partir del mensaje cifrado no se puede obtener el mensaje original, aunque se conozcan todos los
detalles del algoritmo criptográfico utilizado y aunque se conozca la clave pública utilizada para
cifrarlo.

Emisor y receptor no requieren establecer ningún acuerdo sobre la clave a utilizar. El emisor se
limita a obtener una copia de la clave pública del receptor, lo cual se puede realizar, en principio,
por cualquier medio de comunicación aunque sea inseguro.
A diferencia de los algoritmos de clave secreta, que existen desde los tiempos de los romanos, los métodos
asimétricos son muy recientes. En la década de 1970 se publicó el primer algoritmo asimétrico completo,
denominado RSA, que sigue siendo el más utilizado en la actualidad15. La seguridad de este algoritmo reside
en la dificultad que supone la factorización de un número compuesto por factores primos muy grandes. Si
un criptoanalista fuera capaz de encontrar los factores primos sería capaz también de determinar la clave
privada y, por lo tanto, descifrar el mensaje. Sin embargo el problema de factorización se considera costoso,
computacionalmente hablando, de resolver en la práctica, y cuanto más grande sean los números utilizados,
es decir las longitudes de las claves, mayor dificultad se alcanza.
1.5 Algoritmos HASH o de resumen
Los algoritmos HASH, parten de una información de entrada de longitud indeterminada y obtienen como
salida un código, que en cierto modo se puede considerar único para cada entrada. La función de estos
algoritmos es determinista, es decir que partiendo de una misma entrada siempre se obtiene la misma
salida. Sin embargo, el interés de estos algoritmos reside en que partiendo de entradas distintas se obtienen
salidas distintas.
Unos ejemplos muy sencillos, aunque muy vulnerables, son los dígitos de control y los CRC (Cyclic
Redundancy Code) que se utilizan para detectar errores de trascripción o de comunicación. Estos algoritmos
en particular garantizan que el código generado cambia ante una mínima modificación de la entrada y
tienen aplicaciones muy concretas de control de integridad en procesos con perturbaciones poco probables.
Sin embargo son poco robustos y está demostrado que se pueden realizar pequeños conjuntos de
15
R. Rivest, A. Shamir, L.Adleman:“A Method for ObtainingDigital Signatures and Public-Key Cryptosystems”.Communications of the
ACM,Vol. 21 (2),pp.120–126. 1978. Previously released
39 | P á g i n a
modificaciones en un documento de manera que el CRC resulte inalterado. En un buen algoritmo HASH es
inadmisible que un conjunto reducido de modificaciones no altere el código resultante, ya que se podrían
hacer retoques en el documento sin que fuesen detectados, y por lo tanto no garantiza la integridad. Dado
que el tamaño del código que se genera como salida es de tamaño limitado, (típicamente 128, 256 ó 512
bits) mientras que el tamaño del documento de entrada es ilimitado (típicamente un archivo), es evidente
que se cumplen dos propiedades:

El algoritmo es irreversible, es decir, no es posible obtener el documento original a partir del código
generado.

Existen varios documentos que dan lugar a un mismo código.
La segunda propiedad es debida a que el número de combinaciones de los códigos de tamaño limitado es
menor al número de combinaciones de cualquier archivo grande. Sin embargo los buenos algoritmos
consiguen que los documentos que dan lugar al mismo código, sean completamente diferentes y por lo
tanto sólo uno de ellos será legible.
Los algoritmos más utilizados son MD5 y SHA1, pero nunca se utilizan códigos CRC en aplicaciones de
seguridad. Por ejemplo, los certificados incluyen un campo llamado fingerprint con el resultado de los
algoritmos MD5 y SHA1.
NIST presentó en 1993 un algoritmo basado en las mismas técnicas que MD5 y denominado SHA (Secure
Hash Algorithm). Este algoritmo fue declarado estándar Federal Information Processing Standard PUB 180
en 1993, pero en 1995 la Agencia de Seguridad Nacional (NSA) lo sustituyó por una versión mejorada que
actualmente se conoce como SHA-1 y que se considera más seguro que MD5. Produce un código hash de
160 bits para mensajes de longitud máxima 264 bits, aunque existen otras variantes poco utilizadas todavía
que producen códigos de mayor longitud.
En general, SHA1 se considera el mejor algoritmo de esta familia y es el que se aplica en la mayoría de las
aplicaciones de firma electrónica. Por lo tanto es muy habitual aplicar SHA1 seguido de RSA para realizar una
firma electrónica de un documento, o bien el algoritmo DSA específico para firma electrónica que también
utiliza SHA1 internamente.
Por otro lado, el algoritmo MD5 (Message-Digest Algorithm 5) es un algoritmo que produce un código de
128 bits. Fue creado por Ron Rivest en 1991 y se convirtió en el estándar de Internet RFC 1321.
Recientemente se han encontrado pequeñas vulnerabilidades en este algoritmo que sugieren un
movimiento hacia SHA1.
Digital Signature Algorithm (DSA) es el estándar de United States Federal Government para firma digital. Su
desarrollo se atribuye a David W. Kravitz, de la National Security Agency. Fue presentado por NIST en agosto
40 | P á g i n a
de 1991, adoptado como estándar en 1993, y con última revisión de 200016. Es un algoritmo exclusivo de
firma electrónica basado en clave pública, pero no vale para comunicaciones confidenciales.
1.6 Comparativa entre algoritmos Simétricos y asimétricos
Una vez definidos los conceptos de criptografía asimétrica y simétrica, se procederá a resumir sus ventajas y
desventajas mencionando los algoritmos más usados en cada una de ellas de manera que sea más clara su
importancia.
Tabla 1-1 Comparativa entre criptografía simétrica y asimétrica
Ventajas
Desventajas
Algoritmos más usados
Sistema eficiente en grupos
Es necesario compartir la
·
DES con tamaño de
muy reducidos, ya que sólo es clave entre emisor y receptor clave de 56 bits
necesaria una única clave
por medios que pueden no
ser seguros
Simétrica
Asimétrica
No es necesario disponer de
una tercera parte confiable
Si se compromete la clave, se
compromete toda la
comunicación
·
Triple-Descon
tamaño de clave de 128
bits a 256 bits
Infraestructura sencilla
No permite autenticar al
emisor ya que una misma
clave la utilizan dos personas
·
Blowfish con
tamaño de clave de 128
bits a 256 bits
Se necesita un elevado
número de claves: n*(n-1)/2;
siendo n el número de
personas implicadas en una
comunicación cifrada
·
AES con tamaños
de clave de 128, 192 o
256 bits
Número de claves reducido,
Alto coste computacional en
ya que cada individuo
el proceso de generación de
necesitará únicamente un par claves
de claves
RSA con tamaño de
clave mayor o igual a
1024 bits
16
National Bureau of Standards, Data Encryption Standard, FIPS-Pub.186-2. National Bureau of Standards, U.S. Department of Commerce,Washington D.C., 2000.
41 | P á g i n a
No es necesario transmitir la
clave privada entre emisor y
receptor
La necesidad de un tercero
(autoridad de certificación)
en el proceso
DSA con tamaño de
clave de 512 bits a 1024
bits
Necesidad de una gran
infraestructura
independientemente del
número de individuos. Se
precisa mayor tiempo de
proceso y claves más grandes
ElGamal con tamaño de
clave comprendida entre
los 1024 bits y los 2048
bits
Permite autenticar a quien
utilice la clave privada
42 | P á g i n a
43 | P á g i n a
CAPITULO II
Criptografía en arquitecturas móviles y su
programación
2.1 Seguridad en Telefonía Móvil
La telefonía móvil se caracteriza por ser un sistema de comunicación ampliamente difundido debido a su
fácil acceso, conectividad y versatilidad. Los teléfonos inteligentes (smartphones) cuentan con sistemas
operativos similares a una PC, y tienen la ventaja del uso de redes geográficamente distribuidas a nivel
global. Sin embargo, esto incrementa las posibilidades de explotación de las vulnerabilidades que puedan
existir en ellos.
2.1.1 El móvil como un mini PC
El uso de recursos digitales multimedia en los smartphones, requiere que las aplicaciones sean similares a
las de una PC. Con ello se logra compatibilizar el funcionamiento e intercambio de información entre
diferentes plataformas. Este debe ser tratado con todas las precauciones de seguridad y uso al momento de
navegar o descargar información proveniente de sitios sin seguridad.
El mercado mundial de teléfonos móviles vendidos a usuarios finales, en el cuarto trimestre del año 2012 es
el siguiente:17
Tabla 2-1 Empresas líderes en el mercado móvil
17
Empresa
Mercado (4T 2012)
1.Samsung
19.6%
2.Nokia
23.4%
3.Apple
7.4
4.ZTE
4.0%
Gartner report: Worldwide Mobile Phone Sales Declined 1.7 Percent in 2012
44 | P á g i n a
5.Huawei Technologies
2.9%
6.TCL
2.2%
7.Lenovo
1.1%
8.Sony Mobile Communications
1.9%
9.Motorola
2.1%
10. Otros
31.8%
Los sistemas operativos móviles más usados a nivel global en el cuarto trimestre del 2012 son: 18
Tabla 2-2 Sistemas operativos lideres para mercado móvil
18
Sistema Operativo
Porcentaje de uso
Android
51.3
iOS
23.6
Research In Motion (BlackBerry)
8.8
Microsoft
1.8
Bada
2.1
Symbian
11.6
Otros
0.8
Gartner ídem
45 | P á g i n a
2.1.2 La importancia de la seguridad
Los usuarios de teléfonos móviles se han ido incrementando en los últimos años, debido a la extensa
variedad de aplicaciones que pueden instalar. Aproximadamente el 60.8% tienen un smartphone.19 La
navegación e intercambio de información en internet se ve beneficiada por la mejora de las redes
inalámbricas (Wi-Fi), facilitando el envío y recepción de correos electrónicos en cualquier momento, así
como la realización de diversas transacciones online.
Para garantizar el correcto funcionamiento del dispositivo, es esencial estar bien informado sobre las
ventajas y desventajas respecto de las prestaciones que ofrece el teléfono. También hay que considerar que
al mismo tiempo que nos mantiene comunicados, nos expone a peligros cuando éste es usado o intervenido
sin nuestro permiso. Las conversaciones vía telefónica o por mensajes de texto pueden contener
información confidencial y sensitiva, la cual podría ser escuchada o leída por otros a nivel global, cuando el
móvil se encuentra conectado al internet. Por ello es importante llevar a cabo algunas medidas de seguridad
para proteger el dispositivo y la información contenida en él.
2.2 Incidentes de seguridad
Se puede definir como amenaza a todo elemento o acción capaz de atentar contra la seguridad de la
información. Las amenazas surgen a partir de la existencia de vulnerabilidades, es decir que una amenaza
sólo puede existir si existe una vulnerabilidad que pueda ser aprovechada, e independientemente de que se
20
comprometa o no la seguridad de un sistema de información .
Diversas situaciones, tales como el incremento y el perfeccionamiento de las técnicas de ingeniería social, la
falta de capacitación y concientización a los usuarios en el uso de la tecnología, y sobre todo la creciente
rentabilidad de los ataques, han provocado en los últimos años el aumento de amenazas intencionales. Las
amenazas a los que se ven expuestos los teléfonos móviles son:

Pérdida o robo del dispositivo.

Infecciones por:
o
Virus informáticos: Es un software malicioso que tiene por objeto alterar el normal
19
Estudio sobre seguridad en dispositivos móviles y smartphones (1er cuatrimestre 2012)
20
Departamento de informática- Universidad Nacional de Luján
46 | P á g i n a
funcionamiento de la computadora, sin el permiso o el conocimiento del usuario. Los
virus, habitualmente, reemplazan archivos ejecutables por otros infectados con el código
de este
o
Malware vía email: Es un software que tiene como objetivo infiltrarse o dañar
una computadora o Sistema de información sin el consentimiento de su propietario.
o
Botnets: Se refiere a un conjunto de robots informáticos o bots, que se ejecutan de manera
autónoma y automática. El artífice de la botnet puede controlar todos los
ordenadores/servidores infectados de forma remota.
o
Hoaxes: Los hoax (mistificación, broma o engaño), son mensajes con falsas advertencias de
virus, o de cualquier otro tipo de alerta o de cadena (incluso solidaria, o que involucra a
nuestra propia salud), o de algún tipo de denuncia, distribuida por correo electrónico.
o
Spam: Se llama spam, correo basura o mensaje basura a los mensajes no solicitados, no
deseados o de remitente no conocido (correo anónimo), habitualmente de tipo
publicitario, generalmente enviados en grandes cantidades (incluso masivas) que
perjudican de alguna o varias maneras al receptor.
o
Rootkits: Un rootkit es un programa que permite un acceso de privilegio continuo a una
computadora pero que mantiene su presencia activamente oculta al control de los
administradores al corromper el funcionamiento normal del sistema operativo o de otras
aplicaciones.
o
Falsos códigos QR: Un código QR (quick response code, «código de respuesta rápida») es
un módulo útil para almacenar información en una matriz de puntos o un código de barras
bidimensional. Se caracteriza por los tres cuadrados que se encuentran en las esquinas y
que permiten detectar la posición del código al lector.

Robo de información vía Bluetooth.

Suplantación de identidad (spoofing).

Acceso a datos confidenciales de conversaciones, imágenes o vídeos.
47 | P á g i n a
2.2.1 Tipos de Malware en los Smartphones
El tipo de malware que más se ha propagado en el año 2012, se puede clasificar de la siguiente forma: 21
Tabla 2-3 Malware principal para telefonía móvil
Malware
1.TroyanosSMS
Características
El diseño del troyano como malware o virus informático, permite a su creador
tener acceso remoto a un sistema. En este caso al sistema operativo de los
smartphones infectados provocando daños, modificando los privilegios como
usuario y poder acceder sin ninguna restricción, así como el robo de
información valiosa para el usuario propietario del dispositivo móvil. Algunos
troyanos detectados son: NetBus, Back Orifice, Back Orifice 2000, Sub7, The
KaoS, Bifrost, Bandook, Poison Ivy, entre otros.
Las acciones de un troyano son el apagado y reinicio del equipo para borrar,
transferir o modificar archivos, robos de códigos de seguridad e instalación de
otros programas maliciosos. Tales como los Botnets. Los riesgos se pueden
presentar en dos posibles escenarios:
A. malware en aplicaciones y videojuegos: En este escenario, el usuario
descarga aplicaciones y videojuegos de fuentes no oficiales. El malware
se instala en el dispositivo mediante SMS ocultos para extraer
información financiera y personal.
Busca la lista de contactos y el dispositivo se convierte en parte de un
botnet. Los botnets conocidos que representan un mayor peligro son
Lethic, Grum, Cutwail (1,2,4,5), Donbot, Festi, Gheg, Kelihos y
Maazben.22
B.
2. Módulos
publicitarios
malware en SMS: El usuario recibe un SMS malware en su dispositivo
proveniente de otro infectado y reenvía SMS a su lista de contactos,
comenzando así de nuevo el ciclo.
Es uno de los medios por los cuales una amenaza puede dañar los equipos
móviles. Se presentan como aplicaciones gratuitas de descarga que muestran
publicidad y que cambian la página de inicio del dispositivo sin la autorización
del usuario. Accede a la configuración del teléfono y extrae el número de
identificación IMEI, así como la lista de permisos otorgados y acceso a las
llamadas telefónicas. Los dos módulos que actúan de esta forma son Plangton y
Hamob (AdWare.AndroidOS.Hamob). Los cuales sólo muestran anuncios
21
Kaspersky: Boletín de seguridad 2012. Estadística general de 2012
22
2013 - Global Security Report
48 | P á g i n a
publicitarios al usuario, mientras realizan acciones maliciosas en el dispositivo
móvil.23
3. Exploits
Buscan obtener los privilegios de superusuario o root. Es decir, el usuario root
tiene los permisos para realizar acciones en el dispositivo que un usuario
común no puede hacer. La principal amenaza de un exploit es la toma de
control del dispositivo, así como el acceso privilegiado a los programas. Se
puede presentar de tres formas: remoto, local y client side.
2.2.2 Malware en Sistemas Operativos Android
De acuerdo a los laboratorios Kaspersky, en su boletín de seguridad del año 2012. Las estadísticas mostraron
que el 98.96% del malware móvil detectado mensualmente fue en los SO Android. Seguidos en menor
porcentaje el Symbian con un 0.04% y otros con un 0.03%. La identificación de dicho malware es la
siguiente:24
Tabla 2-4 Malware atacante en sistema operativo Android
Malware en SO Android
Porcentaje de propagación
Trojan-SMS. AndroidOS.Opfake.bo
32.87%
Trojan.AndroidOS.Plangton.a
18.27%
Trojan-SMS.AndroidOS.FakeInst.a
16.99%
Trojan-SMS.AndroidOS.Opfake.a
7.17%
AdWare.AndroidOS.Hamob.a
4.29%
Exploit.AndroidOS.Lotoor.g
1.69%
Trojan-Spy.AndroidOS.Fakeview
1.12%
Exploit.AndroidOS.Lotoor.c
0.66%
Trojan-SMS.AndroidOS.Agent.a
0.45%
23
Virus para móviles acechan Latinoamérica- http://itusersmagazine.com/tag/troyano-plangton/
24
Kaspersky: Boletín de seguridad 2012. Estadística general de 2012
49 | P á g i n a
Exploit.AndroidOS.Lotoor.p
0.38%
Otros
16.11%
2.3 Medidas de seguridad y prevención de riesgos
Algunas recomendaciones para incrementar la seguridad y evitar posibles riesgos son:
Tabla 2-5 Medidas de seguridad
Tipo de seguridad
Medidas de seguridad y prevención
Física
Al reciclar un teléfono móvil, asegurarse de
eliminar todo el contenido personal de las memorias.
Así se evita exponer la confidencialidad del usuario y
la de sus contactos.
Comprar e instalar aplicaciones y Software en
páginas oficiales.
Instalar y mantener actualizado algún antivirus.
Aplicaciones y
Sistemas Operativos
Usar deepfreeze Software, que permite el reinicio
y restauración del sistema en plataformas Microsoft
Windows, Mac OS X y Linux. Con el fin de evitar daños
causados por programas maliciosos.
Apagar el móvil por la noche cuando no está
siendo utilizado. Ya que los ataques a los sistemas
pueden ocurrir cuando el usuario no está al tanto de
ello.
Usar contraseñas alfanuméricas o PIN para el
acceso y tras la inactividad de los dispositivos.
Control de accesos y
Evitar proporcionar información financiera y
almacenamiento de
personal vía correo electrónico, conversaciones
datos
telefónicas o por SMS.
Activar la encriptación de datos y cifrado de
memorias SD.
50 | P á g i n a
Hacer copias de seguridad para restablecer el
sistema en caso de fallos o pérdidas de información.
Usar servicios de localización online, para permitir
el borrado de datos en caso de robo o extravío.
2.4 Telefonía móvil y su criptografía
En la telefonía móvil celular en GSM la criptografía se utiliza para la protección de escuchas no autorizadas.
El cifrado se realiza sobre pares de grupos de 57 bits con cifrado de interleaver, es decir, permutaciones. Son
similares para el proceso de autenticación y cifrado de datos de usuario, sin embargo tienen diferentes
algoritmos. Desde el centro de conmutación MSC la red GSM envía un número aleatorio RAND de 128 bits.
El móvil utiliza el número RAND para mezclarlos con un parámetro secreto K i disponible en el centro de
autenticación. El algoritmo llamado A8 procede a mezclar el número RAND de 128 con K i generando la señal
Kc de 64 bits.
El algoritmo de criptografía A5 mezcla el número de trama de 22bits con K c de 64 bits generando la señal S2
de 114bits. La señal S2 se utiliza para recuperar o componer los datos 2x57 bits luego son transmitidos por
puertas lógicas XOR.
Figura 2-1 Criptografía en redes GSM25
25
Abraham José Silva Orozco- Infografía de seguridad en dispositivos móviles 2013
51 | P á g i n a
2.5 Debilidades en la Seguridad
Hasta hace un tiempo, la mayoría de las comunicaciones en telefonía celular se lograban por medio de un
sistema global para las comunicaciones móviles (del inglés Global System for Mobile communications, GSM,
y originariamente del francés groupe spécial mobile) el cual es un sistema estándar, libre regalías, de
telefonía móvil digital.
Un cliente GSM puede conectarse a través de su teléfono con su computadora y enviar y recibir mensajes
por correo electrónico, faxes, navegar por Internet, acceder con seguridad a la red informática de una
compañía (red local/Intranet), así como utilizar otras funciones digitales de transmisión de datos, incluyendo
el servicio de mensajes cortos (SMS) o mensajes de texto.
GSM se considera, por su velocidad de transmisión y otras características, un estándar de segunda
generación (2G). Su extensión a 3G se denomina UMTS y difiere en su mayor velocidad de transmisión, el
uso de una arquitectura de red ligeramente distinta y sobre todo en el empleo de diferentes protocolos de
radio (W-CDMA).
En 2000, el grupo de trabajo para la estandarización del GSM se pasó al grupo TSG GERAN (Technical
Specification Group GSM EDGE Radio Access Network) del programa de cooperación 3GPP, creado para
desarrollar la tercera generación de telefonía móvil (3G). El sucesor del GSM, UMTS, fue introducido en
2001, sin embargo su aceptación fue lenta, por lo que gran parte de los usuarios de telefonía móvil en 2010
seguían utilizando GSM.
26
Debido a éste cambio de estándar y a noticias acerca de ataques a las redes GSM, la seguridad del sistema
se ha visto seriamente comprometida. Para espiar la comunicación entre un móvil GSM y su operadora
basta con un Motorola de hace siete años27 y un programa que cualquiera se descarga de Internet. Según el
criptógrafo berlinés Karsten Nohl, estas herramientas no sólo permiten escuchar conversaciones y leer SMS
ajenos, sino incluso emular un teléfono y su tarjeta SIM. Más del 80% de los móviles en el mundo operan en
GSM.
La gente cree que está más expuesta a los cibercriminales en la PC que en el celular por “desconocimiento
de los problemas de las comunicaciones y móviles, y porque tampoco se han producido todavía ataques
espectaculares que hayan saltado a los medios, salvo quizás el robo de fotos en el terminal de Scarlett
26
GSM Association Latin America
27
Diario El país: LAIA REVENTÓS – “Su móvil es tan o más inseguro que su PC” sección sociedad 19 de diciembre del 2011
52 | P á g i n a
Johansson”28, sostienen David Pérez y José Picó expertos en seguridad, fundadores de la empresa española
Taddong y autores de Hacking y seguridad en comunicaciones móviles GSM/GPRS/UMTS/LTE.
¿Es el móvil tan inseguro o más que la PC? Depende del teléfono, de la PC y del sistema operativo. Y
también del usuario (unos buenos hábitos son la mejor defensa). A medida que los móviles son más
inteligentes los problemas de seguridad se asemejan a los de la PC.
El consultor de seguridad en Kaspersky Lab, Bosco Espinosa, considera al móvil más débil. De entrada, por
su tamaño: “Es más fácil perderlo o que lo roben con todos los datos, contraseñas incluidas, que lleva
dentro”. Otro dato: mientras el 90% de las PC tienen antivirus y cortafuegos, solo el 12% de los smartphones
llevan protección29.
Hasta hace unos años los ataques a móviles eran anecdóticos. Los aparatos eran simples y había una gran
diversificación e incompatibilidades entre el firmware y/o sistemas operativos de los distintos modelos. Es
decir, un código podía ejecutarse en un móvil pero no en otro aunque fuera de la misma marca. Sin
embargo, ya se ha identificado código malicioso para cualquier aparato móvil y sistema operativo. Hay
plataformas más seguras que otras, pero todos tienen vulnerabilidades, estas son puntos débiles del
software que permiten que un atacante comprometa la integridad, disponibilidad o confidencialidad del
mismo. Algunas de las vulnerabilidades más severas permiten que los atacantes ejecuten código arbitrario,
denominadas vulnerabilidades de seguridad, en un sistema comprometido 30.
La aparición de sistemas operativos como Android (Google) o iOS (Apple) suponen una homogeneización del
software que ejecutan los teléfonos, de forma que un programa malicioso preparado para Android lo hará
de forma independiente al modelo o marca del móvil y tableta. Y esto posibilita que se puedan realizar
ataques a mayor escala (un mismo código infectaría a muchos móviles diferentes de forma indiscriminada).
Para un hacker o una persona malintencionada es más los smartphone que los viejos móviles porque
mientras uno contiene datos golosos y tiene más vías de comunicación por las que infiltrarse, sea la red
inalámbrica WIFI, bluetooth o el protocolo GSM; el otro básicamente almacenaba solamente contactos,
quitándole de esta manera, el valor que pudiera tener para un posible objeto de delito.
El móvil pues es tan o más vulnerable que la PC y se puede infectar a través de los protocolos GSM o
Bluetooth, los SMS y hasta mediante las tiendas de aplicaciones. Los riesgos, desde la “ingeniería social por
SMS hasta ataques de troyanos (por ejemplo, que creyendo que estamos instalando un juego, en realidad se
28
http://www.madrimasd.org/informacionidi/noticias/noticia.asp?id=51053
29
http://virusyantivirus.com/el-mercado-de-la-seguridad-movil-crecera-8-en-2013/
30
Diario El país: LAIA REVENTÓS Idem
53 | P á g i n a
introduce un código que espía nuestra información y la envía a terceros). Uno de estos troyanos es SpyEye:
Cuando se realiza una transferencia por Internet el banco envía una clave por SMS que se debe introducir en
la web para verificar que se es la persona. Estos troyanos, una vez instalados en el móvil, son capaces de
interceptar los SMS y permite al atacante realizar transferencias de dinero de forma ilegítima.
Como se menciono anteriormente, la tecnología GSM lleva desde 1998 “muerta” para los profesionales de
la seguridad, cuando se hicieron conocidas diversas técnicas para hacerse pasar por cualquiera que la use,
por debilidades en sus algoritmos criptográficos.
En el 2009 se descifraron los algoritmos que protegen las comunicaciones con GSM, sin embargo, un
reconocido criptólogo e investigador de seguridad alemán, Karsten Nohl dice que “las operadoras se
defienden con tres argumentos: dicen que es imposible, que si fuera posible sería muy complicado y que si
alguien pudiera no lo haría, porque es ilegal” 31. Nohl sostiene que las operadoras de móviles no protegen
suficientemente del espionaje ni de las estafas a los clientes.
Para hacer frente a este problema, cientos de expertos en informática convocados por el congreso anual del
Chaos Computer Club asistieron en Agosto del 2012 a la presentación de sus investigaciones más recientes.
Valiéndose de un móvil y un software libre llamado Osmocom32, Se pudo emular el teléfono móvil de otra
persona sin tener que acceder al aparato en sí. La clave está en el intercambio de comunicación que un
móvil lleva a cabo con la operadora justo antes de establecer una llamada. Durante un segundo, el aparato
y la central telefónica intercambian una serie de mensajes codificados que casi siempre siguen el mismo
patrón. Cada serie tiene un significado concreto, como llamada entrante o fin de la comunicación.
Esto permite al espía o al delincuente predecir el contenido del mensaje y así, descifrarlo. Logrado esto en
cuestión de segundos, el atacante tendrá acceso a la conversación subsiguiente y a todas las que se realicen
con la misma codificación. Además le servirá para hacerse con el código de la tarjeta SIM y emular así el
teléfono atacado. Entonces podrá enviar mensajes de texto y hacer llamadas haciéndose pasar por el otro
teléfono. Las medidas de protección que deberían tomar las operadoras son sencillas y baratas. Sin embargo
aun son renuentes a tomarlos33 .
Las operadoras de móvil suelen referirse a la asociación GSMA como responsable de la seguridad en el
estándar GSM. Sin embargo, tiene dos grandes problemas en sus protocolos de comunicaciones, con lo que
no solo afectan a los teléfonos sino a todos aquellos aparatos que se conectan a esa red, sea un smartphone
31
Portaltic 22 de Julio del 2013, Revista Forbes, Parmy Olson “Sims cards have finally been hacked” - 7 de Julio 2013
32
http://osmocom.org/
33
(http://gsmmap.org)
54 | P á g i n a
o un portátil.
Por un lado, el algoritmo A5/1, que cifra las comunicaciones de voz, ya ha sido decodificado. Este fallo
permite además suplantar al usuario del teléfono para hacer y recibir llamadas.
Por el otro, cualquier atacante puede suplantar la estación base del operador de telecomunicaciones,
porque el protocolo GSM no define ningún mecanismo para que el móvil compruebe la autenticidad de la
red. Es decir, el teléfono no puede saber si la red a la que se está conectando es auténtica. En contraste a lo
anterior, la tecnología 3G es mucho más segura que GSM.
Mientras se convive entre GSM y 3G el usuario debería configurar el teléfono para que sólo se conecte con
la red 3G. Sin embargo, hay aparatos, como iPhone, que no lo permiten. Lo que es una ventaja para las
compañías telefónicas, porque es la terminal la que elige la red a la que se conecta en función de la
disponibilidad de cobertura, pero esto supone un mayor riesgo para la seguridad.
En el móvil, como en la PC, es difícil detectar si un cracker se ha infiltrado. Nunca se sabe, a ciencia cierta, si
equipo ha sido o está siendo atacado, y por eso se tiene muchos sistemas de protección en las PC. Lo
mismo, por tanto, debería hacerse con los teléfonos móviles. Bloquean y borran información, geolocalizan el
aparato (si tiene GPS) y algunos, hasta detectan, si se ha cambiado la SIM y qué nuevo número utiliza. Por
desgracia, se protegen de ciertas posibilidades, pero no cubren tanto como los de la PC.
55 | P á g i n a
56 | P á g i n a
CAPITULO III
Criterios y elección de un algoritmo criptográfico
para dispositivos móviles
3.1 Retos a superar con la elección
Actualmente con el desarrollo de nuevas tecnologías y del crecimiento en el poder computacional, es más
sencillo lograr quebrar la seguridad de los sistemas informáticos y de las comunicaciones pues es mucho
más sencillo acceder a las herramientas necesarias para ello. Un ejemplo claro de esto fue un reto que los
creadores del algoritmo RSA lanzaron: cifraron un texto con RSA y retaron al mundo a que lo descifrase.
Creían que no se podría hacer en menos de 40.000 billones de años. En 1993 se descifró; requirió del orden
de 100.000 billones de instrucciones del computador, la colaboración de cientos de voluntarios por toda la
Internet y el empleo de un método llamado Criba Múltiple Cuadrático-Polinómica. La realización de la
"hazaña" tomó aproximadamente ocho meses.
Tal como pasó en este caso, la historia ha comprobado, una y otra vez, que el tiempo necesario para
descifrar un mensaje es generalmente menor que el que se presupone según la teoría. Eso se debe a cuatro
factores fundamentales.
3.1.1 Creciente capacidad de cómputo de los computadores modernos.
A lo largo de los años se han descubierto procesos algorítmicos cada vez más eficaces para la resolución de
problemas matemáticos; lo que afecta muy especialmente a los algoritmos de clave asimétrica. Cualquier
sistema de cifrado de datos tiene puntos débiles, y los modernos (RSA, Diffie-Hellman, PGP, criptografía de
curva elíptica) no escapan a esta regla. Casi todos los códigos actuales requieren cadenas de dígitos elegidos
aleatoriamente, para lo que se utilizan generadores de números aleatorios o pseudoaleatorios. Pero si
dichos números no son realmente aleatorios, las claves así generadas son vulnerables.
En tal sentido, incluso un protocolo criptográfico bien implementado puede contener imperfecciones que
permitan un ataque más eficiente que el de "fuerza bruta". Más aún, puede afirmarse rotundamente que el
ingenio humano es incapaz de preparar una clave que el mismo ingenio humano no pueda resolver.
57 | P á g i n a
3.1.2 Recursos Computacionales.
El desarrollo de tecnologías avanzadas y menos costosas en el área de computación, incrementa en gran
medida la capacidad de cómputo de los actuales computadores. Esto facilita los ataques de "fuerza bruta" a
los algoritmos de encriptación. De esta forma, lo que en el pasado representaba cientos de años de cálculo,
en la actualidad puede verse reducido a pocos años, o quizás meses.
Adicionalmente, este desarrollo computacional apoya el procesamiento de algoritmos complejos capaces
de resolver problemas matemáticos de alta dificultad, como lo son la factorización de números primos muy
grandes y la resolución de logaritmos discretos. Sin embargo en el objetivo de esta tesis esta la delimitante
de que el móvil por ser un dispositivo basado en tareas no tan demandantes como lo que sería una
computadora de escritorio requiere el mismo nivel de seguridad en caso de algún ataque. En los capítulos
anteriores se ha puesto énfasis en lo peligroso que puede llegar a ser un aparato móvil en manos
desconocidas por tanto el uso correcto de los recursos computacionales a los que el móvil puede llegar es
de vital importancia para el éxito de la aplicación.
3.1.3 Incremento de dispositivos móviles.
Hoy en día se ha incrementado el uso de la web a través de los teléfonos celulares, los asistentes digitales
personales, y otros dispositivos de cómodo traslado. Diversas operaciones son llevadas a cabo a través de
estos dispositivos; enviar e-mail, comercio electrónico, etc. que requieren alto grado de seguridad.
Numerosos inconvenientes se presentan con estos dispositivos a la hora de adecuarlos a las tecnologías de
encriptación: Son pequeños, usan tecnología de comunicación de bajo ancho de banda, tienen poder de
procesamiento y memoria limitada, usan baterías de corta duración, etc. Sin embargo, el uso de los
dispositivos móviles se incrementa con gran rapidez y demanda el desarrollo de implementaciones
criptográficas que se adapten a ellos.
3.1.4 Velocidad en el proceso de encriptación y desencriptación.
El incremento en el uso de los dispositivos móviles ha hecho pensar en la velocidad de encriptación y
desencriptación de las actuales tecnologías criptográficas. Tal como se mencionó anteriormente, estos
dispositivos poseen una serie de limitaciones para el procesamiento de las técnicas de encriptación, entre
ellas está su velocidad. Más aún, estos dispositivos deben ser capaces de realizar actividades diferentes de
las referidas a la seguridad.
A continuación se presentan velocidades aproximadas del proceso de encriptación y desencriptación de
58 | P á g i n a
algunos de los criptosistemas actuales con un procesador de 1 GHz:
Tabla 3-1 Velocidad de los algoritmos de Encriptación.
Algoritmo
DES
3DES
IDEA
Skipjack
CLIPPER chip
Velocidad 1GHz
400 kb/s
150 kb/s
200 kb/s
400 kb/s
No comparable
Longitud de clave
56 bits
112 bits
128 bits
80 bits
80 bits
En tal sentido, la demanda de velocidades mayores en el proceso de encriptación y desencriptación se
incrementa en la medida en que las técnicas criptográficas son aplicadas a dispositivos con menores
capacidades de cómputo. Por ello, se requieren nuevas tecnologías criptográficas que además de proveer
altos niveles de seguridad sean capaces de proporcionar grandes velocidades, acordes a las características
de los dispositivos móviles.
Por los cuatro puntos anteriores se puede delimitar que los retos afrontados en la presente tesis son los
siguientes:

El algoritmo encontrado y elegido no solamente debe ser difícil en su criptoanálisis, sino que debe
servirse de los recursos más bajos posibles

El rendimiento de la batería debe ser optimo

La implementación del algoritmo debe ser posible en el ámbito de los dispositivos móviles.

Delimitar mejoras para el algoritmo elegido, basándose en la premisa de que los algoritmos
actuales no fueron creados en una época donde el cómputo móvil existiera.
3.1.5 Comparativa energética entre los dispositivos móviles con mayor
cuota del mercado.
La siguiente comparativa en tablas están basadas en cifras oficiales, modificadas según el análisis para este
trabajo, el cual fue posible haciendo una investigación en medios de comunicación, entrevistas a usuarios
poseedores de algunos modelos y pruebas de carga de aplicaciones. En la autonomía en llamadas, se realiza
vía 3G, con la pantalla desconectada. En lo que respecta a la navegación web, con niveles de brillo medio. En
ambos casos, sin aplicaciones adicionales corriendo en segundo plano.
59 | P á g i n a
Tabla 3-2 Rendimiento de batería y especificaciones de móviles con mayor afluencia en el
mercado actual (año 2012-2013)34
Nexus 4
Pantalla
Procesador
Sistema
operativo
34
4.7
pulgadas, LCD IPS
Qualcomm
Snapdragon S4 Pro
(APQ8064)
Android 4.2
(Jelly Bean)
Nokia Lumia
920
4.5
pulgadas, LCD IPS
Qualcomm
Snapdragon S4
(MSM8960)
Windows Phone 8
LG Optimus G
BlackBerry Z10
4.7
pulgadas, LCD IPS
Qualcomm
Snapdragon S4 Pro
(APQ8064)
Android Jelly Bean
4.1.2
LG Optimus UI 3.0
68.9 × 131.9 × 8.45
mm
145 gramos
4.2
pulgadas, LCD IPS
Qualcomm
Snapdragon
(MSM8960T)
BlackBerry 10
Dimensiones
68.7 × 133.9 × 9.1
mm
139 gramos
70.8 × 130.3 × 10.7
mm
185 gramos
Capacidad
2.100mAh
2.000mAh
Carga
inalámbrica
Sí
Sí
2.100mAh
No
1800mAh
No
La batería
es Extraíble
No
No
No
Sí
Autonomía
De la bateria
Unas 14 horas en
conversación,
alrededor de 5
horas navegando
15 horas
conversación , 5
horas navegación
web
9 horas en
conversación, 6
horas navegación
Comentario
Mediocre, la
autonomía es una
debilidad en esté
Le cuesta pasar de
las 10 horas
conversación 3G,
unas 6 horas en
navegación web
Mediocre, en la
línea de teléfonos
Android de similar
En la media, muy
No dura
demasiado en
modo
buena batería
cuando se trata de
65.6 × 130 × 9 mm
137,5 gramos
Datos proporcionados en http://www.smart-gsm.com
60 | P á g i n a
modelo. Eso sí,
Google ha hecho
progresos
importantes con
respecto a
Samsung Galaxy
Nexus
tamaño y con
especificaciones
técnicas superiores
(sobre el papel).
Esperaba una
utilizarlo para
realizar llamadas,
cuando tiramos de
potencia (navegar,
vídeo, juegos), nos
la comemos en
poco tiempo. El
teléfono presenta
un modoECO, que
juega con los
núcleos para
mejorar el
rendimiento
conversación, pero
su pequeña batería
se comporta bien
en el resto de
circunstancias. Su
pantalla más
pequeña también
le pide menos
energía.
HTC One
Sony Xperia Z
iPhone 5
Pantalla
4.7 pulgadas, LCD IPS
Full HD
4
pulgadas, LCD IPS
Procesador
Qualcomm Snapdragon
600
Sistema
operativo
Android Jelly Bean 4.1.2
Personalización HTCSe
nse 5.0
5
pulgadas, LCD IPS
Full HD
Qualcomm
Snapdragon S4 Pro
(APQ8064)
Android Jelly Bean
4.1.2
Personalización Sony
Dimensiones
68.2 × 137.4 × 9.3 mm
143 gramos
71 × 139 × 7.9 mm
146 gramos
58.6 × 123.8 × 7.6
mm
Capacidad
2.300mAh
No
2.330mAh
No
1.440mAh
No
2.600mAh
Sí
No
No
No
Sí
Más de 14 horas en
conversación, más de 9
horas en navegación
web
16 horas en
conversación,
alrededor de 7 horas
en navegación web
14 horas en
conversación,
alrededor de 9 horas
en navegación web
Una buena batería, Muy
capaz incluso con tareas
5 pulgadas con la
máxima resolución y
9 horas en
conversación,
alrededor de 10
horas en
navegación web
Pantalla más
pequeña, el más
Carga
inalámbrica
La batería es
Extraíble
Autonomía de la
batería
Comentario
Apple A6
(APL0589)
iOS 6.1.3
Samsung Galaxy
S4
5
pulgadas, AMOLED
Full HD
Qualcomm
Snapdragon 600
Android 4.2.2 Jelly
Bean
Personalización
TouchWiz
69.8 × 136.6 × 7.9
mm
130 gramos
En un tamaño
parecido al S3, se
61 | P á g i n a
complicadas,
especialmente con la
navegación web
Pantalla
Procesador
Sistema operativo
Dimensiones
Capacidad
Carga inalámbrica
La batería es Extraíble
Autonomía de la
batería
Comentario
un hardware muy
potente que tiene
una autonomía
notable. Se tiene un
modo
Stamina que
alarga de forma
considerable en
tiempo de espera
Samsung Galaxy Note II
5,5 pulgadas, AMOLED
Samsung Exynos 4412
Quad
Android 4.1.1 Jelly Bean
Personalización TouchWiz
151.1 × 80.5 × 9.4 mm
183 gramos
3.100 mAh
No
Sí
17 horas en
conversación, alrededor
de las 10 horas en
navegación web
La segunda batería más
grande de la
comparativa, equipada
Samsung con el hardware
Exynos y la pantalla
AMOLED consiguen en la
práctica una autonomía
más que notable. .
delgado del grupo y
con una batería
menor, pero con un
funcionamiento
notable.
tienen 500mAh
más. La autonomía
en todas las
situaciones es muy
buena y se puede
tener de referencia,
al poder reemplazar
la batería
Motorola RAZR MAXX
4,3 pulgadas, AMOLED
TI OMAP 4430
Android 4.0 Ice Cream
Sandwich
130.7 × 68.9 × 9 mm
140 gramos
3.300 mAh
No
No
Más de 20 horas en
conversación, alrededor de las
10 horas en navegación web
Los teléfonos más capaces en
el mercado son de Motorola,
con sus versiones MAXX.
Tenemos una batería de
3.300mAh, y una autonomía
imbatible (ayuda la pantalla de
4.3 pulgadas) y no es pesado
Una vez repasadas las principales características se procederá a elegir el algoritmo que se desarrolle mejor
con las cifras de autonomía antes mencionadas.
62 | P á g i n a
3.2 Fundamentación de la elección
3.2.1 Criterios de elección del algoritmo base AES
En cualquier sistema o dispositivo, la seguridad del cifrado depende de diversos factores
que van
directamente relacionados con la capacidad del dispositivo que los aloja. Los algoritmos de cifrado definen
transformaciones de datos que los usuarios no autorizados no pueden revertir con facilidad. Ningún
algoritmo único resulta idóneo para todas las situaciones. No obstante, en esta tesis se seleccionaron los
siguientes principios generales basándose en la capacidad de cómputo de los móviles actuales:

El cifrado seguro suele consumir más recursos que un cifrado menos seguro.

El cifrado asimétrico es más seguro que el simétrico basándonos en que la distribución de claves es
más fácil y segura ya que la clave que se distribuye es la pública manteniéndose la privada para el
uso exclusivo del propietario, pero este sistema tiene bastantes desventajas:

o
Para una misma longitud de clave y mensaje se necesita mayor tiempo de proceso.
o
Las claves deben ser de mayor tamaño que las simétricas.
o
El mensaje cifrado ocupa más espacio que el original.
Las contraseñas largas y complejas son más seguras que las contraseñas cortas, sin embargo tienen
la desventaja de que al ser más largas aumenta la posibilidad de que el usuario olvide la misma o la
pierda.

La seguridad de los algoritmos actuales en pruebas anteriores hechas por los organismos de
seguridad internacionales como por ejemplo NIST o el gobierno de los Estados Unidos.
Con base en lo anterior, preliminarmente se eligió el algoritmo AES (Advanced Encryption Standard),
también conocido como Rjindael, para comenzar las pruebas en móviles ya que es uno de los algoritmos de
cifrado por bloques más sofisticados y seguros del momento.
De hecho, este popular estándar se usa en operaciones tan importantes como pagos electrónicos o
transacciones bancarias.
3.2.2 Algoritmo simétrico
Pese a que simple vista los algoritmos asimétricos pudieran proveer una implementación y velocidad de
cálculo mejor que los algoritmos simétricos, la realidad es otra: El cifrado simétrico es más rápido que el
cifrado asimétrico, debido a la simplicidad de los algoritmos de clave privada necesarios para un
63 | P á g i n a
determinado nivel de seguridad. Los algoritmos de cifrado asimétricos son más complejos lo que se
contrapone a uno de nuestros objetivos pues es necesario que se pueda implementar en un dispositivo
móvil y no consuma demasiados recursos al ser estos limitados en el mismo. El cifrado asimétrico
normalmente lleva 100 veces más tiempo para cifrar un mensaje dado que el simétrico.
Por lo anterior, la categoría de algoritmos simétricos es la más apta para comenzar a probar y mejorar la
seguridad en los mismos.
3.2.3 Análisis y comparativa de algoritmos simétricos
Una vez elegida la categoría de algoritmos simétricos, se procedió a analizar los algoritmos existentes dentro
de la misma para corroborar que la primera elección (El algoritmo AES) fuera la más acertada para
implementar en un dispositivo móvil.
Mediante las pruebas desarrolladas se buscó determinar si el
algoritmo AES es el más usado debido a su velocidad y seguridad, o si es el más utilizado sólo por su fama o
conveniencia comercial y por tanto, qué tan efectivo es en sistemas cuyo poder de cómputo no es del todo
potente como es el caso de los teléfonos móviles. La metodología del análisis está basada en un trabajo
titulado “Comparación de Perfomance Hardware entre Algoritmo de Cifrado estándar AES y otros
actuales”35
3.2.3.1 Elección de Herramientas
Para la elección de las herramientas era necesario que el software utilizado tuviera la opción de comparar el
algoritmo AES directamente. Por lo tanto, una de las primeras restricciones a tener en cuenta para
seleccionar el software fue que tuviera entre sus opciones a dicho algoritmo. Lo siguiente necesario fue que
las herramientas fueran de código abierto o gratuito para que el análisis no significara una inversión
monetaria fuerte.
Por consiguiente, se eligieron cuatro aplicaciones que cumplían con estos requisitos:

36
CYASSL : Consiste en una biblioteca basada en el lenguaje de programación C que puede ser
utilizada en ambientes embebidos por su pequeño tamaño y velocidad, siendo 20 veces menor que
OpenSSL. Asimismo, incluye algoritmos de cifrado más novedosos. La lista de algoritmos de
encriptación que incluye es la siguiente: AES, ARC4, RABBIT y 3DES. Las pruebas se llevarán a cabo
35
White paper Benchmarking de Algoritmos Simétricos, Lazzati Laura, Majian Carolina, Masi Alejandro, Pablos Federico, Rocha Ivan
36
http://freecode.com/projects/cyassl
64 | P á g i n a
en un entorno Linux Ubuntu debido a su facilidad de ser utilizado por línea de comandos.

37
OpenSSL : Es una implementación OpenSource de los protocolos SSL y TLS, y se halla escrita en el
lenguaje de programación C. Tiene versiones disponibles para los sistemas operativos Linux y
Microsoft Windows, y los algoritmos criptográficos que implementa son: AES, Blowfish, Camellia,
SEED, CAST-128, DES, IDEA, RC2, RC4, RC5, TDES, GOST 28147-89, RSA y DSA. Las pruebas también
se llevarán a cabo en un entorno Linux Ubuntu.

38
TrueCrypt : Aplicación gratuita cuyo código fuente está disponible, permite crear volúmenes
cifrados, de tal forma que todo lo que contengan pueda ser accedido sólo por una contraseña o
archivo clave de creación. Este permite hacer comparaciones entre los distintos algoritmos sobre
velocidad de encriptación, de desencriptación, y velocidad media utilizando distintos tamaños de
buffers. Los algoritmos de encriptación con los que trabaja son: Twofish, AES y Serpent. Si bien está
disponible para los sistemas operativos Linux y Windows, sólo se realizaron pruebas con el sistema
operativo Windows ya que su instalación en un sistema Linux es bastante más compleja.

39
CrypTool : Es una aplicación gratuita que incluye análisis de fuerza bruta para diferentes
algoritmos, criptoanálisis y una explicación detallada de la criptografía clásica simétrica. Está
disponible para sistemas operativos Windows y entre sus algoritmos se encuentran Vigenére,
Cesar, RSA, AES y Enigma. Este último programa se utilizo para analizar los procesos de cada
algoritmo y su velocidad.
En el siguiente apartado se explicarán las pruebas realizadas. Los resultados obtenidos son expresados en
tablas comparativas con su respectivo gráfico.
3.2.3.2 Pruebas realizadas sobre los algoritmos
Las pruebas consistieron en utilizar un archivo de 100kb con texto plano dentro y aplicarle cada algoritmo
de encriptación con los que las herramientas contaban con el fin de saber la velocidad a la que se desarrolla
la encriptación. Cada uno de los resultados (medidos en mbits por segundo) fueron colocados en tablas
comparativas para su posterior análisis.
Para ello cada herramienta (dependiendo si corría en distribuciones Linux o Windows) se instalo en 5
37
http://www.openssl.org
38
http://www.truecrypt.org
39
https://www.cryptool.org/en/
65 | P á g i n a
computadoras diferentes con las siguientes características:
-
Procesador 1.3 GHz ARM: La elección de este procesador es debido a que actualmente los teléfonos
móviles utilizan tecnología ARM para funcionar. Este procesador es uno de los más parecidos a los
40
de un smartphone actual según las características dadas en la página del fabricante .
-
Memoria RAM: La computadora numerada como 1, 3 y 5 utilizaron una memoria de 512 MB,
mientras que las restantes contaron con una memoria de 1 GB.
Después de aplicar el algoritmo al archivo en cuestión y medir su velocidad en cada uno de los 5 equipos de
cómputo se lograron varias tablas, obteniendo los siguientes resultados con cada una de las herramientas
antes descritas:
Tabla 3-3 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta
truecrypt
Prueba 1
Prueba 2
Prueba 3
Prueba 4
Prueba 5
AES
215
62,3
216
86,4
112
Twofish
157
48,1
155
82,9
99
Serpent
104
29,7
105
49,8
52,2
Figura 3-1: Promedio en Mbits/s para distintas computadoras con true crypt
40
http://www.arm.com/products/processors/index.php
66 | P á g i n a
Tabla 3-4 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta
CyaSSL
Prueba 1
Prueba 2
Prueba 3
Prueba 4
Prueba 5
3DES
17,86
12,64
11,59
7,61
11,14
AES
82,17
77,75
70
47,28
56,93
ARC4
90,09
66,47
81,76
78,01
124,97
300,57
223,36
144,99
171,69
143,24
RABBIT
Figura 3-2 Tiempo de ejecución en cada prueba por algoritmo en la herramienta CyaSSL
Tabla 3-5 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta
Cryptool
Prueba 1
rc4
Prueba 2
Prueba 3
Prueba 4
Prueba 5
168,04
220,76
240,56
149,46
180,28
23,13
31,93
56,17
18,58
28,32
7,95
11,89
20,86
6,92
10,26
rc2 cbc
23,84
31,08
29,87
15,76
13,91
blowfish
cbc
87,16
93,48
93,25
49,67
45,86
aes-128 cbc
76,32
102,98
44,01
56,13
49,56
aes-192 cbc
57,64
87,8
32,93
49,93
46,8
aes-256 cbc
31,34
78,68
33
44,19
42,41
aes-128 ige
75,78
97,25
39,17
55,46
76,18
aes-192 ige
65,17
85,45
29,3
48,82
66,95
aes-256 ige
23,77
71,63
30,31
43,26
59
des cbc
des ede3
67 | P á g i n a
Figura 3-3 Tiempo de ejecución mbits/seg en cada prueba por algoritmo en la herramienta Cryptool
Luego de analizar los resultados obtenidos en los diferentes equipos hardware, se llegó a la conclusión de
que existen dos algoritmos con una velocidad notablemente mayor al algoritmo del AES, que son RC4 y
Rabbit. Este fue un resultado no del todo esperado debido a que el Algoritmo AES es el más utilizado
actualmente, sin embargo se decidió analizar las características de estos dos algoritmos para verificar que
cumplieran con las especificaciones para ser implementados en dispositivos móviles.
Primeramente, en cuanto a su funcionamiento se destaca que tanto RC4 como Rabbit son algoritmos para
cifrado de flujo, mientras que AES es de bloque. Es sabido que los algoritmos de flujo son, por su modo de
funcionamiento, más rápidos que los de bloque, además de tener una menor complejidad a nivel de
hardware. Sin embargo, los algoritmos de cifrado de bloque suelen requerir de más memoria para
funcionar, puesto que trabajan con bloques de datos mayores que los de flujo y son más susceptibles a la
existencia de ruidos en la transmisión, lo que implica que si se interrumpe la transmisión de datos es
imposible recuperarlos, mientras que los de flujo sí se pueden hacerlo ya que los datos son encriptados
individualmente byte a byte.
41
Ante esto, se procedió a analizar si era posible utilizar entonces algoritmos de cifrado de flujo en un entorno
móvil en vez de la primera elección (AES) tomando en cuenta las características que estos poseen. Al
41
Jorge Ramió (UPM) - Criptografía y Seguridad Informática
68 | P á g i n a
42
finalizar se encontraron algunas desventajas :
-
Son más difíciles de implementar correctamente y están más predispuestos a debilidades basadas
en su uso, dado que tienen requerimientos muy estrictos.
-
No proveen protección de integridad o autenticación, mientras que algunos de los algoritmos de
cifrado de bloque sí lo hacen, y suelen tener mayor seguridad.
-
Requieren de mayor memoria para funcionar.
-
Si se llega a interrumpir la transmisión es casi imposible recuperar la totalidad de los datos.
Entrando más en detalle a los algoritmos en cuestión, el algoritmo RC4 o ARC era un secreto comercial
hasta que alguien publicó código fuente de un algoritmo, declarando que era equivalente a RC4. El
algoritmo es muy rápido, por lo cual puede tener uso en ciertas aplicaciones. Si bien tiene un mayor
velocidad sobre el hardware que el AES, fue excluido de cualquier estándar de alta seguridad y algunos
modos de usar el algoritmo de criptografía RC4 lo han llevado a ser un sistema de criptografía muy inseguro.
Con respecto al Rabbit, es un algoritmo de cifrado de flujo reciente, basado en iterar un conjunto de
funciones no lineales acopladas. Se caracteriza por su alta rendimiento en software, y no se han encontrado
hasta el momento debilidades criptográficas significativas. Sin embargo al ser un algoritmo relativamente
nuevo su implementación es demasiado compleja lo que implicaría costos altos.
Dado que una de las premisas para el presente trabajo era que la implementación del algoritmo fuera
realizable en un entorno móvil, ambos algoritmos tienen la desventaja de que su implementación es
compleja, lo que llevaría más tiempo de desarrollo y de que ambos necesitan más memoria para funcionar ,
un recurso limitado e indispensable que es necesario racionar, por esto se encontró que el AES sigue siendo
el algoritmo de cifrado de bloque más rápido a nivel hardware entre los algoritmos de cifrado que se
analizaron.
Las siguientes tablas denotan, en reasumidas cuentas, los resultados obtenidos entre las tres herramientas y
el promedio de velocidad alcanzado total en cada una de las computadoras.
42
Jorge Ramió (UPM) - Criptografía y Seguridad Informática
69 | P á g i n a
Tabla 3-6 Resultados Finales: Uniendo las tres herramientas. Unidad/MB-S
Truecrypt
3DES
Cryptool
CyaSSL
0
11,22
0
135,96
59,08
61,67
ARC4
0
82,8
203,78
blowfish
cbc
0
0
61,67
Camellia
0
0
59,35
cast cbc
0
0
43,12
Des
0
0
20,57
RABBIT
0
184,62
0
rc2 cbc
0
0
24,01
seed cbc
0
0
32,92
Serpent
67,48
0
0
Twofish
107,06
0
0
Whirlpool
0
0
15,87
AES
Figura 3-4 Comparativa en función del software (en Mbits/s)
70 | P á g i n a
Tabla 3-7 Velocidad promedio en Mbits/s de todos los algoritmos analizados en los
correspondientes 5 equipos
MB/s velocidad
3DES
11,22
whirlpool
15,87
DES
20,57
rc2 cbc
24,01
seed cbc
32,92
cast cbc
43,12
camellia
59,35
blowfish
cbc
61,67
Serpent
67,48
Twofish
107,06
AES
135,96
RABBIT
184,62
ARC4
203,78
Figura 3-5 Rendimiento promedio en Mbits/s de todos los algoritmos analizados en los correspondientes
5 equipos
71 | P á g i n a
3.2.4 Algoritmo elegido AES: Conceptos básicos
Advanced Encryption Standard (AES), también conocido como Rijndael (Nombre derivado de los apellidos de
sus dos creadores), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el
gobierno de los Estados Unidos. El AES fue anunciado por el Instituto Nacional de Estándares y Tecnología
(NIST) como FIPS
43
PUB 197 de los Estados Unidos (FIPS 197) el 26 de noviembre de 2001 después de un
proceso de estandarización que duró 5 años. Se transformó en un estándar efectivo el 26 de mayo de 2002.
Desde 2006, el AES es uno de los algoritmos más populares usados en criptografía simétrica.
El cifrado fue desarrollado por dos criptólogos belgas, Joan Daemen y Vincent Rijmen, ambos estudiantes de
la Katholieke Universiteit Leuven, y enviado al proceso de selección AES bajo el nombre "Rijndael".
Figura 3-6 Proceso de encriptación del algoritmo AES44
43
Federal Information Processing Standard
44
AES inspector
72 | P á g i n a
Historia
En 1997, el Instituto Nacional de Normas y Tecnología (NIST) decidió realizar un concurso para escoger un
nuevo algoritmo de cifrado capaz de proteger información sensible durante el siglo XXI.
El 2 de enero de 1997 el NIST anunció su intención de desarrollar AES, con la ayuda de la industria y de la
comunidad criptográfica. El 12 de septiembre de ese año se hizo la convocatoria formal. En esta
convocatoria se indicaban varias condiciones para los algoritmos que se presentaran:

Ser de dominio público, disponible para todo el mundo.

Ser un algoritmo de cifrado simétrico y soportar bloques de, como mínimo, 128 bits.

Las claves de cifrado podrían ser de 128, 192 y 256 bits.

Ser implementable tanto en hardware como en software.
El 20 de agosto de 1998 el NIST anunció los 15 algoritmos admitidos en la primera conferencia AES. La
segunda conferencia AES tuvo lugar en marzo de 1999 donde se discutieron los análisis a los que fueron
sometidos los candidatos por la comunidad criptográfica internacional. Se admitieron comentarios hasta el
15 de abril. El NIST decidió en agosto de 1999 cuales serían los 5 finalistas:

MARS

RC6

RIJNDAEL

SERPENT

TWOFISH
Estos algoritmos fueron sometidos a una segunda revisión, más exhaustiva, que duró hasta el 15 de mayo
de 2000. Durante este periodo el NIST admitió análisis de los algoritmos finalistas.
Durante los días 13 y 14 de abril de 2000 tuvo lugar la tercera conferencia AES donde se discutieron los
últimos análisis de los algoritmos finalistas. En ella estuvieron presentes los desarrolladores de los
algoritmos finalistas.
El 15 de mayo de 2000 finalizó el periodo público de análisis. El NIST estudió toda la información disponible
para decidir cuál sería el algoritmo ganador. El 2 de octubre de 2000 se votó cual sería el algoritmo que
finalmente ganaría el concurso. El resultado fue el siguiente:
73 | P á g i n a
 MARS: 13 votos
 RC6: 23 votos
 RIJNDAEL: 86 votos
 SERPENT: 59 votos
 TWOFISH: 31 votos
El algoritmo Rijndael ganó el concurso y en noviembre de 2001 se publicó FIPS 197 donde se asumía
oficialmente.
3.2.5 Desarrollo
Rijndael fue un refinamiento de un diseño anterior de Daemen y Rijmen: Square. Al contrario que su
45
predecesor DES, Rijndael es una red de sustitución-permutación, no una red de Feistel . AES es rápido tanto
en software como en hardware, es relativamente fácil de implementar, y requiere poca memoria.
3.2.6 Seguridad de AES
46
En el año 2011 los investigadores de Microsoft Research descubrieron una vulnerabilidad en el algoritmo
AES. Describieron que incluso conociendola no tiene implicaciones prácticas en la seguridad de los datos
pues se necesitaría un billón de ordenadores que pudieran cada uno probar mil millones de claves por
segundo, tardarían más de 2.000 millones de años en dar con una del sistema AES-128, y hay que tener en
cuenta que las máquinas actuales sólo pueden probar 10 millones de claves por segundo. Antes de ello no
se había encontrado ningún ataque exitoso contra el AES.
La Agencia de Seguridad Nacional de los Estados Unidos (NSA) revisó todos los finalistas candidatos al AES,
incluyendo el Rijndael, y declaró que todos ellos eran suficientemente seguros para su empleo en
información no clasificada del gobierno de los Estados Unidos. En junio de 2007, el gobierno de los Estados
Unidos anunció que el AES podía ser usado para información clasificada:
45
Cifrado de Feistel es un método de cifrado en bloque con una estructura particular. También es conocida comúnmente como Red de
Feistel. Un gran número de algoritmos de cifrado por bloques lo utilizan, siendo el más conocido el algoritmo Data Encryption Standard
(DES).
46
http://research.microsoft.com/en-us/
74 | P á g i n a
"The design and strength of all key lengths of the AES algorithm (i.e., 128, 192 and 256) are sufficient to
protect classified information up to the SECRET level. TOP SECRET information will require use of either the
192 or 256 key lengths. The implementation of AES in products intended to protect national security systems
and/or information must be reviewed and certified by NSA prior to their acquisition and use. "47
Este hecho marca la primera vez que el público ha tenido acceso a un cifrador aprobado por la NSA para
información secreta (TOP SECRET).
El método más común de ataque hacia un cifrador por bloques consiste en intentar varios ataques sobre
versiones del cifrador con un número menor de rondas. El AES tiene 10 rondas para llaves de 128 bits, 12
rondas para llaves de 192 bits, y 14 rondas para llaves de 256 bits. Hasta 2005, los mejores ataques
conocidos son sobre versiones reducidas a 7 rondas para llaves de 128 bits, 8 rondas para llaves de 192 bits,
y 9 rondas para llaves de 256 bits (Ferguson et al, 2000).
Algunos criptógrafos muestran preocupación sobre la seguridad del AES. Consideran que el margen entre el
número de rondas especificado en el cifrador y los mejores ataques conocidos es muy pequeño. El riesgo es
que se puede encontrar alguna manera de mejorar los ataques y de ser así, el cifrado podría ser roto. En el
contexto criptográfico se considera "roto" un algoritmo si existe algún ataque más rápido que una búsqueda
exhaustiva (ataque por fuerza bruta). Hasta el momento, tales preocupaciones pueden ser ignoradas. El
ataque de fuerza bruta más largamente publicitado y conocido ha sido contra una clave de 64 bits RC5 por
distributed.net.
Otra preocupación es la estructura matemática de AES. A diferencia de la mayoría de cifradores de bloques,
AES tiene una descripción matemática muy ordenada. Esto no ha llevado todavía a ningún ataque, pero
algunos investigadores están preocupados que futuros ataques quizá encuentren una manera de explotar
esta estructura.
En 2002, un ataque teórico, denominado "ataque XSL", fue anunciado por Nicolas Courtois y Josef Pieprzyk,
mostrando una potencial debilidad en el algoritmo AES. Varios expertos criptográficos han encontrado
problemas en las matemáticas que hay por debajo del ataque propuesto, sugiriendo que los autores quizá
hayan cometido un error en sus estimaciones. Si esta línea de ataque puede ser tomada contra AES, es una
cuestión todavía abierta. Hasta el momento, el ataque XSL contra AES parece especulativo; es improbable
que nadie pudiera llevar a cabo en la práctica este ataque.
47
CNSS Policy No. 15, Fact Sheet No. 1 National Policy on the Use of the Advanced Encryption Standard (AES) to Protect National
Security Systems and National Security Information June 2003
75 | P á g i n a
3.2.7 Funcionamiento básico del algoritmo elegido: AES
Estrictamente hablando, AES no es precisamente Rijndael (aunque en la práctica se los llama de manera
indistinta) ya que Rijndael permite un mayor rango de tamaño de bloques y longitud de claves; AES tiene un
tamaño de bloque fijo de 128 bits y tamaños de llave de 128, 192 o 256 bits, mientras que Rijndael puede
ser especificado por una clave que sea múltiplo de 32 bits, con un mínimo de 128 bits y un máximo de 256
bits.
La mayoría de los cálculos del algoritmo AES se hacen en un campo finito determinado.
AES opera en una matriz de 4×4 bytes, llamada state (algunas versiones de Rijndael con un tamaño de
bloque mayor tienen columnas adicionales en el state).
AES utiliza claves de 128, 192 o 256 bits de longitud, sobre bloques fijos de 16 bytes, lo que da como
resultado bloques cifrados en la salida del mismo tamaño que en la entrada, 16 bytes.
Uno de los puntos destacados del AES es la manera en la que se aplica su clave K . En primer lugar, ésta se
expande en un subconjunto formado por (k0,k1,k2,… kn), a cada una de ellas se le aplica una función round
r(kn, ), que realiza una operación binaria XOR con el mensaje, es decir, el bloque de entrada es cifrado por
cada una de las subclaves r( kn )hasta llegar al final.
En cada round, se llevan a cabo diferentes funciones de sustitución y permutación, por lo tanto se cambia
el orden y estado inicial de los datos incluidos en el mensaje inicial. Este proceso debe ser reversible, para
que el sistema sea capaz de desencriptar el mensaje.
76 | P á g i n a
Figura 3-7 Diagrama general del algoritmo AES y su funcionamiento48
48
Apuntes de criptografía de la Facultad de Ingeniería de la UNAM, Mayo 2013
77 | P á g i n a
Pseudocódigo
Expansión de la clave usando el esquema de claves de Rijndael.
Etapa inicial:
AddRoundKey – Calculo de las sub claves, cada byte del «state» se combina con un byte de la subclave
usando la operación XOR (⊕).
Figura 3-8 Función Addround
Rondas:
SubBytes —Aquí cada byte del actual estado es sustituido por su correspondiente, según una tabla S de
búsqueda.
Figura 3-9 Función Bytesub
ShiftRows — en este paso se realiza una transposición donde cada fila del «state» es rotada de manera
cíclica un número determinado de veces.
Figura 3-10 Función Shiftrows
MixColumns — operación de mezclado que opera en las columnas del «state», combinando los cuatro bytes
78 | P á g i n a
en cada columna usando una transformación lineal.
Figura 3-11 Función MixColumns
Salida
Finalmente, después de aplicar 10 rounds sobre los 16 bytes del bloque de entrada, se obtiene en la salida
un bloque de igual tamaño, 16 bytes. De hecho, tanto el mensaje como las round keys mantienen una
longitud de 128 bits durante todo el proceso.
Descifrado
Figura 3-12 Proceso de descifrado del Algoritmo AES 49
49
Informe de Seguridad europea para USA- Alfonso Muñoz Muñoz 2004
79 | P á g i n a
80 | P á g i n a
CAPITULO IV
Propuesta de mejoras al algoritmo
Tomando en cuenta las limitaciones que poseen los dispositivos móviles en la actualidad (poder de
procesador, duración de la batería y memoria interna) se proponen algunas mejoras para el rendimiento del
algoritmo AES, manteniendo su seguridad para lograr un balance entre ambas al fin de ser utilizado en
cualquier dispositivo móvil sin sacrificar la vida de la batería que es lo primordial.
Se requiere una optimización tomando en cuenta también que los actuales teléfonos móviles utilizan
microprocesadores ARM de 32 bits, con lo cual se procederá a simularlos con el programa Keil uVision4 que
es proporcionado en la misma página de los procesadores ARM como un kit de herramientas para
desarrolladores.
En este capítulo se describe la implementación del algoritmo AES así como las mejoras de rendimiento que
se proponen aplicar al mismo.
El capítulo se divide en dos apartados, en los que se explican los principales bloques de la presente tesis:

Implementación.

Mejoras de rendimiento, tomando como base el tiempo de ejecución.
Cada uno de ellos llevara un diseño de algoritmo que variará con las mejoras del mismo bloque. Para
comprobar su funcionamiento se usaron los conjuntos de vectores facilitados por el NIST (National Institute
of Standards and Technology ) en la sección de los algoritmos de cifrado de bloque.50
Se probó en sus posibles tamaños de clave (128, 192 y 256 bits) para cifrar y descifrar y posteriormente se
irán aplicando las mejoras para procesadores de 32 bits que son el estándar de la mayoría de los teléfonos
móviles actuales (a excepción de la nueva gama de iphone o del Samsung galaxy S4 que usan una
arquitectura de 64 bits).
Esto se ha hecho en lenguaje de programación C para su implementación en el microprocesador ARM7
mediante el programa Keil uVision4 y poder utilizarlo en las mediciones de la velocidad y rendimiento.
50
Dworkin, Morris. Recommendation for Block Cipher Modes of Operation, Methods and Techniques NIST
81 | P á g i n a
4.1 Entorno de trabajo
4.1.1 Microprocesador para móviles
Cuando se pensó en la arquitectura del procesador se tenía claro, por los anteriores análisis, que sería ARM
debido a que los procesadores ARM son predominantes en el mercado, llegando a utilizarse en millones de
teléfonos, tabletas o sistemas de videojuegos portátiles entre otras aplicaciones. En todas mantienen la
premisa de un procesamiento relativamente elevado y un consumo de energía bajo lo cual viene bien para
las especificaciones de energía de ahorro de batería en el presente trabajo.
Se denomina ARM (Advanced RISC Machines) a una familia de microprocesadores diseñados por la empresa
Acorn Computers y desarrollados por Advanced RISC Machines Ltd. Los microprocesadores ARM7 son unos
microprocesadores con arquitectura de 32 bits, son de bajo coste y están orientados a sistemas móviles
que ofrecen una muy buena capacidad de cómputo. En concreto el chip utilizado está presente en
dispositivos tales como Game Boy Advance, Nintendo DS, Apple iPod, Samsung Galaxy , Lego NXT, y Juice
Box entre otros.
A pesar de que el sector de los microprocesadores se renueva a una gran velocidad, el mercado sigue
utilizando microprocesadores sucesores del ARM7, lo cual permite que los resultados de esta tesis puedan
ser migrados a cualquier tipo de teléfono celular que tenga alguna gama de este procesador.
4.1.2 Kit de desarrollador ARM- Keil uVision4
La implementación del algoritmo AES ha sido desarrollado mediante el programa uVision4 del fabricante
Keil.
Figura 4-1 Pantalla principal del software KeilUvision
82 | P á g i n a
KeiluVision es una herramienta específicamente desarrollada para
probar o desarrollar en
microprocesadores como el ARM7 y está enfocado a crear programas en código C o ensamblador para el
micro procesador, compilarlos, emularlos o ejecutarlos sobre el propio micro procesador en caso de tenerlo
físicamente.
El software también tiene la función de mostrar una emulación del tiempo que consume el microprocesador
en un conjunto de operaciones, por lo que se pueden tomar mediciones de tiempo directamente desde el
procesador siendo éstas casi completamente fiables.
4.1.3 Lenguaje de programación C
Aunque actualmente el auge de la tecnología Java está en aumento para los teléfonos móviles, es cierto que
la gran mayoría de los códigos escritos en C o C# pueden ser convertidos con relativa facilidad a archivos .jar,
ya sea de manera manual o con los software de conversión que actualmente existen de manera gratuita,
además de algunas terminales poseen simuladores de lenguaje C.
Basándonos en lo anterior, se ha decidido usar el lenguaje de programación C debido a que al no ser un
lenguaje propio de una sola plataforma puede reutilizarse en muchas otras, además de que el software de
desarrollo utilizado permite su utilización sobre las pruebas en microprocesadores. C es un lenguaje de
programación no orientado a objetos simple y flexible. Utiliza tipos primitivos para evitar utilizar
operaciones redundantes y punteros para referenciar posiciones de memoria. A pesar de ser un lenguaje no
orientado a objetos, permite el encapsulado y polimorfismo de una manera rudimentaria gracias a los
punteros a funciones y variables estáticas
4.1.4 Rijndael Inspector 1.1
Rinjndael Inspector
51
es un software diseñado por Enrique Zabala para el proyecto Cryptool. En él se
permite, aplicando el algoritmo AES, realizar el cifrado o descifrado de un bloque de 128 bits, utilizando una
clave de una longitud de 128 bits. Se puede introducir manualmente el valor tanto del bloque a cifrar o
descifrar como de la clave.
Ha sido especialmente de utilidad porque no sólo encripta o desencripta los datos, sino que muestra todos
y cada uno de los valores que adquiere el Estado, además de las diferentes subclaves, es decir, que muestra
los resultados después de cada operación realizada (SubBytes, MixColumns, etc).
51
http://pacofdez.hostzi.com/swf/Rijndael-Inspector-v1.1-esp.swf
83 | P á g i n a
4.1.5 Battery Monitor Widget
Battery Monitor Widget es una aplicación para teléfonos que tengan como base un sistema android, más
que un widget, es una herramienta que de análisis completo acerca de la batería y su uso. El pequeño
widget de 1x1 nos muestra lo más importante de la batería. Aparece el estado de la batería en porcentaje
así como la corriente de descarga en mA (Miliamperios). Los valores son predeterminados y podemos
ajustarlo a nuestra elección.
La calibración manual nos asegura datos más precisos. Podemos especificar la capacidad de la batería y la
tensión de salida del cargador. Estos valores se determinan de manera automática pero podemos cambiarlo
manualmente para minimizar el margen de error.
Lo interesante de esta aplicación para nuestros fines es su apartado de estadísticas, en el se presenta todo lo
relacionado con la batería ya sea el consumo medio o el tempo estimado para volver a cargar la batería. Una
característica muy práctica es la que nos muestra la estimación de la duración de la batería en base al uso de
aplicaciones (una a una), WiFi, encendido/apagado de la pantalla, bluetooth, etc. todo lo que se quiera
calcular en base al gasto de la batería está contemplado. No hay lugar a duda. Así podemos saber, por
ejemplo, que aplicación es la que más consume y ejecutarla de forma más racional para optimizar el uso de
la batería. Tiene un historial con una visión perfecta de los procesos de carga y descarga, Los procesos se
muestran en una tabla en intervalos de 10 minutos. Además todos los datos se pueden exportar y podemos
controlar un número infinito de baterías y aplicaciones.
Dado que la presente tesis implica hacer un análisis de la batería con las mejoras aplicadas, con esta
herramienta se puede saber con exactitud qué proceso consume más y cuanto exactamente. Battery
Monitor Widget es fluido y estable. El consumo de batería que hace esta aplicación es mínimo.
Figura 4-2 Pantalla principal de Battery Monitor Widget
84 | P á g i n a
4.2 Implementación de AES
En esta primera fase únicamente se busca implementar el AES en todos los posibles tamaños de la clave
respetando siempre las especificaciones del NIST.
4.2.1 Funcionamiento del programa
Se ha realizado un diagrama para explicar el funcionamiento general del programa de manera que pueda
facilitarse su explicación:
Figura 4-3 Diagrama de funcionamiento del algoritmo52
El programa ejecuta el algoritmo AES tanto para cifrar como para descifrar con tamaños de clave de 128,
192 y 256 bits. Con el objetivo de que la aplicación sea lo más eficiente posible, dentro de la inicialización
de periféricos del software ARM se configura la frecuencia de trabajo del microprocesador y del periférico.
De este modo la ejecución se realizará a la máxima velocidad.
Hay una primera fase (llamada toma de parámetros) en la que el programa inicializará la mayor parte de las
herramientas del microprocesador y establecerá las características de la operación.
En la toma de parámetros hay una correspondencia entre caracteres y funcionamiento, esto está delimitado
por la siguiente tabla:
52
L.C.I Nancy Paola Galvez Meza
85 | P á g i n a
Tabla 4-1 parámetros de inicialización
Carácter recibido
Modo de funcionamiento
‘d’ o ‘D’
Descifrado
Cualquier otro
Cifrado
‘3’
Tamaño de clave de 256 bits
‘2’
Tamaño de clave de 192 bits
Cualquier otro
Tamaño de clave de 128 bits
Se procede con la segunda fase (llamada ejecución) en la que el programa generará las subclaves de la ronda
y esperara el bloque de cifrado, le aplicara las operaciones de cifrar y descifrar y devolverá los caracteres
resultantes del proceso.
Después de introducir el carácter que define si se va a cifrar o descifrar y tras obtener la clave, el programa
permanecerá a la espera de bloques a cifrar o descifrar, los cuales devolverá cifrados o descifrados.
4.2.2 Distribución del programa
El programa realizado se ha dividido en diferentes archivos. Cada uno contiene funciones y variables
clasificadas por su utilidad. Los archivos del programa principales y donde se aplicaron las mejoras son
aes.c, y main.c.
En la siguiente tabla se indica que funciones y variables se encuentran en cada uno de ellos. Además ofrece
una breve descripción sobre la utilidad y el funcionamiento de algunas de las funciones o variables.
Tabla 4-2 resumen de funciones de la implementación del algoritmo AES
aes.c
Variables
int sbox[256] Tabla S-box.
int isbox[256] Tabla S-box inversa.
estado [4][4] Matriz de estado sobre la que se irán
aplicando todas las operaciones durante el proceso
86 | P á g i n a
de cifrado.
roundKey[240] Arreglo con el conjunto de todas las
subclaves de ronda.
int Rcon[255] Constantes Rcon
Funciones
setEstado(entrada[16]) Coloca los componentes del
arreglo de entrada en sus lugares dentro de la
variable estado[4][4].
getEstado() Devuelve un puntero al arreglo de la
matriz de estado
keyExpansion() Crea todas las subclaves de ronda a
partir del contenido de la variable clave del archivo
main.c
addRoundKey(ronda)Realiza
la
operación
AddRoundKey entre la matriz de estado y la
correspondiente subclave de ronda depositando el
resultado en la matriz de estado
subBytes()Estas operaciones se corresponden con
las operaciones principales del algoritmo AES y sus
inversas.
Trabajan directamente sobre la matriz de estado y
no necesitan ningún parámetro.
invSubBytes()
shiftRows()
invShiftRows()
mixColumns()
invMixColumns()
main.c
Variables
Cifrar 1 – cifrar, 0 – descifrar.
longitudClave clave[32] Arreglo que guarda la clave
de cifrado. Su tamaño es el mayor posible, en caso
de que la clave no sea de la mayor longitud (256
bits) las últimas posiciones del arreglo se ignorarán.
87 | P á g i n a
claveRecibida[64] Almacena los caracteres recibidos
como clave.
palabraRecibida[32]
Almacena
los
caracteres
recibidos como bloque a cifrar.
bloque[16] Arreglo que guarda el bloque a cifrar
tras averiguar el significado de los caracteres
recibidos.
palabraProcesada[16] Guarda el bloque resultante
del proceso de cifrado/descifrado.
numeroRondas
nuevaPalabra Indica cuando se ha recibido todo un
bloque por el puerto serie
Funciones
fijaBloque()
Averigua el valor real de los caracteres ASCII
recibidos como bloque de cifrado y lo almacena en
la variable bloque.
fijaClave()Averigua el valor real de los caracteres
ASCII recibidos como clave y lo almacena en la
variable clave.
leeCifra(caracter) Devuelve el valor real de un
carácter ASCII
leeChar(valor) Devuelve el carácter ASCII de un
valor numérico
main() Método main del programa. Comienza a
partir de él.
En conjunto, estos archivos nos permiten ejecutar el algoritmo AES con un funcionamiento que sigue paso
por paso las especificaciones de Daemen y Rijmen explicadas en el capítulo 2 y 3. El detalle de la estructura
del programa se puede visualizar en los anexos.
4.3 Mejoras de rendimiento
Después de implementar el algoritmo AES y de ejecutarlo, el principal objetivo es mejorar su velocidad, ya
88 | P á g i n a
sea aprovechando características del microprocesador o del mismo algoritmo y poder utilizar esas mejoras
en futuras. De esta manera las mejoras podrán ser ubicadas en cualquier otra implementación del
algoritmo. Es por esto que se ha preferido enriquecer las funciones básicas del algoritmo en vez de la
presentación o captura de datos dentro del algoritmo AES.
4.3.1 Complejidad temporal del Algoritmo
Se denomina complejidad temporal a la función T(n) que mide el número de instrucciones realizadas por el
algoritmo para procesar los n elementos de entrada. Cada instrucción tiene asociado un costo temporal.
Afecta al tiempo de ejecución el orden en que se procesen los elementos de entrada. Podría considerarse
que los valores de los n casos que se presentan como entrada son los correspondientes: a un caso típico, o a
un caso promedio, o de peor caso. El peor caso es el más sencillo de definir (el que demore más para
cualquier entrada), pero si se desea otros tipos de entrada habría que definir qué se considera típico, o la
distribución de los valores en el caso promedio.
Para analizar el algoritmo y para comprobar que las mejoras consigan el objetivo, se han efectuado
mediciones de tiempo en la ejecución de cada una de las funciones que conforman el algoritmo. El
programa Keil uVision4 de ARM aporta una herramienta que nos permite simular el funcionamiento del
programa y nos ayuda a saber cuánto tiempo tarda en efectuar todas y cada una de las operaciones.
4.3.2 Análisis del algoritmo AES
Proponer mejoras de tiempo de ejecución en el algoritmo es tomar en cuenta el hecho de que se debe
comprender cómo trabaja en cada una de sus fases, para eso se realizó un análisis del mismo dividido en dos
partes.
En principio de tomaron mediciones en el tiempo de ejecución de cada una de las funciones y se
compararon entre ellas para determinar cuál es la que consume más tiempo de ejecución y por tanto
centrarse en la mejora de ésta, después se analiza la manera en que el algoritmo está diseñado para
verificar que tipo de mejora suponen una mayor eficiencia en el tiempo de proceso del mismo.
4.3.2.1 Análisis de tiempos de AES
La primera medición base del algoritmo se realizó con base en un sólo bloque de cifrado en los tres posibles
tamaños de clave a los que se ha referido en el presente documento. Los resultados de estas mediciones se
pueden observar en la siguiente tabla:
89 | P á g i n a
Tabla 4-3 Medición del tiempo en cada función del algoritmo AES medidos en microsegundos (µs)
Tamaño de clave
128 bits
192 bits
256 bits
Inserción de datos
12.935µs
12.935µs
12.935µs
KeyExpansion
156.24µs
178.187µs
213.716µs
AddRoundKey
95.5µs
115.5 µs
129 µs
SubBytes
73.333µs
88µs
102.667µs
ShiftRows
14.5µs
16.8µs
19.113µs
MixColumns
82.550µs
106.45µs
129.99µs
InvShiftRows
13.333µs
16.06µs
19.067µs
InvSubBytes
72.35µs
87.89µs
103µs
InvMixColumns
1246µs
1519.µs
1796µs
La grafica siguiente muestra de manera más clara cuál de las funciones del algoritmo tiene más peso en su
tiempo de ejecución:
Figura 4-4 Proceso para un bloque de cifrado dependiendo del tamaño de clave
90 | P á g i n a
En la gráfica anterior se observa que la función con más peso es InvMixColumns, ocupando un 75% del
total del tiempo. También se puede ver que la
extracción e inserción de los datos y las funciones
ShiftRows e InvShiftRows tienen muy poco peso en funcion al tiempo de ejecución que toma cada
una.
Hay algo importante en la función KeyExpansion , pese a que es la segunda función con más tiempo en
ejecución, está se ejecuta solo una vez durante todo el proceso, por tanto aunque el tamaño de los
aumente, el tiempo se mantendrá constante.
Con base en los resultados de tiempo de ejecución anteriores se concluyeron las siguientes premisas:
1. La función InvMixColumns es la que debe mejorarse para reducir al máximo su tiempo de
proceso.
2. Las funciones ShiftRows e InvShiftRows serán revisadas pero sus mejoras no son
prioritarias.
3. En caso de que se ejecuten pocos bloques de cifrado la función KeyExpansion tiene
importancia. Se incluirá por esto una mejora en el tiempo, sin embargo como al aumentar los
bloques el peso de esta función tendera a cero no será tomada como prioridad.
4. El resto de funciones serán revisadas para reducir al máximo posible sus tiempos de proceso.
4.3.2.2 Análisis del programa AES
Para lograr una mayor eficiencia del algoritmo se ha analizado el código creado, las operaciones propias del
algoritmo y las posibilidades de desarrollo. La idea de la eficiencia de los algoritmos se basa en la premisa de
que el éxito de un algoritmo no debe de depender en ningún caso de la velocidad ni del potencial del
sistema en que se ejecute. Un algoritmo eficiente siempre tiene que ser mejor que otro que no lo es, aun en
el caso de que el segundo se ejecute en un sistema claramente superior.
Se han descubierto varios puntos fuertes que se pueden explotar como la posibilidad de trabajar con
palabras de 32 bits con la que cuenta nuestro microprocesador y puntos débiles que se pueden depurar, las
cuales serán expuestas en cada una de las correspondientes funciones. Por tanto se han descubierto
diferentes tipos de mejoras que se pueden utilizar en distintas partes del programa y funciones del
algoritmo.
Las mejoras que más se van a utilizar y que se espera que traigan mejores resultados son las siguientes:

Ejecución del algoritmo con 32 bits de palabra. Esta es una de las mejoras que más aportaría a la
reducción de tiempo. Se basa en utilizar toda la capacidad del microprocesador y ejecutar las
91 | P á g i n a
operaciones tomando 32 bits en vez de 8, por lo que idealmente reduciría, en teoría, a la cuarta
parte el número de operaciones realizadas debido que en un solo bloque de 32 bits se tomarían 4
de las operaciones (de 8 bits cada una) con las que actualmente trabaja el algoritmo.

Loop unrolling. El loop unrolling o loop unwinding es una técnica de programación muy usada que
se basa en “desenrollar” bucles para que no haya necesidad de realizar las operaciones que se
realizan al índice contador del bucle o que dependen de él al estar precalculadas. Un inconveniente
que tiene el loop unrolling es que al “desenrollar” los bucles se realiza mayor uso de memoria, por
esto, sólo se utilizará esta técnica para bucles cuyo “desenrollado” no conlleve un notable
incremento de memoria

Eliminación y/o simplificación de operaciones repetidas. Analizando minuciosamente las
especificaciones de AES de Daemen y Rijmen se han encontrado algunas operaciones que se
realizan varias veces. Eliminando estas operaciones se puede reducir el tiempo de una manera
notable sin que esto afecte la manera en que el algoritmo trabaja ni su integridad, se debe recordar
que los cambios se están contemplando para ser aplicados en una implementación para móviles,
no en un algoritmo nuevo en sí.

Eliminación de variables y operaciones asociadas. En los códigos de programación suelen existir
variables que son recursos del programador. Estas variables facilitan la programación pero hacen
que haya más operaciones. Por tanto, en algunos casos, si se eliminan se gana en tiempo de
cómputo global. Nuevamente, se debe tener mucho cuidado de no afectar la integridad del
algoritmo.
Estas son las técnicas que se utilizarán. A continuación se
describe como se implementaron en las
diferentes partes del programa y cuales resultados se obtuvieron.
4.3.3 Implementación de las mejoras
Tras analizar cómo y dónde poder minimizar al máximo el tiempo de proceso del programa, en los siguientes
apartados se procederá a implementar esas mejoras y analizar sus resultados. Para ello empezaremos con
una modificación estructural que nos permitirá utilizar toda la capacidad del microprocesador.
4.3.3.1 Utilización de toda la capacidad del microprocesador
Tras este apartado se irán comentando las múltiples mejoras que se han conseguido. No obstante el
principal recurso para llegar hasta ellas ha sido el uso de toda la capacidad del microprocesador, por lo que
en este apartado se explica cómo se ha logrado usar esta capacidad.
92 | P á g i n a
Analizando el algoritmo AES notamos que, como hemos explicado anteriormente, trabaja con operaciones a
nivel de 8 bits, ya que cada uno de los elementos de la matriz de estado ocupa 8 bits. Sin embargo nosotros
contamos con un microprocesador capaz de trabajar con palabras de 32 bits. Por tanto cada vez que el
microprocesador realiza una operación con un único byte está desaprovechando gran parte de su capacidad.
Nuestro objetivo principal será por tanto conseguir que el microprocesador trabaje con 32 bits en lugar de
hacerlo con un único byte. Para hacer esto habrá que modificar ampliamente la estructura de nuestro
programa.
En su primera versión, el cifrado se basaba en colocar en una matriz de cuatro por cuatro bytes los
elementos de la matriz de estado y realizar una serie de operaciones sobre ella.
Lo primero a intentar es sustituir la matriz por un arreglo de 4 variables de 32 bits, que deberían almacenar
cada una de las filas de la matriz de estado. Sin embargo, analizando las diferentes posibilidades se eligió
usar una versión traspuesta de la matriz de estado, la cual quedo representada por un arreglo de cuatro
enteros que contendrán los valores de sus filas.
Por tanto si la distribución de los bytes de la matriz de estado anteriormente era esta:
Con las mejoras propuestas, la matriz transpuesta se verá de la siguiente manera:
Y por tanto se almacenara en este orden
A continuación se procederá a describir todas las modificaciones que se han efectuado en el código y sus
aportaciones en tiempo por orden de ejecución. La comparación entre antes de las mejoras y el después
están en el anexo.
93 | P á g i n a
4.3.3.2 Mejoras en la extracción e inserción de los datos
En este apartado se denota la introducción de dos mejoras en la extracción de los datos y la inserción.
Al modificar la matriz de estado se afecta el establecimiento de ella (función setEstado()) y a la
extracción de los datos (getEstado()). Por ello se deben modificar estas funciones. Una vez cambiada
la función getEstado() se han aprovechado las características del mismo para desenrollar un bucle y así
reducir los cálculos. En programación los bucles son un recurso que se utiliza constantemente pero para
mantener una eficiencia en el tiempo de ejecución debemos mantenerlos al mínimo.
En la siguiente tabla se puede ver la eficiencia conseguida después de estos cambios. Esta reducción
representa el tiempo que el microprocesador deja de usar para realizar las operaciones en la versión
mejorada y el porcentaje que este representa respecto del tiempo que tardaba antes de las mejoras.
Tabla 4-4 Mejoras de rendimiento en la extracción de datos
Tiempo de inserción de datos
Tiempo de extracción de datos
Original
4.759 µs
8.054 µs
Mejora de 32 bits
2.148 µs
7.145 µs
Loop Unrolling
N/A
5.344 µs
Reducción total en el tiempo
2.611 µs (54.86%)
2.71 µs (33.65%)
Observamos que tras estas dos mejoras tanto la extracción como la inserción de datos mejoran
notablemente aunque no se consideraba estrictamente necesario conseguir su reducción debido a su poco
peso en la estructura del algoritmo.
94 | P á g i n a
4.3.3.3 Función KeyExpansion (keyExpansion())
El principal problema encontrado en la función KeyExpansion fue que al utilizar el formato de 32 bits
es que las claves también deben que estar traspuestas (como en la matriz de estado).
Por lo tanto se pensaron dos soluciones:
1. Adaptar a 32 bits el algoritmo de generación de claves y posteriormente trasponer los resultados.
2. Modificar el algoritmo de generación de claves para obtener directamente las claves traspuestas
La opción uno es la más sencilla, ya que trasponer una matriz es un cálculo muy básico, sin embargo la
premisa es la eficiencia, por lo tanto se deben probar ambas soluciones para elegir la más efectiva.
Se procedió a diseñar el algoritmo de generación de claves traspuestas. Este proceso no es sencillo y
tampoco es demasiado práctico puesto que la generación de claves utiliza palabras anteriores para la
obtención de una nueva palabra y al estar traspuestas debe tomar parte de varias palabras distintas en cada
paso. En la figura, las palabras sin trasponer aparecen en vertical y las palabras traspuestas serían el
contenido de los rectángulos horizontales en rojo.
Figura 4-5 Generación de claves transpuestas
Tras desarrollar estas dos soluciones obtenemos los resultados que aparecen en la tabla
95 | P á g i n a
Tabla 4-5 Mejoras en la función keyexpansion
Tamaño de la clave
128 bits
192 bits
256 bits
Tiempo original
157.250 µs
176.180 µs
211.620 µs
67.016 µs (29.950 µs)
76.780µs (35.320 µs)
96.420 µs (40.693 µs)
41.067 µs
63.375 µs
57.520 µs
116.183 µs (73.88%)
112.782 µs (64.03%)
154.215 µs (72.82%)
Opción
1
(transposición)
Opción 2
Reducción
total
de
tiempo
La opción 1 reduce enormemente el tiempo de proceso. No obstante, el tiempo que la función invierte en
trasponer los resultados es muy alto.
En la segunda opción se realiza la trasposición implícitamente. En este caso, el tiempo total es bastante
similar a la primera pero sin tener el tiempo alto der la trasposición.
Con lo anterior se nota como en el caso de 192 bits se obtienen resultados menos favorables que en los
casos de 128 y 256. Esto es debido a que se dificultan los cálculos porque cada 6 palabras hay que sumar la
constante rcon pero las subclaves son de 4 palabras, y estos números no son múltiplo el uno del otro, de
esta manera no es sencillo definir en qué punto hay que sumar la constante.
Por tanto, como no invierte tiempo en trasponer los resultados, la opción 2 resulta mucho más eficiente
consiguiendo llegar a invertir solamente la cuarta parte de tiempo que invertía antes de esta mejora.
96 | P á g i n a
4.3.3.4 Función AddRoundKey (addRoundKey(r))
Esta función se encarga de mezclar la matriz de estado con la subclave de ronda, por lo que se apoya en la
mejora aplicada a la función KeyExpansion en el apartado anterior.
En esta función se han aplicado varias mejoras: La adaptación al funcionamiento en 32 bits y, loop unrolling
y eliminación de operaciones sencillas. Lo anterior se ha basado en sumar la subclave y la matriz de estado
en palabras de 4 elementos en lugar de hacerlo de elemento en elemento.
El resultado de estas mejoras queda reflejado en la tabla siguiente:
Tabla 4-6 Mejoras Addroundkey
Por ronda
128 bits
192 bits
256 bits
Tiempo original
8.317 µs
94.458 µs
112.00 µs
129.12 µs
Tiempo mejora de 32 bits
2.090 µs
22.990 µs
29.536 µs
33.117 µs
Loop unrolling
1.183 µs
15.095 µs
17.865 µs
20.625 µs
Reducción de tiempo
7.134µs
79.363µs
94.135µs
108.495
(85.93%)
(84.01%)
(83.00%)
(84.01%)
Conviene notar que la función AddRoundKey es llamada un número de veces igual al número de rondas
más uno, por lo que la reducción real será aproximadamente dicho número (11, 13 o 15) multiplicado por la
reducción por ronda.
La mejora que más funciona en Addroundkey fué ejecutar las operaciones a nivel de 32 bits. No
obstante, sólo con las mejoras de loop unrolling y de operaciones sencillas se llega a aplicar una reducción
de tiempo de casi el 50% en el caso de clave de 256 bits, lo cual es un porcentaje bastante alto. Para concluir
se puede ver que la versión original tardaba muy poco tiempo por lo que era más difícil conseguir mejoras
notables. Aún así se ha llegado a una reducción de tiempo del 85.93%.
4.3.3.5 Función SubBytes (subBytes())
La función SubBytes se encarga de introducir lo que se llamaría comúnmente “confusión” a todo el
proceso de cifrado/descifrado del algoritmo pues realiza la sustitución de los bytes de la matriz de estado
con los correspondientes usados en una tabla S-Box (esta puede verse en los anexos).
La mejor manera de aplicar una mejora de funcionamiento sería creando, tomando como base la tabla S-
97 | P á g i n a
Box actual , una de 32 bits para realizar 4 consultas por ronda. Está debería tener 2
ocuparía 32 x 2
32
32
diferentes entradas y
bits , el siguiente calculo ilustra lo anterior:
32
11
32x2 = 1.374389535 x 10 bits
11
1.374389535 x 10 bits / 8.589.934.592 bits/GB = 16 GigaBytes.
El procesador ARM con el que estamos trabajando no cuenta con una memoria de ese tamaño, aunque hay
maneras de usar otro tipo de memorias, al estar enfocado para un dispositivo móvil no sería conveniente
forzar de esa manera la utilización del algoritmo. Sobre todo porque lo anterior supondría únicamente una
reducción de 6- 7µs por ronda.
Como solución se adaptó la función a 32 bits utilizando la tabla S-Box sin cambiar el número de entradas,
sino más bien usando números enteros al convertir los valores a 32 bits añadiendo ceros a la izquierda en
vez de los bytes almacenados hasta ahora. Esto agiliza la utilización de los valores.
Con lo anterior, se mantiene el número de consultas a la tabla en 16 pero se reduce el número de
modificaciones de la matriz de estado a 4 en lugar de las usuales 16. También se ha aplicado loop unrolling y
la mejora de reducción de algunas operaciones sencillas.
Tabla 4-7 Mejoras subBytes().
Por ronda
128 bits
192 bits
256 bits
Original
7.350 µs
73.350 µs
88.020 µs
102.680 µs
Mejora 32 bits
4.450 µs
43.333 µs
52.000 µs
60.667 µs
Loop unrolling
3.487 µs
34.835 µs
41.800 µs
48.767 µs
3.863 µs
38.515 µs
46.22 µs
53.913 µs
(52.4%)
(52.5%)
(52.5%)
(52.4%)
Reduccion
de
tiempo
Como podemos ver se ha llegado a reducir el tiempo de proceso en un 52.5% sin necesitar el uso de una
exagerada memoria.
4.3.1.1 Función ShiftRows (shiftRows())
La función ShiftRows
se encargaba de rotar las filas de la matriz de estado un número de bytes en
función del número de fila, estos números eran todos distintos para añadir difusión. Con la trasposición de
la matriz de estado habrá que modificarla para que roten las columnas en vez de las filas como estaba en un
inicio.
98 | P á g i n a
Al rotar las columnas,
cada una de ellas está almacenada en una variable de 32 bits y
el ARM
microprocesador cuenta con una operación que se encarga de rotar los bits de una variable.
En otras palabras, debido a la adaptación al funcionamiento en 32 bits se deberá sustituir a 4 rotaciones de
enteros en vez de los 16 movimientos que se tenían en un inicio. Se ha eliminado una variable y funciones
simples que se tenían con ella.
Tabla 4-8 Mejoras en ShiftRows
Por ronda
128 bits
192 bits
256 bits
Original
1.33 µs
13.33 µs
16.051 µs
18.667 µs
Mejora 32 bits
1.117 µs
11.556 µs
14.015 µs
16.412µs
Loop unrolling
0.883 µs
8.950 µs
10.715 µs
12.365 µs
0.450 µs
4.38 µs
5.336 µs
6.302 µs
(33.76%)
(33.74%)
(33.74%)
(33.71%)
Reduccion
tiempo
de
Se puede apreciar como en esta mejora se consiguió, en promedio, un tiempo 33.75% más eficaz. Cabe
mencionar que a pesar de que este valor es, hasta ahora, el menor conseguido con respecto a las secciones
anteriores, pero también se tiene en cuenta que la operación era de una magnitud inferior, por tanto su
mejora es más difícil y menos importante en jerarquía (aproximadamente un 5% en el tiempo total de
ejecución del algoritmo).
Por otro lado, el microprocesador tarda más en efectuar una operación de rotación de bits en comparación
de una asignación de variable, y una de las mejoras de esta función se basa en sustituir 16 operaciones de
sustitución por cuatro de rotación.
4.3.3.6 Función MixColumns (mixColumns())
La función MixColumns es un reto por si misma debido a que es una de las funciones con mas pasos, por
tanto se ha hecho un análisis y rediseño cuidadoso para lograr adaptarla al funcionamiento de 32 bits.
El resultado de la función puede observarse mejor en las siguientes operaciones:
Y0 =02 *X0 ⊕ 03*X1 ⊕ X2
Y1= X0
⊕ X3
⊕ 02 *X1 ⊕ 03*X2 ⊕ X3
99 | P á g i n a
Y2=X0
⊕ X1
Y3=03*X0 ⊕ X1
En lo anterior
xi
⊕ 02*X2 ⊕ 03*X3
⊕ X2
⊕ 02*X3
delimitan las columnas de la matriz de estado traspuesta antes de la función
8
MixColumns e yi después de ella y correspondiéndose el operador * al producto en (GF 2 ) 53 - llamado
campo de Galois- realizado en paralelo byte a byte.
Lo más sencillo para calcular lo anterior es usar acumuladores, es decir variables que funjan con esta función
y usar xi para almacenar el producto 02 * Xi. Esto puede ilustrarse en la siguiente tabla:
Tabla 4-9 Pasos de mixcolumns
La principal mejora de este apartado ha sido que la función MixColumns ahora funciona a 32 bits
mediante estos tres pasos. Ahora para maximizar los resultados se deberá modificar de igual manera
xtime(x).
8
El xtime(x) tiene como función realizar el producto de x por 2 en (GF 2 ). Se ha adaptado para que
funcione de igual manera que la función anterior con palabras de 32 bits y de esta manera es posible realizar
la operación una vez en vez de 4 como estaba anteriormente ya que no es necesario separar los bytes de
cada columna.
Para finalizar con este apartado es conveniente mencionar que se eliminaron 4 bucles, una variable y
operaciones que pudieron reducirse usando la técnica de loop unrolling.
53
En álgebra abstracta, un cuerpo finito, campo finito o campo de Galois (llamado así por Évariste Galois) es
un cuerpo definido sobre un conjunto finito de elementos.
100 | P á g i n a
Tabla 4-10 Mejoras en mixcolumns
Tiempo por ronda
Clave 128 bits
Clave de 192 bits
Clave de 256 bits
Tiempo original
9.950 µs
89.410 µs
109.570 µs
129.420 µs
Tiempo 32 bits
11.300 µs
101.250 µs
123.924 µs
146.500 µs
Tiempo mejora
7.140 µs
65.987 µs
80.751 µs
95.250 µs
4.254 µs
39.870 µs
48.500 µs
57.610 µs
5.696 µs
49.54 µs
61.07 µs
71.81 µs
(55.34%)
(55.33%)
(55.32%)
(55.34%)
xtime(x)
Tiempo loop
unrolling
Reducción de
tiempo
Con las mejoras se logro una reducción del 55.33% con respecto al tiempo original de la función
MixColumns. Además la mejora de xtime(x) ha sido clave para permitir que la mejora de 32 bits
aporte sus beneficios y la técnica de loop unrolling ha hecho posible aprovechar todo el potencial de la
ejecución en 32 bits.
Como medida de comparación, se puede ver que el tiempo ahorrado es prácticamente lo equivalente al
tiempo que conjuntamente se usa en las operaciones AddRoundKey, SubBytes y ShiftRows.
4.3.3.7 Función InvShiftRows (invShiftRows())
InvShiftRows se encargaba de rotar las columnas de la matriz de estado transpuesta, por tanto su
función inversa debe rotarlas en un sentido opuesto. Por tanto las mejoras aplicadas a la función
InvShiftRows son similares
a las de la función ShiftRows basándonos en la adaptación al
funcionamiento en 32 bits, en el loop unrolling, la eliminación de variables y el prescindir operaciones
sencillas.
101 | P á g i n a
Tabla 4-11 Mejoras en invshiftrows
Tiempo por ronda
Clave de 128 bits
Clave de 192 bits
Clave de 256 bits
Tiempo original
1.33 µs
13.33 µs
16.12 µs
18.657 µs
Mejora 32 bits
1.117 µs
11.67 µs
13.99 µs
16.450 µs
Loop unrolling
0.88 µs
8.84 µs
10.00 µs
12.350 µs
0.45 µs
4.49 µs
6.12 µs
6.307 µs
(33.75%)
(33.74%)
(33.74%)
(33.74%)
Reducción
de
tiempo
Después de las mejoras se logra un ahorro de tiempo de un 33.75%, esta reducción puede parecer pequeña
pero esta función tiene muy poco peso en el tiempo de proceso de todo el descifrado.
4.3.3.8 Función InvSubBytes (invSubBytes())
En este apartado comenzaremos con decir que la función SubBytes y la función InvSubBytes solo se
diferenciaban por el lugar donde los bytes eran sustituidos: una tabla inversa S-Box en lugar de una tabla
normal S-box.
Basados en esa premisa en la función
InvSubBytes
se pueden aplicar las mejoras de manera
parecida a como se hizo en la función SubBytes convirtiendo la tabla iS-Box en una tabla de valores
enteros (32 bits) añadiendo ceros por la izquierda a sus valores.
Tabla 4-12 Mejoras en inv subytes
Tiempo por ronda
Clave de 128 bits
Clave de 192 bits
Clave de 256 bits
Tiempo original
7.32 µs
73.32 µs
88.100 µs
102.670 µs
Mejora 32 bits
4.34 µs
43.33 µs
52.00 µs
60.670 µs
Loop Unrolling
3.350 µs
34.250 µs
41.605 µs
48.650 µs
3.97 µs
39.07 µs
46.495 µs
54.02 µs
(52.6%)
(52.5%)
(52.4%)
(52.4%)
Reducción
de
tiempo
El tiempo se redujo en un porcentaje de 52.5% sin aumentar en gigabytes la memoria utilizada. El tiempo
102 | P á g i n a
de ejecución podría verse más reducido si se utilizara una tabla de 32 bits de entrada, aunque esta tendría
un tamaño de 16 gigabytes, demasiado grande para esta aplicación, no hay hasta el momento un dispositivo
móvil que tenga semejante memoria en la que podría aplicarse esa mejora.
4.3.3.9 Función InvMixColumns (invMixColumns())
A continuación se describirán las mejoras aplicadas a la función InvMixColumns, los resultados y la
explicación de los mismos. Las primeras mejoras son muy similares a las que se aplicaron en la función
MixColumns ya que se basan en la ejecución en palabras de 32 bits, la mejora del macro xtime(x) y
en técnicas de loop unrolling.
Una vez aplicadas las mejoras, la función seguía siendo demasiado pesada pese a que se obtuvo la reducción
de tiempo buscada, esto es debido a que la función InvMixColumns es la función con los cálculos de
más alto nivel en comparación con el resto del algoritmo, por tanto se procedió a darle un segundo análisis
para poder llegar a una optimización adecuada en la misma.
Primeramente, para realizar la función MixColumns se aplicaban a la matriz de estado estas operaciones:
Siendo xi las columnas de la matriz de estado traspuesta antes de la transformación MixColumns e yi
8
después de la misma y correspondiéndose el operador (*) al producto en (GF 2 ) realizado en paralelo byte
a byte.
El producto en el campo de Galois es una operación que con coeficientes altos adquiere una relativa
complicación. Afortunadamente, en ese caso los coeficientes de este producto (Marcados en rojo oscuro)
eran solamente 1, 2 o 3, lo cual eludía complicaciones.
Si volvemos a la función InvMixColumns, podemos observar como en este caso las operaciones a aplicar
son estas:
Mientras que para el cifrado en la mitad de los casos los coeficientes no exigen realizar operaciones en (GF
103 | P á g i n a
8
2 ) y cuando eran necesarias eran con coeficientes bajos (2 o 3), para el descifrado son necesarias en todos
los casos y con coeficientes más altos (9, 11, 13 o 14).
8
Antes de la mejora las operaciones en (GF 2 ) cuando había coeficientes elevados se realizaban con la parte
llamada multiply(x, y) que añadía mucho tiempo de proceso.
La primera modificación fue hacer que esta función funcionara con 32 bits en vez de ocho, como se hizo con
su contraparte xtime(x), esto arrojo buenos resultados, sin embargo invMixColumns seguía siendo
demasiado pesada. Por lo tanto se pensó en tratar de eliminar multiply(x, y) y reducir el número de
operaciones que utilizan xtime(x).
Para lo anterior se simplificaron las operaciones a aplicar separando los coeficientes en potencias de dos
para poder hacer uso de xtime(x) en lugar de multiply(x, y). De esta manera hemos obtenido
estas ecuaciones:
Por ellas InvMixColumns se pueden descomponer en una suma de los coeficientes de MixColumns y
de unos coeficientes más sencillos:
De esta manera se pueden aprovechar las operaciones usadas para calcular la matriz [mixcolumns]
sabiendo que la matriz [A] equivale a:
Lo anterior demuestra que se pueden realizar las operaciones en una sucesión de pasos que se resumen en
las siguientes tablas:
104 | P á g i n a
Los pasos anteriores iguales a los de MixColumns, nos dan la matriz [mixcolumns]. Los siguientes pasos
calcularán 4 * (x0+x2), 4*(x1+x3) y 8*(x0+x1+x2+x3) en el cuarto paso y lo sumarán en el quinto.
Resumiendo lo anterior podemos decir que las mejoras aplicadas han sido la adaptación de
InvMixColumns para que funcione con 32 bits, la mejora de xtime(x) para que sustituya a
multiply(x)
y la eliminación de bucles prescindibles.
Tabla 4-13 Mejoras invMixColumns().
Por Ronda
Clave 128 bits
Clave 192 bits
Clave 256 bits
Tiempo original
138.200 µs
1.250 ms
1.500 ms
1.793 ms
32 bits
199.450 µs
1.790 ms
2.190 ms
2.594 ms
y
54.183 µs
487.90 µs
595.32 µs
703.550 µs
de
11.090 µs
99.180 µs
121.20 µs
143.26 µs
7.67 µs
68.27 µs
83.46 µs
98.56 µs
130.53 µs
1.173 ms
1.430 ms
1.69 ms
(94.46%)
(94.48%)
(94.48%)
(94.47%)
Xtime(x)
multiply(x,y)
Eliminación
multiply (x,y)
Loop unrolling
Reducción
de
tiempo
105 | P á g i n a
Los resultados son prácticamente óptimos ya que el tiempo inicial era bastante elevado, esto se nota en que
el tiempo se transforma de microsegundos a milisegundos (En comparación el resto de operaciones no
llegaban a tardar más de 200 microsegundos). Se logro una reducción total del 94.47% .
Cabe notar que luego de mejorarla para funcionar con 32 bits y la mejora de xtime() resulta de gran
importancia, aunque lo que más contribuyo a la mejora fue la eliminación multiply(x,y) y los cálculos
redundantes, llegando a reducir a la quinta parte el tiempo de proceso.
4.3.4 Rendimiento tras la aplicación de todas las mejoras
En este apartado se analizarán las consecuencias de las mejoras descritas anteriormente
en el tiempo
total de cifrado o descifrado de un bloque desde la inserción a la extracción de los datos. De esta forma se
obtuvieron los siguientes resultados para el análisis con un bloque de cifrado:
Tabla 4-14 Tiempo total cifrando un bloque
Tiempo
Cifrado 128
Cifrado 192
Cifrado 256
Descifrado
Descifrado
Descifrado
bits
bits
bits
128 bits
192 bits
256 bits
460.350 µs
531.133 µs
624.650 µs
1.612 ms
1.988 ms
2.288 ms
165.250 µs
207.940 µs
222.44 µs
192.249 µs
240.934 µs
261.434 µs
295.10 µs
326.190 µs
402.056 µs
1.419 ms
1.759 ms
2.027 ms
(64.10%)
(61.05%)
(64.37%)
(88.02%)
(87.90%)
(88.50%)
original
Tiempo
mejorado
Reducción
de tiempo
106 | P á g i n a
Figura 4-6 : Tiempo total de cifrado de un bloque
Figura 4-7: Tiempo total de descifrado de un bloque
Lo anterior denota claramente que la reducción varía en función del tamaño que se esté usando en la clave,
está relacionado con la función keyExpansion la cual se ha reducido en mayor o menor medida por
tamaño de la clave, cuando solo ciframos un solo bloque la función adquiere mayor peso, pero al ejecutarse
en mas bloques su peso se verá reducido.
La figura 4.5 denota el tiempo utilizado en cada una de las funciones, cada color representa una de las
107 | P á g i n a
funciones que conforman el algoritmo. Se utilizó una grafica apilada por ser la mejor manera de denotar los
tiempos totales y su correspondiente mejora.
Tiempo en microsegundos (µs)
Figura 4-8 Rendimiento de las mejoras en un bloque
La primera columna corresponde al tiempo antes de las mejoras, mientras que la segunda al tiempo
conseguido después de ellas. Se ha logrado reducir el tiempo de cifrado en un 64-65% dejando el tiempo en
unos 230µs aproximadamente.
Las funciones con más peso en el algoritmo son
KeyExpansion, AddRoundKey, SubBytes y
MixColumns, por ello, usando el análisis explicado en otros apartados, se centraron las mejoras más
fuertes.
Tomando como premisa que la clave usualmente es del mismo tamaño en todo el proceso y es la misma, al
modificar la función KeyExpansion se ejecutará una sola vez, por lo que estos resultados variarían
cuando se tratara de más de un bloque. Para ilustrar si la mejora ha sido efectiva en más bloques de cifrado
se realizaron mediciones con 10 de ellos en los diferentes tamaños de clave.
108 | P á g i n a
Tiempo en microsegundos (µs)
Figura 4-9 Rendimiento total de las mejoras con 10 bloques
Como la grafica indica, la función KeyExpansion pierde peso , mismo que ocupan las funciones
AddRoundKey, SubBytes y MixColumns, y estas han sido optimizadas en porcentaje de 84%, 52% y
55% respectivamente
Para analizar la eficiencia durante el proceso de descifrado observaremos la figura siguiente:
109 | P á g i n a
Tiempo en microsegundos (µs)
Figura 4-10 eficiencia durante el proceso de descifrado
Al descifrar, la gran mayoría del peso se obtiene de la función InvMixColumns; cabe mencionar que esta
fue la función con más dificultad a la hora de buscar una optimización, afortunadamente se nota el
resultado al finalizar las pruebas. Antes de las mejoras era un tiempo excesivo que podía imposibilitar
realizar aplicaciones rápidas de descifrado.
En la gráfica la reducción de InvMixColumns se visualiza tan alta que el resto de reducciones pasan
inadvertidas aunque se logro una considerable reducción de las mismas.
La reducción total tiene efecto con claves de 128, 192 o 256 bits, a mayor número de bloques a cifrar la
reducción será mayor, puesto que la función KeyExpansion será ejecutada una sola vez y su mejora (75%)
pesará menos que la de InvMixColumns (95%).
Al haber reducido el número de variables y de operaciones, se ha minimizado la cantidad de memoria
utilizada por el código y se ha reducido de 18.852 Bytes a 16.516 Bytes. Esto supone una reducción de más
del 12% en la cantidad de memoria utilizada.
Resumiendo, se ha reducido el tiempo de cómputo y la memoria utilizada.
110 | P á g i n a
Estas reducciones se han realizado aprovechando las capacidades del microprocesador y las cualidades del
algoritmo, reduciendo tiempos a lo largo de todo el algoritmo pero sobre todo en las funciones que tenían
más peso en la ejecución.
4.3.5 Mejoras al Consumo de energía
Como se mencionó anteriormente la memoria utilizada por el algoritmo en funcionamiento era de 18.852
Bytes originalmente, con las mejoras se redujo a 16.516 Bytes lo cual implica una mejora de un 12.39% con
respecto a la memoria original. Actualmente los teléfonos varían entre 1900 a 2400 mAh lo cual es,
aproximadamente, unas 8 -16 horas de vida utilizando varias funciones. Con estos datos es posible denotar
que al consumir menos memoria la batería es posible ampliar la memoria de la batería. Para entender
mejor como afecta la reducción al consumo de batería es necesario denotar primeramente la manera en
que estas operan.
En ellas es normal el uso del miliamperio hora (mAh), que es la milésima parte del Ah (amperio por hora) o
bien 3.6 C
54
. Esto indica la máxima carga eléctrica que es capaz de almacenar la batería. A más carga
eléctrica almacenada, más tiempo tardará en descargarse. El tiempo de descarga viene dado por la
expresión:
De la misma forma, se puede hallar el consumo eléctrico de un dispositivo:
Una vez denotado lo anterior se utilizó una aplicación para hacer las mediciones sobre el simulador: Battery
Monitor Widget, anteriormente descrita, que ofrece una gran cantidad de datos sobre la batería como el
tiempo estimado de duración, aplicaciones que realizan un mayor consumo, voltaje y miliamperios restantes
y mucha más información avanzada. En lo que respecta al Battery Monitor Widget podemos obtener
información sobre el porcentaje restante y los miliamperios consumidos.
La siguiente tabla muestra la mejora con respecto a la batería:
54
1 Amperio (1 Ah = 3600 Culombios)
111 | P á g i n a
Tabla 4-15 Uso de la batería antes y después de las mejoras en miliamperios
Memoria usada
Miliamperio
por
Porcentaje
hora usado
mejora
Original
18.852 Bytes
6.06
N/A
Después de
16.516 Bytes
4.848
12.39%
mejoras
Por ejemplo, si una batería posee una carga eléctrica de 2000 mAh (7200 C) con lo anterior se realizaría el
cálculo para saber cuánto tiempo se tardaría dedicando la batería únicamente al proceso de encriptado:
Tiempo de descarga= 2000 mAh (7200 C) / 6.06 mA (21.816 C/h)
La batería tardará 330 horas en descargarse. Con el cambio aplicado consume 4.848 mA (17.4528 C/h), la
batería tardará
412
horas en descargarse. Con esto se comprueba que efectivamente se logro que la
batería durara entre 15 y 20% más lo cual es una excelente mejora para un dispositivo móvil.
4.4 Propuestas a futuro de mejoras para la seguridad
El algoritmo AES es considerado uno de los algoritmos más resistentes a ataques. No obstante siempre
pueden encontrarse vulnerabilidades y como consecuencia pueden aparecer agujeros de seguridad.
Para el algoritmo AES solamente se ha encontrado uno que merezca la pena comentar por su importancia y
ha sido recientemente, a finales de Septiembre de 2011. Según tres expertos
55
realizaron un criptoanálisis
por grafos bipartitos (consistente en dividir el problema en varios problemas menores) y encontraron un
defecto que provoca que AES sea cuatro veces más débil. No obstante, incluso aprovechando este defecto
un ataque resulta computacionalmente inviable, ya que se necesitarían más de 2000 millones de años para
romper una clave de 128 bits mediante esta técnica y fuerza bruta.
Podemos ver cómo a pesar de la búsqueda de defectos que se está realizando, el algoritmo demuestra tener
una gran seguridad. No obstante, los ataques de canal lateral son capaces de eludir la estructura interna del
55
Bogdanov, Andrey, Khovratovich, Dmitry y Rechberger, Christian. Biclique Cryptanalysis of the Full AES. [Citado el: 22 de Enero de
2013.] http://eprint.iacr.org/2011/449.pdf
112 | P á g i n a
algoritmo y hacen viable el criptoanálisis. Por ello en este proyecto se propone mejorar el algoritmo frente a
este tipo de ataques añadiendo máscaras aleatorias a la matriz de estado.
4.4.1 Obtención de números aleatorios
La obtención de máscaras aleatorias exige que nuestro microprocesador cree números aleatorios que se
puedan usar para calcular las máscaras. Existen varias maneras de obtener la aleatoriedad.
4.4.1.1 Módulo de creación de números aleatorios
Algunos microprocesadores como el ARM7 tienen un módulo de creación de números aleatorios (Random
Number Generator, RNG) basado en un par de anillos osciladores de reloj independientes que varían de un
dispositivo a otro dependiendo de la fabricación del componente y de la temperatura del dispositivo.
Según el manual de usuario de estos microprocesadores para utilizar este módulo solo bastaría con
configurarlo correctamente en el inicio del programa mediante el registro POWERDOWN y leer el contenido
del registro de 32 bits RANDOM_NUMBER cada vez que quisiéramos obtener un número aleatorio.
Esta sería manera más oportuna de obtener números aleatorios, no obstante, como el módulo de
generación de números aleatorios no está presente en todos los microprocesadores, se decidió que una
solución sería usar un microprocesadores más genérico e implementar la obtención de números aleatorios
en él ya que es una solución mucho más amplia y se podría aplicar en múltiples plataformas.
4.4.1.2 Funciones srand() y rand()
Existe una librería en C llamada stdlib.h que incluye los métodos rand() y srand() que se encargan de generar
números aleatorios. Su funcionamiento es el siguiente:
int rand(void): La función rand devuelve un número entero de una secuencia de números pseudoaleatorios con un periodo de 32 bits como mínimo.
void srand(unsigned int value): Usa el argumento como una semilla para crear una secuencia
nueva de números pseudo-aleatorios que podrán ser retornados por llamadas posteriores a rand. Si
srand() es entonces llamada con el mismo valor semilla, la secuencia de números pseudo-aleatorios será
repetida. Si rand es llamada antes de que se hayan hecho cualquier llamada a srand(), la misma
secuencia será generada.
Por tanto si obtenemos una semilla aleatoria y la cargamos en srand() obtendremos números de 32 bits
aleatorios en las sucesivas llamadas a rand().
El uso de estas funciones implica que nuestro programa utilice 408 bytes más de memoria y que cada
113 | P á g i n a
llamada a la función rand() suponga un incremento de 0.133 microsegundos en el tiempo de ejecución
del programa lo cual significan 0.333 microsegundos en una operación de cifrado o descifrado. Como estos
datos son perfectamente asumibles, se ha tomado ésta como la manera de obtener números aleatorios.
No obstante esta forma de obtenerlos parte de una semilla que tiene que ser prácticamente aleatoria.
4.4.2 Uso de máscaras aleatorias
Para proteger el algoritmo frente a ataques de canal lateral, la solución más oportuna consistiría en añadir
distintas máscaras aleatorias a la matriz de estado a lo largo del proceso de cifrado o descifrado. De esta
manera el consumo de potencia no guarda relación con el mensaje a cifrar o descifrar ni con la clave de
cifrado.
No obstante, la manera de aplicar estas máscaras no debe ser tomada a la ligera, si no que ha de ser
correctamente estudiada para no comprometer lo más mínimo la seguridad del proceso. Tras estudiar
distintas formas de añadir máscaras, debido a su sencillez y efectividad, se considera que la mejor referencia
es la propuesta realizada por Stefan Mangard, Elisabeth Oswald y Thomas Popp en su libro Power Analysis
Attacks: Revealing the Secrets of Smart Cards
56
ya que se adaptó al funcionamiento en palabras de 32 bits
en lugar de 8.
56
Mangard, Stefan, Oswald, Elisabeth y Popp, Thomas. Power Analysis Attacks: Revealing the Secrets of Smart Cards (Advances in
Information Security). s.l. : Springer, 2007. págs. 228-231. ISBN-10: 0387308571.
114 | P á g i n a
115 | P á g i n a
Conclusiones
Uno de los propósitos de este trabajo era determinar cuál era el mejor algoritmo criptográfico tomando
como base el rendimiento y seguridad que este poseía para ser aplicado en un dispositivo móvil. Luego del
análisis de velocidad y seguridad se determino que el algoritmo AES era el más apropiado, además de ser un
estándar aprobado internacionalmente.
Después de hacer un extenso análisis de su proceso se propusieron mejoras en el mismo para lograr un
balance entre rendimiento y consumo energético sin sacrificar la seguridad del mismo, es decir, no se
basaron las mejoras en el proceso de encriptación del algoritmo si no en como lo hacía, con el fin de
obtener una adecuada utilidad para el usuario de cómputo móvil.
El primer objetivo fue implantar el algoritmo AES siguiendo fielmente las especificaciones de Daemen y
Rijmen. Gracias al software de Kiel Visions se logró emular el algoritmo AES en el microprocesador,
consiguiendo que funcionara tanto para cifrar como para descifrar, con cualquier tamaño de clave (128, 192
y 256 bits).
Una vez probado el correcto funcionamiento del algoritmo se trató de mejorar sus tiempos de
funcionamiento. Para ello se realizó un análisis de tiempos para ver cuáles eran los puntos que aportaban
más retardo al algoritmo y un análisis del funcionamiento de las funciones del algoritmo para ver cómo
podrían ser simplificadas, encontrando varias funciones de gran impacto que al ser modificadas mejoraron
de manera significativamente el rendimiento del algoritmo. Lo anterior se logró al pasar de 8 a 32 bits y el
uso de otras técnicas como el loop unrolling o la simplificación de operaciones básicas.
La ejecución de operaciones con palabras de 32 bits en lugar de 8 bits es una adaptación del algoritmo a una
gran cantidad de microprocesadores y con ella teóricamente basta con ejecutar una operación donde antes
se necesitaban cuatro.
Gracias a esto se obtienen unos resultados excelentes, llegando a reducirse el tiempo del cifrado en más de
un 60% y el de descifrado en un 90% consiguiendo además una reducción del 12% en la cantidad de
memoria utilizada. Con base a la memoria que se usaba y su mejora, se denoto que la batería podía
alcanzar una vida entre 15 y 20% más larga en comparación con el tiempo original que el algoritmo
utilizaba. Lo anterior le da al usuario de cómputo móvil una ventaja al poder encriptar su información sin
temor a que este proceso gaste demasiado rápido la vida de una batería promedio (equivalente a 2000
mAh).
Estas mejoras han sido claves para una ejecución eficiente del proceso de descifrado ya que antes de ellas
era demasiado pesado por culpa de la función InvMixColumns.
116 | P á g i n a
Por último, tras haber mejorado el tiempo de ejecución se proponen ideas de mejoras a futuro para el
canal lateral (para evitar ataques de fuerza bruta) y así poder mejorar la seguridad. Cabe mencionar que en
todo el proceso de mejora no se toco la lógica de la seguridad del algoritmo por tanto es igualmente seguro
después de ellas.
Si se tuviera que llevar estas mejoras a producción para un costo real, la parte más interesante seria la
adecuación del algoritmo en distintos lenguajes de programación y la adaptación de las mejoras para ellas.
De todas las mejoras aplicadas las funciones MixColumns() e InvMixColumns() son las que tenían
más peso y más complejidad de aplicación , pero una vez logradas traerían la ventaja de que su adaptación
permitiría que el usuario final ejecutara la aplicación en un teléfono móvil con una batería 20% más
pequeña que los modelos actuales , es decir , conseguiría la misma velocidad y duración de batería con un
teléfono de 1600 mAh comparado con el algoritmo original que obtenía este consumo con una batería de
2000 mAh (diferencia de 400 mAh aproximadamente) .
En términos de costo y basándonos en la tabla comparativa de modelos de smartphone para el mercado
Mexicano actual se tendría la siguiente tabla de modelos y costos en base a la batería:
Modelo
Batería
Costo (precios al 2013 en pesos
mexicanos)
Nexus 4
2100 mAh
$ 7,000
Nokia Lumia
2000 mAh
$ 6,600
LG Optimus G
2100 mAh
$ 5,300
Blackberry Z10
1800 mAh
$ 6,500
HTC One
2300 mAh
$ 10,500
Sony Xperia Z
2330 mAh
$ 8,600
Iphone 5
1440 mAh
$ 7,600
Samsung Galaxy S4
2600 mAh
$ 9,000
Samsung Galaxy Note 2
3100 mAh
$ 9,200
Motorola Razr Maxx
3300 mAh
$ 7,500
117 | P á g i n a
Así se lograría que los usuarios que desearan mantener seguros sus dispositivos pudieran hacer una
inversión entre 8 y 12% más baja (por ejemplo invirtiendo en un teléfono de 1800 mAh de batería en vez de
uno de 2000) en comparación con el costo de un teléfono con una batería mayor sin preocuparse por la
vida de la misma o la memoria utilizada en ellos. Aunque hay muchos otros factores en la elección de un
smartphone y es cierto que no solamente se dedicara la vida de la batería a mantener la encriptación, el
tener la certeza de que mantener los datos seguros sin invertir demasiado es un gran aliciente para la
elección de un usuario final de telefonía móvil.
118 | P á g i n a
119 | P á g i n a
Glosario
AES
Advanced Encryption Standard
ARM
Advanced RISC Machines
CPU
Central Processing Unit
DES
Data Encryption Standard
GSM
Groupe Spécial Mobile
GF
Galois Field
NIST
National Institute of Standards and Technology
CIFRADO
Técnica que mediante un algoritmo nos permite
pasar de un texto en claro a un criptograma.
CLAVE DE CIFRADO
Es un texto o palabra que se utiliza para cifrar un
mensaje, la utilización de claves dan lugar a
criptosistemas de clave secreta.
CLAVE PUBLICA
Es un criptosistema que utiliza dos tipos de clave:
una secreta o privada y una pública que está a
disposición de todo el mundo, de modo que se
cifra con una de ella y se descifra con la otra.
CODIFICACION
Técnica de cifrar información por medio de
códigos, no por medio de algoritmos.
CRIPTOGRAMA
Documento obtenido al cifrar un texto en claro. El
alfabeto del criptograma no tiene por
qué ser el mismo alfabeto que el del texto en claro
DESCIFRADO
Técnica contraria al cifrado que mediante un
algoritmo
inverso
nos
permite
pasar
de
uncriptograma a un texto en claro.
120 | P á g i n a
LOOP UNROLLING
El loop unrolling es una técnica de optimización
que consiste en hacer más extenso un bucle
simple reduciendo la sobrecarga por comparación
del bucle y permitiendo una mejor concurrencia.
RED FEISTEL
Tipo de estructura que recibe el nombre de su
diseñador y que adoptan algunos algoritmos de
cifrado modernos. Consiste en un conjunto de
operaciones que se aplica sobre un mismo bloque
de datos un determinado número de veces. En
cada una de estas veces, llamadas vueltas de la
red, sólo se trabaja con la mitad de los bits que
componen el bloque de datos y se finaliza la
vuelta permutando ambas mitades para que, en la
siguiente iteración, se opere con la mitad restante
del bloque
TEXTO CLARO O TEXTO PLANO
Documento original que se desea proteger
mediante el uso de técnicas criptográficas. Al
conjunto de todos estos textos se le denota como
M
121 | P á g i n a
122 | P á g i n a
Bibliografía
[1] Adleman, L.M.: A subexponential algorithm for the discrete logarithm problem with applications
cryptography. Proc. of the 20th Annual IEEE Symposium on Foundations of Computer Science. IEEE Press,
55-60, (1979).
[2] Agraval, M., Kayal, N., Saxena, N.: Primes is in P. Annals of Mathematics, Vol. 160(2), 781-793, (2004)
Web http://cse.iitk.ac.in/news/primality.html, (2003).
[3] Alexi, W., Chor, B., Goldreich, O., Schnorr, C.P.: RSA and Rabin functions:certeins parts are hard as the
whole. SIAM Journal on Computing, Vol. 17, 194-209, (1988).
[4] Álvarez, R.: Aplicaciones de las matrices por bloques a los criptosistemas decifrado en flujo. Tesis
Doctoral (2005).
[5] Álvarez, R., Tortosa, L., Vicent, J.F., Zamora, A.: A public key cryptosystem based on block upper
triangular matrices. 4ht WSEAS, Proceedings of ISCOCO 2005, 163-168. Tenerife (2005).
[6] Álvarez, R., Tortosa, L., Vicent, J.F., Zamora, A.: An internal security kernel. WSEAS, Proceedings of
Transaction on Business and economics. Venecia (2004).
[7] Álvarez, R., Ferrández, F., Vicent, J.F., Zamora, A.: Applying quick exponentiation for block upper
triangular matrices. Applied Mathematics and Computation, Vol. 183, 729-737 (2006).
[8] Anshel, I., Anshel, M., Goldfeld, D.: An algebraic method for public-key cryptography. Mathematical
Research Letters, Vol. 6, 287-291, (1999).
[9] Bach, E., Shallit, J.: Algorithmic number theory. MIT Press. Cambridge, MA,(1996).
[10] Beckman, B.: Arne Beurling and the Swedish crypto program during World War II, Providence (2002).
[11] Beckman, B.: Códigos secretos. Piramide, Madrid (1990).
[12] Bellare, M., Rogaway, P.: Entity Authentication and Key Distribution. Advances in Cryptology - CRYPTO
1993– Lecture Notes in Computer Science, Vol 773, (1994).
[13] Bellare, M., Desai, A., Pointcheval, D., Rogaway, P.: Relations Among Notions os Security for Public-key
Encryption Schemes. Advances in Cryptology –CRYPTO 1998– Lecture Notes in Computer Science, Vol. 1462,
26-46, (1998).
[14] Bennet, C., Brassard, G.: The dawn of a new era for quantum cryptography: the experimental prototype
is working. SICACT News, Vol. 20, 78, (1989).
123 | P á g i n a
[15] Ben-Or, M., Chor, B., Shamir, A.: On the cryptographic security of single RSA bits. Proceedings of the
15th ACM STOC, 421-430, (1983).
[16] Beth, T., González, S., González, M.I., Martínez, C., Steinwandt, R.: Cryptographic Shelter for the
Information Society: Modeling and Fighting Novel Attacks on Cryptographic Primitives. Techno-Legal Aspects
of Information Society and New Economy, (2003).
[17] Beth, T.: El estado de la Criptografía de Clave Pública a la vista de las posibilidades de la Computación
Cuántica. Actas de la VI Reunión Española sobre Criptología y Seguridad de la Información, VI RECSI, 39-50,
(2001).
[18] Beth, T., Frisch, M., Simmons, G.J.: Public-Key Cryptography: State of the Art and Future Directions.
Lecture Notes in Computer Science, Springer Verlag, (1992).
[19] Beth, T.: The State of Public-Key Cryptography - Not Only After the Invention of Quantum Computers.
Information Security Technical Report, (1999).
[20] Blackley, G.R., Borosh, I.: RSA public key cryptosystems do not always concel messages. Comput. Math.
Appl., Vol. 5, 169-178, (1979).
[21] Blum, M., Miscali, S.: How to generate cryptographically strong sequences of pseudo-random bits. SIAM
Journal on Computing, Vol. 13, 850-864, (1986).
[22] Boneh, D., Venkatesan, R.: Hardness of computing the most significant bits of secret keys in DiffieHellman and related scheme. Advances in Cryptology –CRYPTO 1996– Lecture Notes in Computer Science,
Vol. 921, 129-142, (2001).
[23] Bonilla Palencia E.: Implementación del algoritmo AES sobre arquitectura ARM, (Mayo 2012).
[24] Brillhart, J., Lehmer, D.H., Selfridge, J.L.: New primality criteria and factorizations of 2m+ 1. Math.
Comp., Vol. 29, 620-647, (1975).
[25] Buchmann, J.A., Williams, H. C.: A Key Exchange System Based on Imaginary Quadratic Fields. Journal of
Cryptology Vol. 1, (1988).
[26] Canfield, E.R., Erdos, P., Pomerance, C.: On a problem of Oppenheim concerning Factorisation
Numerorum. J. Number Theory, Vol. 17, 1-28, (1983).
[27] Chor, B., Goldreich, O.: RSA/Rabin least significant bit are1 2+poly(log n)
secure.
Advances
in
Cryptology –CRYPTO 1984– Lecture Notes in Computer Science, Vol. 196, 303-313, (1984).
[28] Churchouse, R.F.: A classical Cipher Machine: The ENIGMA, some Aspects,Its history and Solution.
Institute of Mathematics and its Applications, Vol. 27, (1991).
124 | P á g i n a
[29] Climent, J.J., Ferrandiz, F., Vicent, J.F., Zamora, A.: A non linear elliptic curve cryptosystem based on
matrices. Applied Mathematics and Computation, Vol. 74, 150-164 (2005).
[30] Climent, J.J., Gorla, E., Rosenthal, J.: Cryptanalysis of the CFVZ cryptosystem. Advances in Mathematics
of Communications (AMC) Vol. 1, 1-11 (2006).
[31] Cohen, H.: A course in computational algebraic number theory. GTM 138, Springer. Berlin (1995).
[32] Coppersmith, D., Odlyzko, A., and Schroeppel, R.: Discrete logarithms in GF (p). Algorithmica, 1-15,
(1986).
[33] Coppersmith, D.: Cryptography. IBM J. Res. Develop. Vol. 31, No. 2, (1987).
[34] J. Daemen, "Cipher and hash function design strategies based on linear and differential cryptanalysis,"
Doctoral Dissertation, Marzo 1995, K.U.Leuven.
[35] J. Daemen, L.R. Knudsen and V. Rijmen, "The block cipher Square," Fast Software Encryption, LNCS
1267,
E.
Biham,
Ed.,
Springer-Verlag,
1997,
pp.
149-165.
También
en
http://www.esat.kuleuven.ac.be/rijmen/square/fse.ps.gz.
[36] J. Daemen, L.R. Knudsen and V. Rijmen, " Linear frameworks for block ciphers,"to appear in Design,
Codes and Cryptography.
[37] J. Daemen and C. Clapp, “Fast hashing and stream Encryption with PANAMA,” Fast Software Encryption,
LNCS 1372, S. Vaudenay, Ed., Springer-Verlag, 1998, pp. 60-74.
[38] ISO/IEC 9797, "Information technology - security techniques - data integritymechanism using a
cryptographic check function employing a block cipher algorithm", International Organization for
Standardization, Geneva, 1994 (second edition)
[39] Deavours, C.A., Kruh, L.: Machine Cryptography and Modern cryptanalysis. Artech House Inc., (1985).
[40] Diffie, W., Hellman, M.: New directions In Cryptography. IEEE Trans. Information Theory, Vol. 22, 644654, (1976).
[41] Diffie, W.: The First Ten Years of Public Key Cryptography. Proceedings of the IEEE Vol. 76, No. 5, (1988).
[42] ElGamal, T.: A public key cryptosystem and a signature scheme based on discrete logarithms. IEEE Trans.
Information Theory, Vol. 31, 469-472, (1985).
[43] Ferrández, F.: Sistemas criptográficos de curva elíptica basados en matrices. Tesis Doctoral, 102-103,
(2004).
[44] Fischlin, R., Schnorr, C.P.: Stronger security proofs for RSA and Rabin bitsStronger security proofs for RSA
125 | P á g i n a
and Rabin bits. Journal of Cryptology, Vol. 13, 221-244, (2000).
[45] Goldwasser, S., Bellare, M.: Lecture Notes on Cryptography, (2001).
[46] Goldwasser, S., Miscali, S.: Probabilistic encryption. Journal of Computer and Systrem Science, Vol. 28,
270-299, (1984).
[47] González, M.I., Steinwandt, R.: Obstacles in Two Public-Key Cryptosystems Based on Group
Factorizations. Cryptology. Editors: K. Nemoga, O. Grosek, Tatra Mountains Math. Publications, 23-37,
(2002).
[48] González, M.I., Sparlinski, I.E.: On the security of Diffie-Hellman bits. Proc. Workshop on Cryptography
and Computational Number Theory Singapure 1999. Birkaüser, 256-268, (2001).
[49] González, M.I., Martínez, C., Steinwandt, R.: Un Marco Común para Varios Esquemas de Clave Pública
Basados en Grupos. Actas de la VII Reunión Española sobre Criptología y Seguridad de la Información, VII
RECSI, 353-364, (2002).
[50] González, M.I., Naslund, M., Sparlinski, I.E.: The hidden number problem inextension fields and its
applications. Proc. the 3rd Latin American Theoretical Informatics Conference, Cancun 2002. Lecture Notes
on Computer Science, 105-117, Berlin (2001).
[51] Gordon, D. M.: A Survey of Fast Exponentiation Methods. Journal of Algorithms, Vol. 27, 129-146,
(1998).
[52] Gorenstein, D., Lyons, R., Solomon, R.: The Classification of the Finite Simple Groups, Volume 40 of
Mathematical Surveys and Monogrpahs. AMS, Providence, (1998).
[53] Gruska, J.: Quantum Computing. MacGraw-Hill, (1999).
[54] Hahn, S.G., Lee, E., Park, J.H.: Complexity of the Generalized Conjugacy Problem. Discrete Applied
Mathematics, (2003).
[55] Hall, C., Goldberg, I., Schneider, B.: Reaction Attacks Against Several PublicKey Cryptosystems. Vijay
Varadharajan and Yi Mu, editors. Information and Communication Security, Second International
Conference, ICICS’99, Lecture Notes in Computer Science, pages 2-12. Springer, Vol. 1726, (1999).
[56] Hastad, J.: On using RSA with low exponent in a public key network. Advanced in Criptology-Proc. of
Crypto’85, LNCS, Vol. 218, 403-408, (1986).
[57] Hastad, J., Impagliazzo, R., Levin, L.A., Luby, M.: Pseudo random number generators from any one way
function. SIAM Journal on Computing, Vol. 28, 1364- 1396, (1999).
126 | P á g i n a
[58] Hastad, J.: Solving simultaneous modular equations of low degree. SIAM J. Comput., Vol. 17, 336-341,
(1988).
[59] Hastad, J., Naslund, M.: The securyty of individual RSA and discrete log bits.Journal of the AMS (2002).
[60] Hellman, M.E., Reyneri, J.M.: Fast computation of discrete logarithm in GF (p). Advances in Cryptology:
Proceedings of CRYPTO’82 Plenum Press, 3-13, (1983).
[61] Hoffman, K., Kunze, R.: Linear Algebra. Prentice-Hall, New Jersey (1971).
[62] Horng, G., Yang, C.S.: Key authentication scheme for cryptosystems based on discrete logarithms.
Computer Communications Vol. 19, 848-850, (1996).
[63] IEEE Std 1363.: IEEE Standard especifications for public key cryptography (2000).
[64] Kahn, D.: The Codebreakers, the Story of Secret Writing. Macmillan Publishing Co. Inc., (1967).
[65] Kitaev, A.Y., Shen, A.H., Vyalyi, M.N.: Classical and Quantum Computation. Graduate Studies in
Mathematics. AMS Press, Vol. 47, (2002).
[66] Ko, K.H., Lee, S.L., Cheon, J.H., Han, J.W., Kang, J., Park, C.: New PublicKey Cryptosystem using Braid
Groups. In Advances in Cryptology. Proceedings of CRYPTO 2000, Lecture Notes in Computer Science, pages
166-183, Santa Barbara, California, USA, (2000).
[67] Koblitz, N.: A Course in Number Theory and Cryptography, GTM 114, Springer Verlag, (1987).
[68] Koblitz, N.: Hyperelliptic Cryptosystems. Journal of Cryptology Vol. 1, (1989).
[69] Kraitchik, M.: Théorie des nombres. Gauthier-Villars. Vol. 1, 119-123, Paris (1922).
[70] Kurosawa, K., Takeuchi, M.: Public key cryptosystem using a reciprocal number with the same
intractability as factoring a large number. Cryptology, Vol. 1, 225-233, (1988).
[71] LaMacchia, B.A., Odlyzko, A.M.: Computation of discrete logarithm problem in prime fields. Designs,
Codes and Cryptography, Vol. 1, 46-62, (2001).
[72] Lee, C.C., Hwang, M.S., Li, L.H.: A new key authentication scheme based on discrete logarithms. Applied
Mathematics and Computation, 343-349, (2003).
[73] Lidl, R., Müller,W.B.: Permutation polynomials in RSA cryptosystems. Advances in Cryptology
Proceedings of Cryptology 83, 293-301, (1984).
[74] Lidl, R., Niederreiter, H.: Introduction to Finite Fields and Their Applications. Cambridge University
Press, (1994).
127 | P á g i n a
[75] Loxton, J.H., Khoo, D.S.P., Bird, G.J.: A cubic RSA code equivalent to factorization. Cryptology, Vol. 5,
139-150, (1992).
[76] Magliveras, S.S.: A cryptosystem from logarithmic signatures of finite groups. Proceedings of the 29’th
Midwest Symposium on Circuits and Systems, pages 972-975. Elsevier Publishing Company, (1986).
[77] McCurley, K.: The discret logarithm problem. Crytology and Computational Number Theory,
Proceedings of Symposia in Applied Mathematics, Vol. 42, 49-74, (1990).
[78] McEliece, R. J.: A Public Key Cryptosystem Based on Algebraic Coding Theory. DSN Progress Report 4244, Jet Propulsion Laboratory, (1978).
[79] McEliece, R. J.: Finite Fields for Computer Scientists and Engineers. Kluwer Academic Publishers, (1987).
[80] Menezes, A., Wu, Yi-Hong: A polinomial representation for logaritms in GF (q). Acta arithmetica, Vol. 47,
255-261, (1986).
[81] Menezes, A., Van Oorschot, P., Vanstone, S.: Handbook of Applied Cryptography. CRC Press, Florida
(2001).
[82] Menezes, A., Wu, Yi-Hong.: The Discrete Logarithm Problem in GL(n, q). Ars Combinatoria, Vol. 47, 2232, (1997).
[83] Miller, G.: Riemann’s hypothesis and test for primality. J. Comput. and Sistem Sci., Vol. 13, 300-317,
(1976).
[84] Miller, V. S.: Use of Elliptic Curves in Cryptography. Advances in Cryptology Crypto’85, Lecture Notes in
Computer Science, Vol. 218, (1985).
[85] Mollin, R.A..: RSA and public-key cryptography. Chapman and Hall /CRC Boca Raton. Florida (2003).
[86] Mosca, M., Ekert, A.: The Hidden Subgroup Problem and Eigenvalue Estimation on a Quantum
Computer. Proceedings of the 1st NASA International Conference on Quantum Computing and Quantum
Comunication, (1999).
[87] Mullen, G., White, D.: A polynomial representation for logarithms in GF(q). Acta Arithmetica, Vol. 47,
255-261, (1986).
[88] National Bureau of Standards. Data Encryption Standard, FIPS-Pub.46. National Bureau of Standards,
U.S. Department of Commerce. Washington D.C.,(1977).
[89] National Institute for Standards and Technology. Digital Signature Standard.Computer System
Laboratory, FIPS PUB 186, Gaithersburg, (1994).
128 | P á g i n a
[90] Niederreiter, H.: A short proof for explicit formulas for discrete logarithms infinite fields. Applicable
Algebra in Eng., Comm., and Computer, Vol. 1, 55-57, (1990).
[91] Odlyzko, A.M.: Discrete logarithm and smooth polynomils in finite fields. Theory, Applications and
Algorithms. G.L. Mullen and P. Shiue, eds., American Math. Society, Contemporary Math Series, 269-278,
(1994).
[92] Odoni, R. W. K., Varadharajan, V., Sanders, P. W.: Public Key Distribution in Matrix Rings. Electronic
Letters, Vol. 20, 386-387, (1984).
[93] Paeng, S.H., Kwon, D., Ha, K.C., Kim, J.H.: Improved public key cryptosystem using finite non-abelian
groups, IACR eprint (2001).
[94] Paeng, S.H., Ha, K.C., Kim, J.H., Chee, S., Park, C.: New Public Key Cryptosystem Using Finite Non Abelian
Groups. J. Kilian. Advances in cryptology - CRYPTO 2001, Lecture Notes in Computer Science, Springer, Vol.
2139, 470-485, (2001).
[95] Pocklington, H.C.: The determination of the prime or composite nature of large numbers by Fermat’s
theorem. Math. Porc. Cambridge Philos. Soc., Vol. 18, 29-30, (1914).
[96] Pohlig, S.C., Hellman, M.E.: An improved algorithm for computing logarithmsover GF (p)
and
its
cryptographic significance. IEEE Trans. Info. Theory, Vol. 24, 106-110, (1978).
[97] Pollard, J.M.: Monte Carlo methods for index computation (mod p). Math. Computation, Vol. 32, 918924, (1978).
[98] Popek, G., Kline, C.: Encryption and security computer networks. ACM Computing Survey, Vol. 11, 331356, (1979).
[99] Rabin, M.O.: Digitalized signartures and public key functions as intractable as factorization. MIT
Laboratory for Computer Science, Technical Report
MIT/LCS/TM-212, (1979).
[100] Rabin, M.O.: Probabilistic algorithms for testing primality. J. Number Theory,Vol. 12, 128-138, (1980).
[101] Reisel, H.: Mersenne numbers. MTAC, Vol. 12, 207-213, (1958).
[102] Riesel, H.: Prime numbers and computer methods for factorization. BirhäuserBoston (1994).
[103] Rivest, R., Shamir, A., Adleman, L.: A method for obtaining digital signaturesand public-key
cryptosystems. Communications of the ACM, Vol. 21, 120-126,
(1978).
129 | P á g i n a
[104] Rossen, K.: Elementary Number Theory International Edition. (2004).
[105] Rotman, J.J.: An Introduction to the Theory of Groups. Graduate Texts in Mathematics. Springer, Vol.
148, (1999).
[106] Salomaa, A.: Public Key Cryptology. Monographs on Theoretical Computer Science, Vol.23, Springer
Verlag, (1990).
[107] Scheidler, R., Buchmann, J.A., Williams, H.C.: A Key Exchange Protocol Using Real Quadratic Fields.
Journal of Cryptology, Vol. 7, 192-198, (1994).
[108] Scheidler, R., Williams, H.C.: A Public Key Cryptosystem Utilizing Cyclotomic Fields. Designs, Codes and
Cryptography, Vol. 6, 237-242, (1995).
[109] Schneier, B.: Applied Cryptography Second Edition: protocols, algorithms and source code in C. John
Wiley and Sons, New York (1996).
[110] Shanks, D.: Class number, a theory of factorization, and genera. Number Theory Institute, Proc.
Symposium pure Mathematics, American Mathematical Society, Vol. 20, 415-440, (1981).
[111] Shannon, C.: A Mathematical Theory of Communication. Bell System Thechnical Journal, (1948).
[112] Shannon, C.: Communications Theory of Secrecy Systems. Bell System Thechnical Journal, (1949).
[113] Short, P.W.: Algorithms for quantum computation: discrete logarithm and factoring. Proc. of the 35th
Annual IEEE Symposium on Foundations of Computer Science. IEEE Press, 124-134, (1994).
[114] Singh, S.: Los códigos secretos: El arte de la ciencia de la criptografía desde el antiguo Egipto a la era
de Internet, Debate. Madrid (2000).
[115] Solovay, R., Strassen, V.: A fast Monte-Carlo test for primality. SIAM J. Comput.,Vol. 6, 84-85, (1975).
[116] Sorenson, J.P.: Polylog depth circuits for integer factoring and discrete logarithms. Information and
Computation, Vol. 110, 1-18, (1994).
[117] Stallings, W.: Cryptography and Network Security: Principles and Practice. Third Edition. Prentice Hall,
New Jersey, (2003).
[118] Teske, E.: Squar-root algorithms for the discrete logarithm problem (a survey). Center for Applied
Cryptographic Research. University of Waterloo, Technical Report CORR 2001-07, (2001).
[119] Van Oorschot, P.: A comparison of practical public key cryptosystems based on integer factorization
and discrete logarithms. Contemporary Cryptology: The Science of information Integrity. IEEE Press, 289322, New York, (1992).
130 | P á g i n a
[120] Wells, A.L.: A polynomial form for logarithms modulo a prime. IEEE Trans. Information Theory, Vol. 30,
845-846, (1984).
[121] Wiener, M.J.: Cryptoanalysis of short RSA secret exponents. IEEE Trans.
[122] Williams, H.C.: A modification of RSA public key encryption procedure. IEEE Trans. Inform. Theory IEEE
Press,Vol. 26, 726-729, (1980).
131 | P á g i n a
132 | P á g i n a
Anexos
Resultados de las rondas del algoritmo AES al funcionar con
una matriz de ejemplo 57
57
Fundamentos de Critptográfia: apuntes. Universidad Nacional Autónoma de México
133 | P á g i n a
Modificaciones
A continuación se presenta una comparativa de las modificaciones hechas en los archivos de la
implementación del algoritmo AES. En el lado izquierdo se logra ver el archivo modificado, en el lado
derecho, el archivo de implementación original antes de mejoras.
Modificaciones: Archivo main.h
Modificaciones: aes.h
134 | P á g i n a
Modificaciones: main.c
135 | P á g i n a
136 | P á g i n a
137 | P á g i n a
138 | P á g i n a
139 | P á g i n a
140 | P á g i n a
Modificaciones: aes.c
141 | P á g i n a
142 | P á g i n a
143 | P á g i n a
144 | P á g i n a
145 | P á g i n a
146 | P á g i n a
147 | P á g i n a
148 | P á g i n a
149 | P á g i n a
Tablas S-Box58
58
FIPS PUB 197: the official AES standard. Federal Information Processing Standard. 2001-11-26. Retrieved 2010-04-29.
150 | P á g i n a
Código fuente de la implementación del algoritmo Aes.
Main.c
#include
#include
#include
#include
<LPC21xx.h>
"libreria_uart1.h"
"aes.h"
"main.h"
/* lista de interrupciones */
void IRQ_uart1_bloque(void) __irq;
void IRQ_uart1_clave(void) __irq;
/* variables*/
//parametros de cifrado
char cifrar = 1;
//Modo Cifrado (1) o Modo Descifrado (0)
int longitudClave = 128;
//longitud de la clave de cifrado (128,192 o 256)
unsigned char clave[32] =
{0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
//Clave de cifrado/descifrado
0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00};
//Si sobran posiciones seran ignoradas
//variables utiles
unsigned char claveRecibida[64];
//conjunto de caracteres que se reciben del teclado
//como clave ('1','A','6','2'...)
unsigned char palabraRecibida[32];
//conjunto de caracteres que se reciben del teclado
//para codificar('1','A','6','2'...)
unsigned char bloque[16];
//significado de esos caracteres (1A, 62...)
unsigned char palabraProcesada[16];
//palabra resultado del proceso de cifrado/descifrado
char numeroRondas;
char nuevaPalabra = 0;
/* funciones */
//deduce el significado de los caracteres ascii
//recibidos y lo introduce en la variable bloque
void fijaBloque(){
int i;
char caracter;
for(i=0;i<16;i++){
caracter = (leeCifra(palabraRecibida[2*i])<<4)
+leeCifra(palabraRecibida[(2*i)+1]);
bloque[i] = caracter;
}
}
//deduce el significado de los caracteres ascii
//recibidos y lo introduce en la variable clave
151 | P á g i n a
void fijaClave(){
int i;
char caracter;
for(i=0;i<longitudClave/8;i++){
caracter = (leeCifra(claveRecibida[2*i])<<4)
+leeCifra(claveRecibida[(2*i)+1]);
clave[i] = caracter;
}
}
//devuelve el valor numerico de un caracter ascii
unsigned char leeCifra(unsigned char caracter){
if (caracter >= '0' && caracter <= '9')
caracter = caracter - 48;
else
if (caracter >= 'A' && caracter <= 'F')
caracter = caracter - 55;
else
if (caracter >= 'a' && caracter <= 'f')
caracter = caracter - 87;
else
caracter = 0;
return caracter;
}
//devuelve la codificacion ascii de un valor numérico
unsigned char leeChar(unsigned char caracter){
if(caracter >= 0 && caracter <= 9)
caracter = caracter + 48;
else
if(caracter >= 10 && caracter <= 15)
caracter = caracter + 55;
else
caracter = 48;
return caracter;
}
//asigna a palabraRecibida el valor de nuevo[]
void setPalabraRecibida(unsigned char nuevo[]){
int i;
for(i=0;i<32;i++)
palabraRecibida[i] = nuevo[i];
nuevaPalabra = 1;
}
int main(){
//método main
char elemento, ronda;
unsigned char * puntero;
/* iniciliazaciones */
VPBDIV = 0x01;
//Frecuencia de los perifericos
152 | P á g i n a
//(pclk) = 60MHz
iniUart1(); //inicializamos la uart1
/* VIC */
VICVectCntl1 = 0x00000027;
//asociamos el slot 1 al canal 7 (UART1)
VICVectAddr1 = (unsigned)IRQ_uart1_clave;
//direccion de la IRQ de recepcion de clave de 128 bits
//al VIC
/* Obtencion de parametros de cifrado */
//peticion y recepcion de cifrado/descifrado
enviarCadena_UART1("Pulse C si quiere cifrar o
D si quiere descifrar ");
//enviamos la cadena
while((U1LSR & 0x01) == 0x00);
//hasta que no recibamos un byte no pasa de aquí
numeroRondas = U1RBR;
//leemos el caracter recibido
if(numeroRondas == 'D' | numeroRondas == 'd'){
//si se ha recibido la letra D o d
enviarCadena_UART1("Proceso de descifrado ");
cifrar = 0;
//activamos el modo descifrado
}
else enviarCadena_UART1("Proceso de cifrado ");
//si hemos recibido cualquier otro caracter, se
//coloca modo cifrado
//peticion y recepcion del tamaño de clave
enviarSaltoDeCarro_UART1();
enviarCadena_UART1("Clave de cifrado: ");
enviarSaltoDeCarro_UART1();
enviarCadena_UART1("Si la longitud de la clave es
de 128 bits pulse 1, ");
enviarCadena_UART1("si es de 192 pulse 2 ");
enviarCadena_UART1("y si es de 256 pulse 3 ");
//enviamos la cadena
while((U1LSR & 0x01) == 0x00);
//hasta que no recibamos un byte no pasa de aquí
numeroRondas = U1RBR;
//leemos el caracter recibido
if(numeroRondas == '2'){
enviarCadena_UART1("Clave de 192 bits ");
longitudClave = 192;
}
else
if(numeroRondas == '3'){
enviarCadena_UART1("Clave de 256 bits ");
longitudClave = 256;
}
else
//si el caracter recibido no es '2' ni '3'
153 | P á g i n a
//entonces la clave es de 128 bits
enviarCadena_UART1("Clave de 128 bits ");
//peticion y recepcion de la clave de cifrado
VICIntEnable = 0x00000080;
//activamos la interrupcion de la UART1
enviarSaltoDeCarro_UART1();
enviarCadena_UART1("Introduzca la clave de cifrado ");
while(nuevaPalabra == 0);
//hasta que no haya llegado la clave no pasa de aqui
VICIntEnClr = 0x00000080;
//desactivamos la interrupcion de la UART1
nuevaPalabra = 0;
VICVectAddr1 = (unsigned)IRQ_uart1_bloque;
//direccion de la IRQ de recepcion de bloque al VIC
//a partir de aquí solamente usaremos la interrupcion
//de bloque recibido
enviarCadena_UART1("Clave recibida");
enviarSaltoDeCarro_UART1();
//calculamos el numero de rondas en funcion
//del tamaño de la clave
numeroRondas = longitudClave/32 + 6;
fijaClave();
/* Creamos las subclaves */
keyExpansion();
//se calculan todas las subclaves
enviarCadena_UART1("Envie el texto a cifrar en
bloques de 16 bytes");
enviarSaltoDeCarro_UART1();
while(1){
//bucle de funcionamiento
/* espera de la palabra */
VICIntEnable = 0x00000080;
//activamos la interrupcion de la UART1
while(nuevaPalabra == 0);
//hasta que no haya llegado una nueva palabra
//no pasa de aqui
VICIntEnClr = 0x00000080;
//desactivamos la interrupcion de la UART1
nuevaPalabra = 0;
/* si salimos del while, quiere decir que
el bloque está completo y debe ser dado a AES */
fijaBloque();
//fijamos el bloque a codificar(valores numéricos) a
//partir del valor almacenado en palabraRecibida(
//codificacion ascii)
setEstado(bloque);
//entregamos el bloque a aes.c
154 | P á g i n a
if(cifrar == 1){
//Si tenemos que cifrar
/* comienza AES en modo cifrado */
// **Ronda inicial**
addRoundKey(0);
// **Rondas principales**
for(ronda=1;ronda<numeroRondas;ronda++){
subBytes();
shiftRows();
mixColumns();
addRoundKey(ronda);
}
// **Ronda final**
//es igual que las principales pero
//sin el mixColums
subBytes();
shiftRows();
addRoundKey(numeroRondas);
//el último
//addRoundKey no lo medimos, puesto que detrás no
//viene la SBox
}
else{ //Si no, tenemos que descifrar...
/* comienza AES en modo descifrado */
// **Ronda inicial**
addRoundKey(numeroRondas);
// **Rondas principales**
for(ronda=numeroRondas - 1;ronda>0;ronda--){
invShiftRows();
invSubBytes();
addRoundKey(ronda);
IOCLR0 = 0x00200000;
//avisamos al osciloscopio (poniendo un pin a 0)
//para que deje de medir
invMixColumns();
}
// **Ronda final**
//es igual que las principales pero sin el
//mixColums
invShiftRows();
invSubBytes();
addRoundKey(0);
}
/* AES finalizado, extraemos los
datos cifrados */
puntero = (unsigned char*)getEstado();
for(elemento=0;elemento<4;elemento++)
for(ronda=0;ronda<4;ronda++)
palabraProcesada[((3-(ronda))*4)+elemento]
= *puntero++;
155 | P á g i n a
/* y los devolvemos por la UART1 */
//ponemos un salto de carro para separar
//lo enviado de lo recibido
while((U1LSR | 0xDF) == 0xDF);
//hasta que no esté vacio por completo
//no pasa de aquí
U1THR = '\r';
U1THR = '\n';
while((U1LSR | 0xDF) == 0xDF);
//hasta que no esté vacio por completo
//no pasa de aquí
for(elemento=0;elemento<8;elemento++){
U1THR = leeChar(palabraProcesada[elemento]
/16);
U1THR = leeChar(palabraProcesada[elemento]
%16);
}
while((U1LSR | 0xDF) == 0xDF);
//hasta no esté vacio por completo
//no pasa de aquí
for(elemento=8;elemento<16;elemento++){
U1THR = leeChar(palabraProcesada[elemento]/16);
U1THR = leeChar(palabraProcesada[elemento]%16);
}
//cadena puesta, ahora ponemos el salto
//de carro
while((U1LSR | 0xDF) == 0xDF);
//hasta que no esté vacio por completo no
//pasa de aquí
U1THR = '\r';
U1THR = '\n';
}
}
156 | P á g i n a
Aes.c
/*
******************************************************************
Para hacer que trabaje a 32 bits en vez de a 8 bits bastara con
modificar las funciones del archivo aes.c para que trabaje a 32 bits
******************************************************************
*/
#include <LPC21xx.h>
#include "main.h"
extern char numeroRondas;
extern unsigned char clave[32];
//tabla de la SBOX
int sbox[256] =
{
//0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
//0
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
//1
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
//2
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
//3
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
//4
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
//5
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
//6
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
//7
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
//8
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
//9
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
//A
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
//B
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
//C
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
//D
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
//E
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
}; //F
// tabla inversa de la SBOX
int isbox[256] = {
//0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
//0
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
//1
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
//2
0x08,
//3
0x72,
//4
0x6c,
//5
0x90,
//6
0xd0,
//7
0x3a,
//8
0x96,
//9
0x47,
//A
0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
157 | P á g i n a
0xfc,
//B
0x1f,
//C
0x60,
//D
0xa0,
//E
0x17,
0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
}; //F
//matriz que almacena las columnas de la matriz de estado
unsigned int estado[4];
//array que almacena las claves intermedias (round keys)
unsigned int TRoundKey[60];
//clave de la codificacion
unsigned int Key[4];
// Rcon[i] contiene las constantes fruto de elevar x a la potencia
enesima de (i-1) siendo
// potencias de x (x denotado como {02}) en el campo GF(28)
// Hay que tener en cuenta que i comienza en 1 y no en 0
int
Rcon[12]
=
{0x8d000000,
0x01000000,
0x02000000,
0x04000000,
0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000,
0x36000000, 0x6c000000};
//fija el bloque a codificar (Las cuatro columnas)
//se posicionan trasponiendo la matriz
void setEstado(unsigned char entrada[16]){
char i;
for(i=0;i<4;i++)
estado[i] =
(entrada[i] << 24) ^
(entrada[i + 4] << 16) ^
(entrada[i + 8] << 8) ^
entrada[i + 12];
}
//devuelve el bloque de codificacion en un puntero a un array de 4 int
unsigned int* getEstado(){
return estado;
}
//esta funcion produce las Nb(Nr+1) subclaves (round keys) que se usan en
cada ronda de encriptado
void keyExpansion(){
char i, end;
// Las primeras posiciones del vector de subclaves son ocupadas por
la clave principal
for(i=0;i<4;i++)
TRoundKey[i] =
(clave[i] << 24) ^
(clave[i + 4] << 16) ^
(clave[i + 8] << 8) ^
clave[i + 12];
158 | P á g i n a
// En funcion del tamaño de la clave, esta funcion sera de una manera o de otra
if(numeroRondas == 10){
//Si es de 128 bits
while(i < 44){ // mientras que sigue rellenando subclaves... (11 subclaves de
4 palabras cada una)
//1
TRoundKey[i] = TRoundKey[i-4] ^
//palabra de la subclave anterior
((sbox[TRoundKey[i-3] & 0x000000FF]) <<
24) ^ //Sbox del elemento 13 de la subclave anterior movido 24 bits a la izquierda
(Rcon[i/4]);
//rcon del número de la columna
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
//2
TRoundKey[i] = TRoundKey[i-4] ^
((sbox[TRoundKey[i-3] & 0x000000FF]) <<
24);
//Sbox del elemento 14 de la subclave anterior movido 24 bits a la izquierda
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
//3
TRoundKey[i] = TRoundKey[i-4] ^
((sbox[TRoundKey[i-3] & 0x000000FF]) <<
24);
//Sbox del elemento 15 de la subclave anterior movido 24 bits a la izquierda
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
//4
TRoundKey[i] = TRoundKey[i-4] ^
((sbox[TRoundKey[i-7] & 0x000000FF]) <<
24);
//Sbox del elemento 12 de la subclave anterior movido 24 bits a la izquierda
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
}//Fin while
}//Fin if 128
else{
if(numeroRondas == 12){
//Si la clave es de 192 bits...
//Colocamos lo que nos queda de la clave principal en las dos
primeras columnas
for(;i<8;i++)
TRoundKey[i] = (clave[i + 12] << 24) ^ (clave[i + 16] << 16);
//Rellenamos las siguientes dos columnas para acabar con el grupo de
4 subclaves
0x000000FF]) << 8) ^
izquierda
TRoundKey[4] ^= (TRoundKey[0]>>16) ^
//Sumamos lo de 6 columnas atras
((sbox[(TRoundKey[5]>>16)
&
//SBox del elemento 21 de la subclave actual movido 8 bits a la
(Rcon[1] >> 16);
//Rcon del número de la columna
TRoundKey[4] ^= (TRoundKey[4] & 0x0000FF00) >> 8;
//Arrastramos sumando la ronda anterior
TRoundKey[5] ^=
0x000000FF]) << 8);
la izquierda
(TRoundKey[1]>>16) ^
((sbox[(TRoundKey[6]>>16)
&
//SBox del elemento 22 de la subclave actual movido 8 bits a
TRoundKey[5] ^= (TRoundKey[5] & 0x0000FF00) >> 8;
//Arrastramos sumando la ronda anterior
0x000000FF]) << 8);
la izquierda
TRoundKey[6] ^= (TRoundKey[2]>>16) ^
((sbox[(TRoundKey[7]>>16)
&
//SBox del elemento 23 de la subclave actual movido 8 bits a
TRoundKey[6] ^= (TRoundKey[6] & 0x0000FF00) >> 8;
//Arrastramos sumando la ronda anterior
159 | P á g i n a
0x000000FF]) << 8);
la izquierda
TRoundKey[7] ^= (TRoundKey[3]>>16) ^
((sbox[(TRoundKey[4]>>16)
&
//SBox del elemento 20 de la subclave actual movido 8 bits a
TRoundKey[7] ^= (TRoundKey[7] & 0x0000FF00) >> 8;
//Arrastramos sumando la ronda anterior
while(i < 48){ //Bucle de relleno de subclaves
//Hay tres tipos de bloques:
//Primer bloque (No contiene rot+Sbox)
//0 - 3
for(end=i+4;i<end;i++){
TRoundKey[i] = (TRoundKey[i-8] << 16) ^ (TRoundKey[i4] >> 16) ^
//Sumamos lo de 6 columnas atras
(TRoundKey[i-4] <<24);
//Y lo de la ultima columna de las
anteriores a la primera de las nuevas
TRoundKey[i] ^= (TRoundKey[i]>>8) ^ (TRoundKey[i]>>16)
^ (TRoundKey[i]>>24); //Arrastramos sumando la ronda anterior
}
//Segundo bloque (Contiene rot+Sbox en la primera columna)
//4
TRoundKey[i] = (TRoundKey[i-8]<<16) ^ (TRoundKey[i-4]>>16) ^
//Sumamos lo de 6 columnas atras
((sbox[TRoundKey[i-3]
&
0x000000FF]) << 24) ^ //Sbox del elemento 13 de la subclave anterior movido 24 bits a la
izquierda
(Rcon[i/6]);
//Rcon del número de la columna
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24); //Arrastramos sumando la ronda anterior
i++;
0x000000FF]) << 24);
izquierda
//5
TRoundKey[i] = (TRoundKey[i-8]<<16) ^ (TRoundKey[i-4]>>16) ^
((sbox[TRoundKey[i-3]
&
//Sbox del elemento 14 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
0x000000FF]) << 24);
izquierda
//6
TRoundKey[i] = (TRoundKey[i-8]<<16) ^ (TRoundKey[i-4]>>16) ^
((sbox[TRoundKey[i-3]
&
//Sbox del elemento 15 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
0x000000FF]) << 24);
izquierda
//7
TRoundKey[i] = (TRoundKey[i-8]<<16) ^ (TRoundKey[i-4]>>16) ^
((sbox[TRoundKey[i-7]
&
//Sbox del elemento 12 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
//Tercer bloque (Contiene rot+Sbox en la tercera columna)
//Primero nos ocupamos del fin de las seis columnas
anteriores
//8 - 11
for(end=i+4;i<end;i++){
TRoundKey[i] = (TRoundKey[i-8] << 16) ^
//Sumamos lo de 6 columnas atras
(TRoundKey[i-4] << 24);
//y la ultima columna
TRoundKey[i] ^= (TRoundKey[i] & 0xFF000000) >> 8;
//Arrastramos sumando la anterior columna
}
160 | P á g i n a
i = i-4;
0x000000FF]) << 8) ^
izquierda
//Y después del inicio de las 6 columnas siguientes
//8
TRoundKey[i] ^= (TRoundKey[i-4]>>16) ^
//Sumamos lo de 6 columnas atras
((sbox[(TRoundKey[i+1]>>16)
&
//SBox del elemento 21 de la subclave actual movido 8 bits a la
(Rcon[(i+2)/6]>>16);
//Rcon del número de la columna
TRoundKey[i] ^= (TRoundKey[i] & 0x0000FF00) >> 8;
//Arrastramos sumando la ronda anterior
i++;
0x000000FF]) << 8);
izquierda
//9
TRoundKey[i] ^= (TRoundKey[i-4]>>16) ^
((sbox[(TRoundKey[i+1]>>16)
&
//SBox del elemento 22 del grupo de claves actual movido 8 bits a la
TRoundKey[i] ^= (TRoundKey[i] & 0x0000FF00) >> 8;
i++;
0x000000FF]) << 8);
izquierda
//10
TRoundKey[i] ^= (TRoundKey[i-4]>>16) ^
((sbox[(TRoundKey[i+1]>>16)
&
//SBox del elemento 23 de la subclave actual movido 8 bits a la
TRoundKey[i] ^= (TRoundKey[i] & 0x0000FF00) >> 8;
i++;
0x000000FF]) << 8);
izquierda
//11
TRoundKey[i] ^= (TRoundKey[i-4]>>16) ^
((sbox[(TRoundKey[i-3]>>16)
&
//SBox del elemento 20 de la subclave actual movido 8 bits a la
TRoundKey[i] ^= (TRoundKey[i] & 0x0000FF00) >> 8;
i++;
}
//Fin while funcionamiento
//Pero todavia quedan 4 filas sin colocar
//0 - 3
for(;i<52;i++){
TRoundKey[i] = (TRoundKey[i-8] << 16) ^ (TRoundKey[i-4] >> 16)
^
//Sumamos lo de 6 columnas atras
(TRoundKey[i-4] <<24);
//Y lo de la ultima columna de las anteriores a
la primera de las nuevas
TRoundKey[i] ^= (TRoundKey[i]>>8) ^ (TRoundKey[i]>>16) ^
(TRoundKey[i]>>24);
//Arrastramos sumando la ronda anterior
}
//Todas las subclaves creadas y traspuestas
else{
}//Fin if 192
//Si la clave es de 256 bits...
for(;i<8;i++)
TRoundKey[i] = 0x00 ^
(clave[i + 12] << 24) ^
(clave[i + 16] << 16) ^
(clave[i + 20] << 8) ^
clave[i + 24];
while(i < 56){ // mientras que sigue
subclaves de 4 palabras cada una)
//Dos subclaves por paso:
rellenando
subclaves...
(15
//Primera subclave
//0
TRoundKey[i] = TRoundKey[i-8] ^
//palabra de la subclave anterior
((sbox[TRoundKey[i-3]
&
0x000000FF]) << 24) ^ //Sbox del elemento 13 de la subclave anterior movido 24 bits a la
izquierda
161 | P á g i n a
(Rcon[i/8]);
//rcon del número de la columna
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
0x000000FF]) << 24);
izquierda
//1
TRoundKey[i] = TRoundKey[i-8] ^
((sbox[TRoundKey[i-3]
&
//Sbox del elemento 14 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
0x000000FF]) << 24);
izquierda
//2
TRoundKey[i] = TRoundKey[i-8] ^
((sbox[TRoundKey[i-3]
&
//Sbox del elemento 15 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
0x000000FF]) << 24);
izquierda
//3
TRoundKey[i] = TRoundKey[i-8] ^
((sbox[TRoundKey[i-7]
&
//Sbox del elemento 12 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >> 16) ^
(TRoundKey[i] >> 24);
i++;
0x000000FF]) << 24);
izquierda
//Segunda subclave
//4 - 7
for(end=i+4;i<end;i++){
TRoundKey[i] = TRoundKey[i-8] ^
//palabra de la subclave anterior
((sbox[TRoundKey[i-4]
&
//Sbox del elemento 14 de la subclave anterior movido 24 bits a la
TRoundKey[i] ^= (TRoundKey[i] >> 8) ^ (TRoundKey[i] >>
16) ^ (TRoundKey[i] >> 24);
}
}//Fin while
//Pero todavia quedan 4 filas sin colocar
//56
TRoundKey[56] = TRoundKey[48] ^
//palabra de la subclave anterior
((sbox[TRoundKey[53] & 0x000000FF]) <<
24) ^ //Sbox del elemento 13 de la subclave anterior movido 24 bits a la izquierda
(Rcon[7]);
//rcon del número de la columna
TRoundKey[56] ^= (TRoundKey[56] >> 8) ^ (TRoundKey[56] >> 16) ^
(TRoundKey[56] >> 24);
//57
TRoundKey[57] = TRoundKey[49] ^
((sbox[TRoundKey[54] & 0x000000FF]) <<
24);
//Sbox del elemento 14 de la subclave anterior movido 24 bits a la izquierda
TRoundKey[57] ^= (TRoundKey[57] >> 8) ^ (TRoundKey[57] >> 16) ^
(TRoundKey[57] >> 24);
//58
TRoundKey[58] = TRoundKey[50] ^
((sbox[TRoundKey[55] & 0x000000FF]) <<
24);
//Sbox del elemento 15 de la subclave anterior movido 24 bits a la izquierda
TRoundKey[58] ^= (TRoundKey[58] >> 8) ^ (TRoundKey[58] >> 16) ^
(TRoundKey[58] >> 24);
//59
TRoundKey[59] = TRoundKey[51] ^
((sbox[TRoundKey[52] & 0x000000FF]) <<
162 | P á g i n a
24);
//Sbox del elemento 12 de la subclave anterior movido 24 bits a la izquierda
TRoundKey[59] ^= (TRoundKey[59] >> 8) ^ (TRoundKey[59] >>
(TRoundKey[59] >> 24);
16)
^
}//Fin if 256
}
/*
//HABRIA QUE TRASPONER ESTA SOLUCION
char i;
char palabrasClave;
unsigned int auxiliar;
unsigned int aux[4];
if(numeroRondas == 14) //Si la clave es de 256bits
palabrasClave = 8;
//ocupa 8 palabras de 32 bits
else
if(numeroRondas == 12) //Si es de 192
palabrasClave = 6;
//ocupa 6
else
palabrasClave = 4;
//Si es de 128 ocupa 4
// La clave principal ocupa las primeras posiciones dentro del vector de subclaves
for(i=0;i<palabrasClave;i++)
TRoundKey[i] = 0x00 ^
(clave[i*4] << 24) ^
(clave[i*4 + 1] << 16) ^
(clave[i*4 + 2] << 8) ^
clave[i*4 + 3];
//Si la clave no es de 256bits...
if (numeroRondas != 14){
// mientras que sigue rellenando subclaves...
while(i < 4*(numeroRondas+1)){
auxiliar = TRoundKey[i-1];
if(i % palabrasClave == 0){ //cada palabrasClave rondas...
//RotByte
auxiliar = (auxiliar << 8) ^ (auxiliar >> 24);
//SubBytes
auxiliar = (sbox[auxiliar & 0x000000FF]) ^
(sbox[(auxiliar & 0x0000FF00)>>8]<<8) ^
(sbox[(auxiliar & 0x00FF0000)>>16]<<16) ^
(sbox[(auxiliar & 0xFF000000)>>24]<<24);
//Los
desplazamos a un lado y al otro para acceder a la tabla sbox y después colocar los bytes en
su sitio
auxiliar ^= (Rcon[i/4]<<24);
}
TRoundKey[i] = TRoundKey[i - palabrasClave] ^ auxiliar;
i++;
}
}
//Si la clave es de 256 bits...
else{
// mientras que sigue rellenando subclaves...
while(i < 4*(numeroRondas+1)){
auxiliar = TRoundKey[i-1];
if(i % palabrasClave == 0){ //cada palabrasClave rondas...
//RotByte
auxiliar = (auxiliar << 8) ^ (auxiliar >> 24);
//SubBytes
auxiliar = (sbox[auxiliar & 0x000000FF]) ^
(sbox[(auxiliar & 0x0000FF00)>>8]<<8) ^
(sbox[(auxiliar & 0x00FF0000)>>16]<<16) ^
(sbox[(auxiliar & 0xFF000000)>>24]<<24);
//Los
desplazamos a un lado y al otro para acceder a la tabla sbox y después colocar los bytes en
su sitio
auxiliar ^= (Rcon[i/4]<<24);
}
else if (i % palabrasClave == 4)
auxiliar = (sbox[auxiliar & 0x000000FF]) ^
(sbox[(auxiliar & 0x0000FF00)>>8]<<8) ^
(sbox[(auxiliar & 0x00FF0000)>>16]<<16) ^
(sbox[(auxiliar & 0xFF000000)>>24]<<24);
//Los
desplazamos a un lado y al otro para acceder a la tabla sbox y después colocar los bytes en
su sitio
163 | P á g i n a
TRoundKey[i] = TRoundKey[i - palabrasClave] ^ auxiliar;
i++;
}
}
//Trasponemos la solución
for(i=0;i<numeroRondas+1;i++){
aux[0] = TRoundKey[4*i] & 0xFF000000 ^
((TRoundKey[4*i+1] & 0xFF000000) >> 8) ^
((TRoundKey[4*i+2] & 0xFF000000) >> 16) ^
(TRoundKey[4*i+3] >> 24);
aux[1] = ((TRoundKey[4*i] & 0x00FF0000) << 8) ^
(TRoundKey[4*i+1] & 0x00FF0000) ^
((TRoundKey[4*i+2] & 0x00FF0000) >> 8) ^
((TRoundKey[4*i+3] & 0x00FF0000) >> 16);
aux[2] = ((TRoundKey[4*i] & 0x0000FF00) << 16) ^
((TRoundKey[4*i+1] & 0x0000FF00) << 8) ^
(TRoundKey[4*i+2] & 0x0000FF00) ^
((TRoundKey[4*i+3] & 0x0000FF00) >> 8);
aux[3] = (TRoundKey[4*i] << 24) ^
((TRoundKey[4*i+1] & 0x000000FF) << 16) ^
((TRoundKey[4*i+2] & 0x000000FF) << 8) ^
(TRoundKey[4*i+3] & 0x000000FF);
TRoundKey[4*i] =
TRoundKey[4*i+1]
TRoundKey[4*i+2]
TRoundKey[4*i+3]
}*/
aux[0];
= aux[1];
= aux[2];
= aux[3];
}
// Suma la subclave de ronda al estado con una operación XOR
void addRoundKey(char round){
estado[0] ^= TRoundKey[4*round];
estado[1] ^= TRoundKey[4*round+1];
estado[2] ^= TRoundKey[4*round+2];
estado[3] ^= TRoundKey[4*round+3];
/*
char i;
for (i=0;i<4;i++)
estado[i] ^= TRoundKey[(4*round)+i];
*/
}
// La funcion SubBytes sistutuye, a nivel de bytes, los valores del
vector de estado con valores de la S-box
void subBytes(){
estado[0] = (sbox[estado[0] & 0x000000FF]) ^
(sbox[(estado[0] & 0x0000FF00)>>8]<<8) ^
(sbox[(estado[0] & 0x00FF0000)>>16]<<16) ^
(sbox[(estado[0] >> 24)]<<24);
estado[1] = (sbox[estado[1] & 0x000000FF]) ^
(sbox[(estado[1] & 0x0000FF00)>>8]<<8) ^
(sbox[(estado[1] & 0x00FF0000)>>16]<<16) ^
(sbox[(estado[1] >> 24)]<<24);
estado[2] = (sbox[estado[2] & 0x000000FF]) ^
(sbox[(estado[2] & 0x0000FF00)>>8]<<8) ^
(sbox[(estado[2] & 0x00FF0000)>>16]<<16) ^
(sbox[(estado[2] >> 24)]<<24);
164 | P á g i n a
estado[3] = (sbox[estado[3] & 0x000000FF]) ^
(sbox[(estado[3] & 0x0000FF00)>>8]<<8) ^
(sbox[(estado[3] & 0x00FF0000)>>16]<<16) ^
(sbox[(estado[3] >> 24)]<<24);
/*
char i;
for(i=0;i<4;i++){
estado[i] = (sbox[estado[i] & 0x000000FF]) ^
(sbox[(estado[i] & 0x0000FF00)>>8]<<8) ^
(sbox[(estado[i] & 0x00FF0000)>>16]<<16) ^
(sbox[(estado[i] & 0xFF000000)>>24]<<24); //Los
desplazamos a un lado y al otro para acceder a la tabla sbox y después
colocar los bytes en su sitio
}
*/
}
// La funcion InvSubBytes sistutuye, a nivel de bytes, los valores del
vector de estado con valores de la Inv S-box
void invSubBytes(){
estado[0] = (isbox[estado[0] & 0x000000FF]) ^
(isbox[(estado[0] & 0x0000FF00)>>8]<<8) ^
(isbox[(estado[0] & 0x00FF0000)>>16]<<16) ^
(isbox[(estado[0] >> 24)]<<24);
estado[1] = (isbox[estado[1] & 0x000000FF]) ^
(isbox[(estado[1] & 0x0000FF00)>>8]<<8) ^
(isbox[(estado[1] & 0x00FF0000)>>16]<<16) ^
(isbox[(estado[1] >> 24)]<<24);
estado[2] = (isbox[estado[2] & 0x000000FF]) ^
(isbox[(estado[2] & 0x0000FF00)>>8]<<8) ^
(isbox[(estado[2] & 0x00FF0000)>>16]<<16) ^
(isbox[(estado[2] >> 24)]<<24);
estado[3] = (isbox[estado[3] & 0x000000FF]) ^
(isbox[(estado[3] & 0x0000FF00)>>8]<<8) ^
(isbox[(estado[3] & 0x00FF0000)>>16]<<16) ^
(isbox[(estado[3] >> 24)]<<24);
/*
char i;
for(i=0;i<4;i++){
estado[i] = (isbox[estado[i] & 0x000000FF]) ^
(isbox[(estado[i] & 0x0000FF00)>>8]<<8) ^
(isbox[(estado[i] & 0x00FF0000)>>16]<<16) ^
(isbox[(estado[i]
&
0xFF000000)>>24]<<24);
//Los desplazamos a un lado y al otro para acceder a la tabla isbox
y después colocar los bytes en su sitio
}
*/
}
// La funcion ShiftRows rota cada columna un número distinto de bytes
// Se rota tantos bytes como índice tiene la columna
void shiftRows(){
//la primera columna se queda igual
//la segunda columna rota un byte
165 | P á g i n a
estado[1] = (estado[1] >> 24) ^ (estado[1] << 8);
//la tercera columna rota 2 bytes
estado[2] = (estado[2] >> 16) ^ (estado[2] << 16);
//la cuarta columna rota 3 bytes
estado[3] = (estado[3] >> 8) ^ (estado[3] << 24);
/*
unsigned int aux;
// la primera columna se queda igual
// La segunda columna rota un byte
aux = estado[1] >> 24; //ponemos en su futura posicion al primer
byte, añadiendo ceros por la izquierda
estado[1] <<= 8;
//desplazamos un byte la columna
estado[1] ^= aux;
//le añadimos el primer byte
// La segunda columna rota dos bytes
aux = estado[2] >> 16; //ponemos en su futura posicion los
primeros bytes, añadiendo ceros por la izquierda
estado[2] <<= 16;
//desplazamos dos bytes la columna
estado[2] ^= aux;
//le añadimos los dos primeros bytes
dos
// La tercera columna rota tres bytes
aux = estado[3] >> 8;
//ponemos en su futura posicion los tres
primeros bytes, añadiendo ceros por la izquierda
estado[3] <<= 24;
//desplazamos tres bytes la columna
estado[3] ^= aux;
//le añadimos el primer byte
*/
}
// La funcion InvShiftRows rota cada columna un número distinto de bytes
// Se rota tantos bytes como índice tiene la columna
void invShiftRows(){
//la primera columna se queda igual
//la segunda columna rota un byte
estado[1] = (estado[1] << 24) ^ (estado[1] >> 8);
//la tercera columna rota 2 bytes
estado[2] = (estado[2] << 16) ^ (estado[2] >> 16);
//la cuarta columna rota 3 bytes
estado[3] = (estado[3] << 8) ^ (estado[3] >> 24);
/*
unsigned int aux;
// la primera columna se queda igual
// La segunda columna rota un byte
aux = estado[1] << 24; //ponemos en su futura posicion al primer
byte, añadiendo ceros por la izquierda
estado[1] >>= 8;
//desplazamos un byte la columna
estado[1] ^= aux;
//le añadimos el primer byte
// La segunda columna rota dos bytes
aux = estado[2] << 16; //ponemos en
su
futura
posicion
los
dos
166 | P á g i n a
primeros bytes, añadiendo ceros por la izquierda
estado[2] >>= 16;
//desplazamos dos bytes la columna
estado[2] ^= aux;
//le añadimos los dos primeros bytes
// La tercera columna rota tres bytes
aux = estado[3] << 8;
//ponemos en su futura posicion los tres
primeros bytes, añadiendo ceros por la izquierda
estado[3] >>= 24;
//desplazamos tres bytes la columna
estado[3] ^= aux;
//le añadimos el primer byte
*/
}
// xtime es un macro que devuelve el producto con modulo {1b} de {02} y
la palabra argumento
// aunque la operacion sea de 32 bits, el producto es byte a byte
#define xtime(x)
(((x & 0x7F7F7F7F) << 1) ^ (((x>>7) & 0x01010101) *
0x1b))
//xtime a 8 bits
//#define xtime(x)
((x<<1) ^ (((x>>7) & 1) * 0x1b))
// Multiply es un macro que multiplica numeros en el gampo GF(2^8)
//Multiply a 32 bits
//#define Multiply(x,y) (((y & 0x01010101) * x) ^ ((y>>1 & 0x01010101) *
xtime(x)) ^ ((y>>2 & 0x01010101) * xtime(xtime(x))) ^ ((y>>3 &
0x01010101)
*
xtime(xtime(xtime(x))))
^
((y>>4
&
0x01010101)
*
xtime(xtime(xtime(xtime(x))))))
//Multiply a 8 bits
//#define Multiply(x,y) (((y & 1) * x) ^ ((y>>1 & 1) * xtime(x)) ^ ((y>>2
& 1) * xtime(xtime(x))) ^ ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ ((y>>4
& 1) * xtime(xtime(xtime(xtime(x))))))
// La funcion MixColumns mezcla las columnas siguiendo los pasos de G.
Bertoni
void mixColumns(){
//CON TODAS LAS MEJORAS
unsigned int salida[4];
// primer
salida[0]
salida[1]
salida[2]
salida[3]
paso
= estado[1]
= estado[0]
= estado[0]
= estado[0]
^
^
^
^
estado[2]
estado[2]
estado[1]
estado[1]
^
^
^
^
estado[3];
estado[3];
estado[3];
estado[2];
// segundo paso, multiplicación por dos en el campo de galois
estado[0] = xtime(estado[0]);
estado[1] = xtime(estado[1]);
estado[2] = xtime(estado[2]);
estado[3] = xtime(estado[3]);
//tercer paso
salida[0] ^= estado[0]
estado[1] ^= salida[1]
estado[2] ^= salida[2]
estado[3] ^= salida[3]
^
^
^
^
estado[1];
estado[2];
estado[3];
estado[0];
estado[0] = salida[0];
167 | P á g i n a
/*
//SOLO MEJORA 32BITS
unsigned int salida[4];
unsigned int i;
// primer paso
for(i=0;i<4;i++)
salida[i]
estado[(i+3)%4];
=
estado[(i+1)%4]
^
estado[(i+2)%4]
^
// segundo paso, multiplicación por dos en el campo de galois
for(i=0;i<4;i++)
estado[i] = xtime(estado[i]&0x000000FF)
^ ((xtime((estado[i]>>8)&0x000000FF))<<8)
^ ((xtime((estado[i]>>16)&0x000000FF))<<16)
^ ((xtime(estado[i]>>24))<<24);
//tercer paso
for(i=0;i<4;i++)
salida[i] ^= estado[i] ^ estado[(i+1)%4];
for(i=0;i<4;i++)
estado[i] = salida[i];
*/
/*
//MEJORA 32BITS + MEJORA XTIME
unsigned int salida[4];
unsigned int i;
// primer paso
for(i=0;i<4;i++)
salida[i]
estado[(i+3)%4];
=
estado[(i+1)%4]
^
estado[(i+2)%4]
^
// segundo paso, multiplicación por dos en el campo de galois
for(i=0;i<4;i++)
estado[i] = xtime(estado[i]);
//tercer paso
for(i=0;i<4;i++)
salida[i] ^= estado[i] ^ estado[(i+1)%4];
for(i=0;i<4;i++)
estado[i] = salida[i];
*/
}
// La funcion InvMixColumns
eficiente
void invMixColumns(){
mezcla
las
columnas
de
una
manera
más
//CON TODAS LAS MEJORAS
unsigned int salida[4];
//
//
//
//
//
//
tenemos
14
9
13
11
que hacer la matriz
11 13 9
14 11 13
9 14 11
13 9 14
168 | P á g i n a
//
//
//
//
//
//
pero la podemos dividir en [1] + [2]:
2
1
1
3
3
2
1
1
1
3
2
1
1
1
3
2
12 8 12 8
8 12 8 12
12 8 12 8
8 12 8 12
+
// primero calculamos [1], que es igual que en el cypher
// primer
salida[0]
salida[1]
salida[2]
salida[3]
paso
= estado[1]
= estado[0]
= estado[0]
= estado[0]
^
^
^
^
estado[2]
estado[2]
estado[1]
estado[1]
^
^
^
^
estado[3];
estado[3];
estado[3];
estado[2];
// segundo paso, multiplicación por dos en el campo de galois
estado[0] = xtime(estado[0]);
estado[1] = xtime(estado[1]);
estado[2] = xtime(estado[2]);
estado[3] = xtime(estado[3]);
// tercer
salida[0]
salida[1]
salida[2]
salida[3]
paso
^= estado[0]
^= estado[1]
^= estado[2]
^= estado[3]
^
^
^
^
estado[1];
estado[2];
estado[3];
estado[0];
// y después le sumamos [2]
//cuarto paso, suma y doblado en el campo de galois
estado[0] = xtime((estado[0] ^ estado[2]));
estado[1] = xtime((estado[1] ^ estado[3]));
estado[2] = xtime((estado[0] ^ estado[1]));
//8(x0+x1+x2+x3)
//4(x0+x2)
//4(x1+x3)
//quinto paso
salida[1] ^= estado[2] ^ estado[1];
salida[2] ^= estado[2] ^ estado[0];
estado[0] ^= estado[2] ^ salida[0];
estado[3] = salida[3] ^ estado[2] ^ estado[1];
estado[1] = salida[1];
estado[2] = salida[2];
/*
//MEJORA 32BITS + MEJORA XTIME + MEJORA CALCULOS
unsigned int salida[4];
unsigned int i;
for(i=0;i<4;i++)
salida[i]
=
estado[(i+3)%4];
estado[(i+1)%4]
^
estado[(i+2)%4]
^
for(i=0;i<4;i++)
estado[i] = xtime(estado[i]);
for(i=0;i<4;i++)
salida[i] ^= estado[i] ^ estado[(i+1)%4];
169 | P á g i n a
estado[0] = xtime((estado[0] ^ estado[2]));
//4(x0+x2)
estado[1] = xtime((estado[1] ^ estado[3]));
//4(x1+x3)
estado[2] = xtime((estado[0] ^ estado[1]));
//8(x0+x1+x2+x3)
for(i=0;i<4;i++)
salida[i] ^= estado[2] ^ estado[i%2];
for(i=0;i<4;i++)
estado[i] = salida[i];
*/
/*
//MEJORA 32BITS + MEJORA XTIME
unsigned int a,b,c,d,aux;
a
b
c
d
=
=
=
=
estado[0];
estado[1];
estado[2];
estado[3];
aux = Multiply(a, 0x0e0e0e0e) ^ Multiply(b, 0x0b0b0b0b);
aux = aux ^ Multiply(c, 0x0d0d0d0d);
estado[0] = aux ^ Multiply(d, 0x09090909);
aux = Multiply(a, 0x09090909) ^ Multiply(b, 0x0e0e0e0e);
aux = aux ^ Multiply(c, 0x0b0b0b0b);
estado[1] = aux ^ Multiply(d, 0x0d0d0d0d);
aux = Multiply(a, 0x0d0d0d0d) ^ Multiply(b, 0x09090909);
aux = aux ^ Multiply(c, 0x0e0e0e0e);
estado[2] = aux ^ Multiply(d, 0x0b0b0b0b);
aux = Multiply(a, 0x0b0b0b0b) ^ Multiply(b, 0x0d0d0d0d);
aux = aux ^ Multiply(c, 0x09090909);
estado[3] = aux ^ Multiply(d, 0x0e0e0e0e);
*/
/*
//MEJORA 32BITS
unsigned int a,b,c,d,aux;
a
b
c
d
=
=
=
=
estado[0];
estado[1];
estado[2];
estado[3];
aux
=
(Multiply(a&0x000000FF,
0x0e)
Multiply(((a>>8)&0x000000FF)<<8,
0x0e)
Multiply(((a>>16)&0x000000FF)<<16,
0x0e)
Multiply(((a>>24)&0x000000FF)<<24, 0x0e))
^
(Multiply(b&0x000000FF,
0x0b)
Multiply(((b>>8)&0x000000FF)<<8,
0x0b)
Multiply(((b>>16)&0x000000FF)<<16,
0x0b)
Multiply(((b>>24)&0x000000FF)<<24, 0x0b));
aux
=
aux
^
(Multiply(c&0x000000FF,
0x0d)
Multiply(((c>>8)&0x000000FF)<<8,
0x0d)
Multiply(((c>>16)&0x000000FF)<<16,
0x0d)
Multiply(((c>>24)&0x000000FF)<<24, 0x0d));
estado[0]
=
aux
^
(Multiply(d&0x000000FF,
0x09)
^
^
^
^
^
^
^
^
^
^
170 | P á g i n a
Multiply(((d>>8)&0x000000FF)<<8,
Multiply(((d>>16)&0x000000FF)<<16,
Multiply(((d>>24)&0x000000FF)<<24, 0x09));
0x09)
0x09)
^
^
aux
=
(Multiply(a&0x000000FF,
0x09)
Multiply(((a>>8)&0x000000FF)<<8,
0x09)
Multiply(((a>>16)&0x000000FF)<<16,
0x09)
Multiply(((a>>24)&0x000000FF)<<24, 0x09))
^
(Multiply(b&0x000000FF,
0x0e)
Multiply(((b>>8)&0x000000FF)<<8,
0x0e)
Multiply(((b>>16)&0x000000FF)<<16,
0x0e)
Multiply(((b>>24)&0x000000FF)<<24, 0x0e));
aux
=
aux
^
(Multiply(c&0x000000FF,
0x0b)
Multiply(((c>>8)&0x000000FF)<<8,
0x0b)
Multiply(((c>>16)&0x000000FF)<<16,
0x0b)
Multiply(((c>>24)&0x000000FF)<<24, 0x0b));
estado[1]
=
aux
^
(Multiply(d&0x000000FF,
0x0d)
Multiply(((d>>8)&0x000000FF)<<8,
0x0d)
Multiply(((d>>16)&0x000000FF)<<16,
0x0d)
Multiply(((d>>24)&0x000000FF)<<24, 0x0d));
aux
=
(Multiply(a&0x000000FF,
0x0d)
Multiply(((a>>8)&0x000000FF)<<8,
0x0d)
Multiply(((a>>16)&0x000000FF)<<16,
0x0d)
Multiply(((a>>24)&0x000000FF)<<24, 0x0d))
^
(Multiply(b&0x000000FF,
0x09)
Multiply(((b>>8)&0x000000FF)<<8,
0x09)
Multiply(((b>>16)&0x000000FF)<<16,
0x09)
Multiply(((b>>24)&0x000000FF)<<24, 0x09));
aux
=
aux
^
(Multiply(c&0x000000FF,
0x0e)
Multiply(((c>>8)&0x000000FF)<<8,
0x0e)
Multiply(((c>>16)&0x000000FF)<<16,
0x0e)
Multiply(((c>>24)&0x000000FF)<<24, 0x0e));
estado[2]
=
aux
^
(Multiply(d&0x000000FF,
0x0b)
Multiply(((d>>8)&0x000000FF)<<8,
0x0b)
Multiply(((d>>16)&0x000000FF)<<16,
0x0b)
Multiply(((d>>24)&0x000000FF)<<24, 0x0b));
aux
=
(Multiply(a&0x000000FF,
0x0b)
Multiply(((a>>8)&0x000000FF)<<8,
0x0b)
Multiply(((a>>16)&0x000000FF)<<16,
0x0b)
Multiply(((a>>24)&0x000000FF)<<24, 0x0b))
^
(Multiply(b&0x000000FF,
0x0d)
Multiply(((b>>8)&0x000000FF)<<8,
0x0d)
Multiply(((b>>16)&0x000000FF)<<16,
0x0d)
Multiply(((b>>24)&0x000000FF)<<24, 0x0d));
aux
=
aux
^
(Multiply(c&0x000000FF,
0x09)
Multiply(((c>>8)&0x000000FF)<<8,
0x09)
Multiply(((c>>16)&0x000000FF)<<16,
0x09)
Multiply(((c>>24)&0x000000FF)<<24, 0x09));
estado[3]
=
aux
^
(Multiply(d&0x000000FF,
0x0e)
Multiply(((d>>8)&0x000000FF)<<8,
0x0e)
Multiply(((d>>16)&0x000000FF)<<16,
0x0e)
Multiply(((d>>24)&0x000000FF)<<24, 0x0e));
*/
}
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
171 | P á g i n a
Main.h
/**
* Metodo principal del programa
*/
int main(void);
/**
* modifica el valor del bloque a codificar a partir
de la palabraRecibida y ocupandose de los
caracteres ascii
*/
void fijaBloque(void);
/**
* a partir de un caracter codificado en ascii,
devuelve el valor numérico de ese caracter
*/
unsigned char leeCifra(unsigned char caracter);
/**
* modifica el valor de palabraRecibida
* y asigna 1 al valor de nuevaPalabra
*/
void setPalabraRecibida(unsigned char nuevo[]);
/**
* a partir de un numero da su codificacion en ascii
*/
unsigned char leeChar(unsigned char caracter);
Aes.h
/**
* fija el bloque a codificar
*/
void setEstado(unsigned char entrada[16]);
/**
* devuelve el bloque de codificacion en un puntero a un array de 4 int
*/
unsigned int* getEstado(void);
/**
* Esta funcion produce las Nb(Nr+1) subclaves (round keys) traspuestas
que se usan en cada ronda de encriptado
*/
void keyExpansion(void);
/**
* Suma la subclave de ronda al estado con una operación XOR
172 | P á g i n a
*/
void addRoundKey(char round);
/**
* La funcion SubBytes sustituye los valores de la matriz de estado por
sus respectivas correspondencias de la S-box
*/
void subBytes(void);
/**
* La funcion InvSubBytes es la inversa de la funcion SubBytes
* Por tanto sustituye los valores de la matriz de estado
respectivas correspondencias en la iS-box
*/
void invSubBytes(void);
por
sus
/**
* La funcion ShiftRows() rota las filas en la matriz de estado a la
izquierda
* cada fila es rotada tantos bytes como indice tiene, por lo que no se
rota la firmera fila
*/
void shiftRows(void);
/**
* La funcion InvShiftRows() es la inversa de la funcion ShiftRows()
* por tanto rota las filas en la matriz de estado a la derecha
* cada fila es rotada tantos bytes como indice tiene, por lo que no se
rota la firmera fila
*/
void invShiftRows(void);
/**
* La funcion MixColumns mezcla las columnas de la matriz de estado
multiplicandolas por distintos valores
*/
void mixColumns(void);
/**
* La funcion InvMixColumns es la inversa de la funcion MixColumns
* Por tanto mezcla las columnas de la matriz de estado multiplicandolas
por otros valores
*/
void invMixColumns(void);
173 | P á g i n a