Capítulo 6. Algoritmos de cifrado 6.1 Introducción Un algoritmo de cifrado o algoritmo criptográfico es un método matemático cuya utilidad es encriptar y desencriptar un determinado mensaje. Generalmente funciona empleando una o más claves como parámetros del algoritmo, de modo que sean necesarias para recuperar el mensaje a partir de la versión cifrada. El mensaje antes de encriptar se denomina texto en claro y una vez encriptado se denomina texto cifrado. Se distinguen tres tipos de algoritmos criptográficos: De clave secreta o simétricos. De clave pública o asimétricos. De resumen de mensajes. Los algoritmos de clave secreta o simétricos convierten un mensaje en un texto cifrado del mismo tamaño que el original. Emplean una sola clave para encriptar y desencriptar. Son los algoritmos empleados para transferir grandes cantidades de información de modo seguro. Los algoritmos de clave pública o asimétricos encriptan un mensaje generando un texto cifrado del mismo tamaño que el original. Usan una clave para encriptar el mensaje (clave privada) y otra para desencriptar (clave pública). Tienen un coste computacional alto y se suelen emplear para distribuir las claves de los algoritmos simétricos. Los algoritmos de resumen de mensajes transforman mensajes de tamaño variable a textos cifrados de tamaño fijo sin emplear claves. Se emplean para convertir mensajes grandes en representaciones más manejables. En la actualidad, no se cuenta con un sistema estándar de APIs para los servicios de cifrado digital de XML. Los múltiples algoritmos de cifrado existentes abren un extenso abanico de posibilidades a la hora de implementar firma digital sobre documentos XML. La representación de los datos cifrados y de la clave debe ser eficiente y flexible y la elección de un algoritmo de cifrado u otro dependerá en buen grado de la edición de Java para la que se esté desarrollando. El cifrado de XML debe proveer de consistencia y de compatibilidad con la especificación de firma Digital de XML según lo definido por el W3C. 46
En esta sección, se presentan los diferentes tipos de algoritmos criptográficos que se distinguen y se discute su idoneidad para llevar a cabo la firma digital de un documento XML teniendo en cuenta las particularidades y restricciones que presenta la plataforma de Java para dispositivos móviles J2ME. 6.2 Algoritmos de resumen de mensajes Un algoritmo de resumen de mensajes o función de dispersión criptográfica es aquel que toma como entrada un mensaje de longitud variable y produce un resumen de longitud fija. En inglés el resumen se llama message digest, digest o hash y el algoritmo message digest algorithm. Es muy común el uso de estos algoritmos en la generación de firmas digitales. Estos algoritmos deben tener tres propiedades para ser criptográficamente seguros: No debe ser posible averiguar el mensaje de entrada basándose sólo en su resumen, es decir, el algoritmo es una función irreversible de una sola dirección. Dado un resumen debe ser imposible encontrar un mensaje que lo genere. Debe ser computacionalmente imposible encontrar dos mensajes que generen el mismo resumen. Entre las funciones de resumen más usadas se destacan las siguientes: SHA y SHA-1 El SHA (Secure Hash Algorithm) es un algoritmo de resumen seguro desarrollado por el NIST. El SHA-1 es una versión corregida del algoritmo publicada en 1994. El algoritmo es un estándar ANSI. El algoritmo toma un mensaje de menos de 2 64 bits y genera un resumen de 160 bits. Es más lento que el MD5, pero la mayor longitud de clave lo hace más resistente a ataques de colisión por fuerza bruta y de inversión. MD2, MD4 y MD5 Los tres son algoritmos de resumen de mensajes (el MD viene de Message Digest) desarrollados por Rivest. Los tres toman un mensaje de longitud arbitraria y generan un resumen de 128 bits. El MD2 está optimizado para máquinas de 8 bits, mientras que el MD4 y MD5 son para arquitecturas de 32 bits. El código para los tres algoritmos se puede encontrar en los RFCs 1319, 1320 y 1321. El MD2 funciona rellenando el mensaje para que tenga una longitud en bytes múltiplo 47
de 16. Sobre ese mensaje se calcula un checksum de 16 bytes que se añade al mensaje y la función de dispersión se aplica al mensaje resultante. El único problema que se le conoce es que si se omite el checksum se pueden obtener colisiones. El MD4 fue desarrollado en 1990 por Rivest. El mensaje se rellena para que su longitud en bits más 448 sea divisible por 512. Una representación de la longitud del mensaje de 64 bits se concatena entonces con el mensaje. El mensaje se procesa iterativamente en bloques de 512 bits y cada bloque es procesado en tres rotaciones distintas. El algoritmo ha sido criptoanalizado y se han encontrado debilidades, de hecho es posible encontrar colisiones en menos de un minuto en máquinas modernas, por lo que el algoritmo se considera a todos los efectos roto. El MD5 fue desarrollado en 1991 por Rivest. Es básicamente el MD4 con mejoras en la seguridad, aunque es más lento que este. El tamaño del resumen y la necesidad del relleno son iguales que en el MD4. Consta de cuatro rotaciones que tienen un diseño ligeramente diferente a las del MD4. El algoritmo ha sido criptoanalizado con técnicas similares a las del MD4 y se han encontrado pseudo-colisiones en la función de compresión, pero no en el algoritmo completo. Adicionalmente, se ha estimado que es posible construir una máquina capaz de atacar el algoritmo por fuerza bruta y encontrar una colisión en 24 días, aunque el coste de la máquina era de 10 millones de dólares en 1994. Teniendo en cuenta que la velocidad del algoritmo es un parámetro de vital importancia en las aplicaciones para dispositivos móviles, sin olvidar que debe proporcionar un margen de seguridad suficiente, el algoritmo MD5 es el que proporciona las mejores prestaciones por lo que en un principio fue el algoritmo seleccionado para esta implementación. Sin embargo como se detalla en la siguiente sección, el descubrimiento del hackeado de dicho algoritmo hizo que se optara por cambiarlo por SHA-1. 6.2.1 Hackeado del algoritmo MD5 En el mes de Agosto de 2004 se publica la noticia acerca de la vulnerabilidad de algoritmo MD5, descubierta por el matemático francés Antoine Joux. Éste algoritmo es frecuentemente utilizado para calcular el resumen o hash de un determinado conjunto de bytes. Una función de hash deber cumplir dos condiciones de seguridad esenciales: 1.- Imposibilidad de obtener el texto original a partir de su resumen. 2.- No debe ser computacionalmente factible encontrar dos textos que generen el mismo valor de resumen o hash. Este hecho se conoce como colisión. MD5 produce un valor de hash de 128 bits, que supone una media de 2^64 intentos para encontrar una colisión. 48
En la actualidad no se conoce la posibilidad de romper el primer supuesto para el caso de un hash calculado mediante MD5, sin embargo en la conferencia sobre criptografía celebrada en Santa Bárbara (California) en 2004, el prestigioso equipo de criptógrafos encabezado por Xiaoyun Wang anunció que habían encontrado un método capaz de encontrar una colisión en 2^37 intentos, lo cual hace que MD5 sea un algoritmo altamente vulnerable. Aunque el ataque de Wang era analítico, el tamaño del hash (128 bits) es suficientemente pequeño para poder contemplar ataques de 'fuerza bruta' tipo 'cumpleaños'. MD5CRK era un proyecto distribuido que comenzó en Marzo del 2004 con el propósito de demostrar que MD5 es inseguro encontrando una colisión usando un ataque de 'fuerza bruta', aunque acabó poco después del aviso de Wang. Debido al descubrimiento de un método fácil para generar colisiones de hash, la tendencia actual es el uso del algoritmo SHA-1 como función de resumen. SHA-1 (Security Hash Algorithm 1) fue desarrollado por la National Security Agency en 1995, produce un valor de resumen de 160 bits lo que proporciona una media de 2^80 intentos para encontrar una colisión por el método de prueba y error, nivel de seguridad bastante alto. Tras el anuncio de la ruptura del algoritmo MD5, Wang y su equipo comenzaron a trabajar en la ruptura del algoritmo de resumen más utilizado actualmente, SHA-1. Así, en la conferencia de seguridad RSA celebrada en San Francisco en Febrero de 2005 se presentaron los resultados obtenidos, asegurando que habían desarrollado un método que permitía generar colisiones SHA-1 en 2^69 intentos. Ésta cifra aún permite un nivel de seguridad bastante elevado por lo que se puede concluir que el algoritmo SHA-1 aún no ha sido crackeado. Uno de los más prestigiosos criptógrafos de la actualidad, Bruce Schneier, aborda el hallazgo del método para encontrar colisiones en SHA-1 en 2^69 intentos en su página web. Valorando la magnitud del descubrimiento, Schneier afirma que es un avance interesante para el mundo de la criptografía que puede ayudar en el desarrollo de nuevos algoritmos de seguridad. Sin embargo, considera que el anuncio no supone que el mundo electrónico sea menos seguro que antes. Actualmente no es factible que se rompan firmas digitales ni que se puedan leer mensajes encriptados con SHA-1. Aún así, en el NIST (National Institute of Standards and Technology) se buscan alternativas al algoritmo que pasan por aumentar el tamaño del resumen y por tanto se aumenta su resistencia ante ataques. 49
6.3 Algoritmos de clave pública o asimétricos La criptografía de clave pública fue inventada en 1975 por Whitfield Diffie y Matin Hellman. Se basa en emplear un par de claves distintas, una pública y otra privada. La idea fundamental es que las claves están ligadas matemáticamente pero es computacionalmente imposible obtener una a partir de la otra. Este tipo de algoritmos tiene dos aplicaciones fundamentales: Encriptación. Un usuario A manda un mensaje a otro usuario B encriptándolo mediante el uso de la clave pública de B. Cuando B lo recibe lo desencripta usando su clave privada. De esta forma se asegura que B es el único que puede descifrarlo ya que ningún otro usuario debe poseer la clave privada de B, ni siquiera el que envía el mensaje. Firmas digitales. Es habitual es uso de este tipo de algoritmos para la firma digital de documentos. Si B encripta un mensaje usando su clave privada, cualquiera que tenga su clave pública podrá obtener el texto en claro correspondiente; si alguien quiere hacerse pasar por B tendrá que cifrar el mensaje usando la misma clave privada o no se descifrará correctamente con la clave pública de B. Entre los algoritmos de este tipo se pueden destacar dos: RSA El RSA, llamado así por las siglas de sus creadores (Rivest, Shamir y Adelman), es el algoritmo de clave pública más popular. La clave es de tamaño variable, generalmente se usan claves entre 512 y 2048 bits. Las claves más grandes aumentan la seguridad del algoritmo pero disminuyen su eficiencia y generan más texto cifrado. Los bloques de texto en claro pueden ser de cualquier tamaño, siempre que sea menor que la longitud de la clave. Los bloques de texto cifrado generados son del tamaño de la clave. Comparado con los sistemas de cifrado simétrico como el DES, el algoritmo de RSA es 100 veces más lento en software y de 1000 a 10000 veces más lento en hardware por lo que su uso no es adecuado para aplicaciones móviles, en las que la capacidad de cómputo y memoria son bastante reducidas. Diffie-Hellman El algoritmo de Diffie Hellman es un algoritmo de clave pública que generalmente se emplea junto con algoritmos de cifrado simétrico, como método para acordar una clave 50
secreta. El algoritmo no se puede usar para encriptar conversaciones o firmas digitales. El problema fundamental de este algoritmo es que es sensible a ataques activos del tipo hombre en el medio. Si la comunicación es interceptada por un tercero, este se puede hacer pasar por el emisor cara al destinatario y viceversa, ya que no disponemos de ningún mecanismo para validar la identidad de los participantes en la comunicación. Así, el hombre en el medio podría acordar una clave con cada participante y retransmitir los datos entre ellos, escuchando la conversación en ambos sentidos. 6.4 Algoritmos de cifrado simétrico Dentro de estos algoritmos se distinguen dos tipos de algoritmos en función de la cantidad de datos de entrada que manejan a la vez: algoritmos de cifrado por bloques y algoritmos de cifrado de flujo. 6.4.1 Cifrado de flujo de datos Generalmente operan sobre 1 bit (o sobre bytes o palabras de 16 ó 32 bits) de los datos de entrada cada vez. El algoritmo genera una secuencia (secuencia cifrante o keystream en inglés) de bits que se emplea como clave. La encriptación se realiza combinando la secuencia cifrante con el texto en claro. El paradigma de este tipo de algoritmos es el One Time Pad, que funciona aplicando una XOR (o-exclusiva) a cada bit de la entrada junto con otro generado aleatoriamente para obtener cada bit de la salida. La secuencia de bits aleatorios es la clave de la sesión, secuencia de cifrado o el pad, que es del mismo tamaño que la entrada y la salida. Para recuperar el texto original el texto cifrado debe pasar por el mismo proceso empleado para encriptar usando el mismo pad. Este algoritmo es conocido por ser el único incondicionalmente seguro, aunque, como las claves son del mismo tamaño que la entrada, es de poca utilidad práctica. Los algoritmos de este tipo son intentos de conseguir algoritmos prácticos que se aproximen al funcionamiento del one time pad. El más conocido es el RC$ que se muestra a continuación: RC4 El RC4 es un algoritmo de cifrado de flujo diseñado por Ron Rivest para RSA Data Security. Es un algoritmo de tamaño de clave variable con operaciones a nivel de byte. Se basa en el uso de una permutación aleatoria y tiene un periodo estimado de más de 10 100. Además, es un algoritmo de ejecución rápida en software. 51
El algoritmo se emplea para encriptación de ficheros y para encriptar la comunicación en protocolos como el SSL (TLS). 6.4.2 Cifrado por bloques Los algoritmos de cifrado por bloques toman bloques de tamaño fijo del texto en claro y producen un bloque de tamaño fijo de texto cifrado, generalmente del mismo tamaño que la entrada. El tamaño del bloque debe ser lo suficientemente grande como para evitar ataques de texto cifrado. La asignación de bloques de entrada a bloques de salida debe ser uno a uno para hacer el proceso reversible y parecer aleatoria. Para la asignación de bloques los algoritmos de cifrado simétrico realizan sustituciones y permutaciones en el texto en claro hasta obtener el texto cifrado. Un tipo especial de algoritmos de cifrado por bloques iterativos son los denominados algoritmos de cifrado de Feistel. En estos algoritmos el texto cifrado se obtiene del texto en claro aplicando repetidamente la misma transformación o función de rotación. Una característica interesante de estos algoritmos es que la encriptación y desencriptación son idénticas estructuralmente, aunque las subclaves empleadas en la encriptación se toman en orden inverso en la desencriptación. Existen multitud de algoritmos de este tipo. A continuación se muestran los más populares y de los que se disponen de implementaciones Java: DES El DES (Data Encription Standard o Estándar de Encriptación de Datos) es el nombre del documento FIPS (Federal Information Processing Standard) 46-1 del Instituto Nacional de Estándares y Tecnología (NIST) del Departamento de Comercio de Estados Unidos. Fue publicado en 1977. En este documento se describe el DEA (Data Encription Algorithm o Algoritmo de Encriptación de Datos). Es el algoritmo de cifrado simétrico más estudiado, mejor conocido y más empleado del mundo. El DEA (llamado con frecuencia DES) es un algoritmo de cifrado por bloques de 64 bits de tamaño. Emplea una clave de 56 bits durante la ejecución (se eliminan 8 bits de paridad del bloque de 64). El algoritmo fue diseñado para ser implementado en hardware. Cuando se utiliza en comunicaciones ambos participantes deben conocer la clave secreta (para intercambiarla se suelen emplear algoritmos de clave pública). El algoritmo se puede usar para encriptar y desencriptar mensajes, generar y verificar códigos de autentificación de mensajes (MAC) y para encriptación de un sólo usuario. Aunque el DES era un algoritmo computacionalmente seguro, esto ha dejado de ser cierto, ya que con hardware específico es posible realizar ataques por fuerza bruta que descubran una clave en pocos días. El problema principal es que el tamaño de la clave, 56 bits es demasiado pequeño para la potencia de cálculo actual. 52
Triple-DES Consiste en encriptar tres veces una clave DES. Esto se puede hacer de varias maneras: DES-EEE3: Tres encriptaciones DES con tres claves distintas. DES-EDE3: Tres operaciones DES con la secuencia encriptar-desencriptarencriptar con tres claves diferentes. DES-EEE2 y DES-EDE2: Igual que los anteriores pero la primera y tercera operación emplean la misma clave. Dependiendo del método elegido, el grado de seguridad varía; el método más seguro es el DES-EEE3. RC2 El RC2 es un algoritmo de cifrado por bloques de clave de tamaño variable diseñado por Ron Rivest de RSA Data Security (la RC quiere decir Ron's Code o Rivest's Cipher). El algoritmo trabaja con bloques de 64 bits y entre dos y tres veces más rápido que el DES en software. Se puede hacer más o menos seguro que el DES contra algoritmos de fuerza bruta eligiendo el tamaño de clave apropiadamente. RC4 El RC4 es un algoritmo de cifrado de flujo diseñado por Ron Rivest para RSA Data Security. Es un algoritmo de tamaño de clave variable con operaciones a nivel de byte. Se basa en el uso de una permutación aleatoria y tiene un periodo estimado de más de 10 100. Además, es un algoritmo de ejecución rápida en software. El algoritmo se emplea para encriptación de ficheros y para encriptar la comunicación en protocolos como el SSL (TLS). RC5 El RC5 es un algoritmo parametrizable con tamaño de bloque variable, tamaño de clave variable y número de rotaciones variable. Los valores más comunes de los parámetros son 64 o 128 bits para el tamaño de bloque, de 0 a 255 rotaciones y claves de 0 a 2048 bits. Fue diseñado en 1994 por Ron Rivest. La mezcla de rotaciones dependientes de los datos y de distintas operaciones lo hace resistente al criptoanálisis lineal y diferencial. El algoritmo RC5 es fácil de implementar y analizar. 53
IDEA El IDEA (International Data Encription Algorithm) es un algoritmo de cifrado por bloques de 64 bits iterativo. La clave es de 128 bits. La encriptación precisa 8 rotaciones complejas. El algoritmo funciona de la misma forma para encriptar que para desencriptar (excepto en el cálculo de las subclaves). El algoritmo es fácilmente implementable en hardware y software, aunque algunas de las operaciones que realiza no son eficientes en software, por lo que su eficiencia es similar a la del DES. El algoritmo es considerado inmune al criptoanálisis diferencial y no se conocen ataques por criptoanálisis lineal ni debilidades algebraicas. La única debilidad conocida es un conjunto de 251 claves débiles, pero dado que el algoritmo tiene 2 128 claves posibles no se considera un problema serio. SAFER El SAFER (Secure And Fast Encription Routine) es un algoritmo de cifrado por bloques no propietario. Está orientado a bytes y emplea un tamaño de bloque de 64 bits y claves de 64 (SAFER K-64) o 128 bits (SAFER K-128). Tiene un número variable de rotaciones, pero es recomendable emplear como mínimo 6. El algoritmo original fue considerado inmune al criptoanálisis lineal y diferencial, pero Knudsen descubrió una debilidad en el generador de claves y el algoritmo fue modificado (SAFER SK-64 y SAFER SK-128). AES Para evitar las quejas que se procedieron con la implantación del algoritmo DES debido a partes del algoritmo no documentadas el NIST ( National Institute ofstander and Tecnology) decide iniciar un proceso abierto para seleccionar el algoritmo que formaría el nuevo estándar de cifrado AES. Se inicia entonces la consolidación de un Estándar de Cifrado Avanzado (AES) que permita proteger los datos confidenciales. En Septiembre de 1997 de presentan los criterios de evaluación y requisitos mínimos que debían cumplir todos los algoritmos que optaban a ganar el concurso, entre ellos destacan: El algoritmo debe ser público. Debe ser un algoritmo de cifrado en bloque simétrico. La longitud de la clave debe ser como mínimo 128 bits. Su diseño debe permitir aumentar la longitud de la clave según las 54
necesidades. Debe ser implementable tanto en hardware como en software. Además de cumplir estos requisitos, los algoritmos fueron juzgados por los siguientes factores: Seguridad. Eficiencia computacional. Requisitos de memoria. Implementable en Hardware y Software. Simplicidad de diseño. Flexibilidad. Entre todos los algoritmos que se presentaron a concurso, destacaron cinco que llegaron a la final. Concretamente fueron el algoritmo de Rijndael, Serpent, Twofish, RC6 y MARS. Blowfish Es un algoritmo de cifrado por bloques de 64 bits desarrollado por Scheiner. Es un algoritmo de tipo Feistel y cada rotación consiste en una permutación que depende de la clave y una sustitución que depende de la clave y los datos. Todas las operaciones se basan en o-exclusivas sobre palabras de 32 bits. La clave tiene tamaño variable (con un máximo de 448 bits) y se emplea para generar varios vectores de subclaves. Este algoritmo se diseño para máquinas de 32 bits y es considerablemente más rápido que el DES. El algoritmo es considerado seguro aunque se han descubierto algunas claves débiles, un ataque contra una versión del algoritmo con tres rotaciones y un ataque diferencial contra una variante del algoritmo. Mars Fue la propuesta de IBM par este concurso. Su gran problema es la complejidad, aunque a su favor cuenta con un margen de seguridad elevado. Serpent Serpent fue diseñado por Ross Anderson, Eli Biham y Lars Knudsen como candidato a AES. Cifra bloques de 128 bits u el tamaño mínimo de clave es del mismo valor, aunque puede manejar claves de 192 y 256 bits. Es similar al algoritmo de Rijndael, 55
destacando como principal diferencia que el a la postre ganador Rijndael resulta más rápido mientras que Serpent se muestra más seguro. Cabe destacar que Serpent es mucho más rápido que DES y que la actual versión alcanza los 45 Mbits/s sobre un Pentium a 200 Mhz mientras que DES lo hace a 15 Mbits/s. Twofish Creado por Bruce Schneier, presenta un encriptado de bloques simétricos de 128 bits, una longitud de la clave variable que puede ser 128, 192 y 256 bits. Obtuvo una buena acogida en el concurso para el estándar AES quedando en segundo lugar. Su funcionamiento se detalla a continuación. Divide el texto plano en 4 grupos de 32 bytes. En cada una de ellas las 2 palabras de la izquierda son usadas como entradas de una función g, una de ellas es rotada 8 bits a la izquierda. Se les aplica whitening al inicio con cuatro llaves. Utiliza 40 subllaves de 32 bits. Las primeras ocho son usadas para whitening. Cuatro al principio y cuatro al final son utilizadas en un xor con el bloque entero, cada iteración usa dos de las 32 restantes subllaves, por lo que Twofish realiza 16 iteraciones. El resultado de las dos funciones g son mezcladas unas con otras a través de una Pseudo-Hadamard Transform (PHT),mas dos llaves. A ese resultado se realiza una suma (XOR) con la parte derecha, una de las cuáles son rotadas un bit a la izquierda y la otra a la derecha. Las mitades izquierda y derecha son intercambiadas para la siguiente iteración. Cuando finaliza el proceso, el intercambio de la última iteración es revertido y se le suman las 4 llaves restantes para producir el texto cifrado. Twofish ha recibido críticas por su complejidad haciendo difícil su análisis durante el tiempo establecido en el proceso de desarrollo de AES. RC6 RC6 es un algoritmo de cifrado de bloques que utiliza llaves simétricas de una longitud máxima de 256 bits y un tamaño de bloque cifrado de 128 bits. Fue diseñado por Ron Rivest, Ray Sidney, y Yiqun Lisa Yin para RSA cumpliendo con los requisitos de AES. Destaca por la sencillez en sus mecanismos de cifrado, descifrado y generación de sub-llaves y tiene una buena velocidad de cifrado y descifrado. Sin embargo su seguridad ha sido ampliamente cuestionada. Rijndael Rijndael resultó ser el algoritmo ganador por lo que quedó establecido como el estándar AES. Sus creadores son Vincent Rijmen y Joan Daemen y es un algoritmo que maneja claves desde un valor mínimo aconsejado de 128 bits hasta 256 bits. 56
También permite trabajar con varios tamaños de bloque distintos desde 128 bits pasando por 160,192, 224 hasta llegar a 256 bits. El motivo de su elección para el estándar AES fue su combinación de seguridad, velocidad, eficiencia, sencillez y flexibilidad. Entre todas éstas características destacó su sencillez, que permitió un análisis muy intenso de su estructura. En Octubre de 2000, quedó establecido el estándar AES, y por lo tanto el algoritmo Rijndael como el estándar actual de las comunicaciones de EEUU y por derivación de todo el mundo. Todas las aplicaciones y servicios se están adaptando progresivamente pasando de utilizar DES a usar el nuevo estándar de cifrado. Rijndael recibió críticas sobre su margen de seguridad, debido a que era de los más bajos entre los finalistas y a que su estructura matemática puede conducir a ataques. Sin embargo, la simplicidad de su estructura hizo que fuese elegido. El proceso de cifrado consiste en la aplicación de cuatro funciones matemáticas invertibles sobre la información que se desea cifrar. Estas transformaciones se realizan de forma reiterativa para cada ronda o vuelta definida. La información a cifrar se va mapeando en una matriza de Estado. Esta matriz de estado se introduce en el cifrador y sufre una primera transformación, en su ronda inicial, que consiste en una or-exclusiva entre una Subclave generada y la matriz de Estado. A continuación, a la matriz de Estado resultante se le aplican cuatro transformaciones invertibles, repitiéndose este proceso en lo que se conoce como ronda Estándar. Finalmente se le aplica una última ronda o vuelta a la matriz de Estado resultante de las rondas anteriores utilizando tres funciones distintas. El resultado de la ronda final produce el bloque cifrado deseado. A la hora de seleccionar un determinado algoritmo de cifrado para desarrollar la firma digital XML para dispositivos móviles, hay que tener en cuenta los siguientes factores e intentar tomar la solución óptima: Rapidez: los dispositivos móviles deben ser rápidos. Esto es difícil de conseguir teniendo en cuenta que las CPUs de las que disponen son lentas. Por este motivo, no se debe sobrecargar la CPU con excesivas tareas criptográficas, lo que supone que los algoritmos de clave pública sean inapropiados para este tipo de dispositivos. Buena reputación: es importante que el algoritmo esté suficientemente probado y extendido para tener una mayor seguridad y ofrecer unos buenos resultados. Conocimiento de sus debilidades: si se conocen los agujeros de seguridad que presenta el algoritmo se podrán combatir de manera más eficaz. Implementaciones eficientes: la mayoría de los paquetes criptográficos consumen varios Mbs de espacio de almacenamiento lo que los convierte en inviables para el uso en dispositivos móviles. 57
6.5 Conclusiones El hecho de producirse colisiones el un algoritmo de hash provoca que no se pueda garantizar la integridad de los datos firmados ya que dos textos distintos podrían generar el mismo valor de resumen. Aún demostrada analíticamente la vulnerabilidad del algoritmo MD5, se continúa haciendo uso de él en multitud de aplicaciones, si bien la mayoría de los expertos aconsejan la migración a SHA-1. SHA-1 es en la actualidad el algoritmo de resumen más usado y es capaz de proporcionar un nivel de seguridad ante ataques bastante elevado, aunque se buscan alternativas a éste algoritmo ante los descubrimientos que reducen la probabilidad de colisión a 2^69 intentos. Analizados estos datos se consideró necesaria la utilización del algoritmo de cálculo de hash SHA-1 para realizar la firma digital de documentos XML en lugar del hasta entonces usado MD5. En contraposición al aumento de seguridad, el aumento de la longitud del resumen a 160 bits provoca una mayor carga computacional en la obtención de la firma. Los algoritmos de cifrado asimétricos presentan dos problemas fundamentales: Uno es la distribución de claves ya que aunque la clave pública se puede distribuir libremente, existe la posibilidad de la suplantación que hace necesario el uso de autoridades certificadoras y certificados digitales. El segundo de los problemas es sin duda el más importante para el caso particular de firma digital XML para dispositivos móviles. Se trata del alto coste computacional que presentan, que lo hace inapropiado para las características de la plataforma J2ME. Como se expresa anteriormente, se descarta la posibilidad de seleccionar un algoritmo de cifrado asimétrico para llevar a cabo la firma. Entre los algoritmos simétricos presentados, por su sencillez, velocidad y eficiencia el algoritmo más adecuado para generar una firma digital de máxima eficiencia es el de Rijndael. Además de poseer estas notables características, es el algoritmo seleccionado para el estándar AES, está ampliamente estudiado y su nivel de acogida e implantación está en continuo crecimiento, lo que está motivando que paulatinamente esté sustituyendo a DES. Por otro lado, el algoritmo de Rijndael cuenta con implementaciones adaptadas a J2ME. En concreto cabe destacar la implementación realizada por Bouncy Castle dentro de su API ligera para criptografía. 58