Search for in Google by Dino

Google Custom Search

jueves, 21 de diciembre de 2006

Criptografía Simétrica

La criptografía simétrica se refiere al conjunto de métodos que permiten tener comunicación segura entre las partes siempre y cuando anteriormente se hayan intercambiado la clave correspondiente que llamaremos clave simétrica. La simetría se refiere a que las partes tienen la misma llave tanto para cifrar como para descifrar.




Este tipo de criptografía es conocida también como criptografía de clave privada o criptografía de llave privada.

Existe una clasificación de este tipo de criptografía en tres familias, la criptografía simétrica de bloques (block cipher), la criptografía simétrica de lluvia (stream cipher) y la criptografia simétrica de resumen (hash functions). Aunque con ligeras modificaciones un sistema de criptografía simétrica de bloques puede modificarse para convertirse en alguna de las otras dos formas, e inversamente, sin embargo es importante verlas por separado dado que se usan en diferentes aplicaciones.

La criptografía simétrica ha sido la más usada en toda la historia, ésta a podido ser implementada en diferente dispositivos, manuales, mecánicos, eléctricos, hasta los algoritmos actuales que son programables en cualquier computadora. La idea general es aplicar diferentes funciones al mensaje que se quiere cifrar de tal modo que solo conociendo una clave pueda aplicarse de forma inversa para poder así descifrar.
Aunque no existe un tipo de diseño estándar, quizá el más popular es el de Fiestel, que consiste esencialmente en aplicar un número finito de interacciones de cierta forma, que finalmente da como resultado el mensaje cifrado. Este es el caso del sistema criptográfico simétrico más conocido, DES.
DES [47] es un sistema criptográfico que toma como entrada un bloque de 64 bits del mensaje y este se somete a 16 interacciones, con una clave de 56 bits. Para ver detalladamente su funcionamiento se puede consultar [29] o [52]. Este sistema fue tomado como estándar y ha sido uno de los mas conocidos, usados y estudiados.



DES opera con una llave de longitud de 56 bits, en la práctica el bloque de la clave tiene 64 bits, ya que a cada conjunto de 7 bits se le agrega un bit que puede ser usada como de paridad, pero en si la clave solo tiene 56 bits de longitud. Dependiendo de la naturaleza de la aplicación DES tiene 4 modos de operación [48][54][56] para poder implementarse: ECB (Electronic Codebook Mode) para mensajes cortos, de menos de 64 bits, CBC (Cipher Block Chaining Mode) para mensajes largos, CFB (Cipher Block Feedback) para cifrar bit por bit ó byte por byte y el OFB (Output Feedback Mode) el mismo uso pero evitando propagación de error.

En la actualidad no se ha podido romper el sistema DES desde la perspectiva de poder deducir la clave simétrica a partir de la información interceptada, sin embargo con un método a fuerza bruta, es decir, probando todas las 2^56 posibles claves se ha podido romper DES en Enero de 1999. Lo anterior quiere decir que, es posible verificar todas las claves posibles en el sistema DES en un tiempo corto, lo que lo hace inseguro para propósitos de alta seguridad. La opción que se ha tomado para poder suplantar a DES ha sido usar lo que se conoce como cifrado múltiple, es decir aplicar varias veces el mismo algoritmo para fortalecer la longitud de la clave, esto a tomado la forma de un nuevo sistema de cifrado que se conoce actualmente como triple-DES o TDES.


TDES El funcionamiento de TDES [53] consiste en aplicar 3 veces DES de la siguiente manera: la primera vez se usa una clave K1(azul) junto con el bloque B0, de forma ordinaria E (de Encryption), obteniendo el bloque B1. La segunda ves se toma a B1 con la clave K2 (roja), diferente a K1 de forma inversa, llamada D (de Desencryption) y la tercera vez a B2 con una clave K3 (verde) diferente a K1 y K2, de forma ordinaria E (de Encryption), es decir, aplica de la interacción 1 a la 16 a B0 con la clave K1, después aplica de la 16 a la 1, a B1 con la clave K2, finalmente aplica una vez mas de la 1 a la 16 a B3 usando la clave K3, obteniendo finalmente a B3. En cada una de estas tres veces aplica el modo de operación más adecuado.



El proceso del cifrado con TDES se puede apreciar en las siguientes figuras:


















Este sistema TDES usa entonces una clave de 168 bits, aunque se ha podido mostrar que los ataques actualmente pueden romper a TDES con una complejidad de 2^112, es decir efectuar al menos 2^112 operaciones para obtener la clave a fuerza bruta, además de la memoria requerida [44].

Se optó por TDES ya que es muy fácil interoperar con DES y proporciona seguridad a mediano plazo.

En los últimos 20 años se han diseñado una gran cantidad de sistemas criptográficos simétricos, entre algunos de ellos están: RC-5 [37], IDEA [25], FEAL [40], LOKI’91 [16], DESX [33], Blowfish [39], CAST [11], GOST []18, etcétera. Sin embargo no han tenido el alcance de DES, a pesar de que algunos de ellos tienen mejores propiedades.

Podemos decir que el estado actual de la criptografía simétrica es la búsqueda de un nuevo sistema que pueda reemplazar a DES en la mayor parte de aplicaciones. Es así como se ha optado por convocar a un concurso de sistemas criptográficos simétricos y que este decida quien será el nuevo estándar al menos para los próximos 20 años.


AES El NIST (National Institute of Standards Technology) [74] convocó a un concurso para poder tener un sistema simétrico que sea seguro y pueda usarse al menos en los próximos 20 años como estándar. En la mitad del año de 1998 se aceptaron 15 candidatos, estos se han sometido a pruebas públicas y por parte del NIST. Actualmente se cuentan con 5 finalistas que son: MARS, RC6, Rijndael, Serpent, y Twofish, se espera que el candidato elegido se tenga a mediados del año 2000.
Las principales características que se pide a AES son que al menos sea tan seguro y rápido como TDES, es decir, que al menos evite los ataques conocidos. Además de que pueda ser implementado en una gran parte de aplicaciones. Una vez designado AES este podrá ser usado tanto como cifrador de bloques (block cipher), como cifrador de lluvia (stream cipher), como función resumen (hash function), y en el generador de números seudoaleatorios.

Los cifradores de lluvia o stream ciphers, son usados donde se cuanta con un ancho de banda restringido (el número de bits que se transmiten a la vez), además de que se requiere independencia en los bloques transmitidos, entonces la mejor opción es cifrar bit por bit o byte por byte, este tipo de cifradores tiene la característica además de ser muy rápido. Los algoritmos más conocidos de este tipo están RC-4, SEAL [66] y WAKE.


Entre los ataques más potentes a la criptografía simétrica están el criptoanálisis diferencial [12] y lineal [28], sin embargo no han podido ser muy eficientes en la práctica por lo tanto, por el momento después de que un sistema criptografíco es publicado y se muestra inmune a estos dos tipos de ataques (y algunos otros más) la mayor preocupación es la longitud de las claves [26].




Funciones Hash



Una herramienta fundamental en la criptografía son las funciones hash [60], son usadas principalmente para resolver el problema de la integridad de los mensajes, así como la autenticidad de mensajes y de su origen.

Una función hash es también ampliamente usada para la firma digital, ya que los documentos a firmar pueden ser en general demasiado grandes la función hash les asocia una cadena de longitud 160 bits que son mas manejables para el propósito de firma digital.







De forma gráfica la función hash efectúa lo siguiente:































Esto es, un mensaje de longitud arbitraria lo transforma de forma “única” a un mensaje de longitud constante.


¿Cómo hace esto?

La idea general es la siguiente:

La función hash toma como entrada una cadena de longitud arbitraria, digamos 5259 bits,
luego divide este mensaje en pedazos iguales, digamos de 160bits, como en este caso y en general el mensaje original no será un múltiplo de 160, entonces para completar un número entero de pedazos de 160 bits al último se le agrega un relleno, digamos de puros ceros. En nuestro caso en 5259 caben 32 pedazos de 160 bits y sobran 139, entonces se agregaran 21 ceros más.

Entonces el mensaje toma la forma x=x1, x2, x3,…,xt donde cada xi tiene igual longitud (160bits por ejemplo).

Posteriormente se asocia un valor constante a un vector de inicialización IV, y se efectúan las siguientes interacciones




donde f es una función que combina a dos cadenas de bits de longitud igual y fija, y g es una función de salida.

De alguna forma lo que se hace es tomar el mensaje partirlo en pedazos de longitud constante y combinar de alguna forma pedazo por pedazo hasta obtener un solo mensaje de longitud fija como muestra la figura siguiente:






Las funciones hash (o primitivas hash) pueden operar como: MDC (Modification Detection Codes) ó MAC (Message Authentication Codes) [57][64].


Los MDC sirven para resolver el problema de la integridad de la información, al mensaje se le aplica un MDC (una función hash) y se manda junto con el propio mensaje, al recibirlo el receptor aplica la función hash al mensaje y comprueba que sea igual al hash que se envió antes.
Los MDCs son usados principalmente para resolver el problema de la integridad y lo hacen tomando el razonamiento siguiente:

Se aplica un hash h(M) al mensaje M y se envía con el mensaje, cuando se recibe (M, h(m)) se le aplica una vez más el hash (que es público a M) obteniendo h’(m), si h(M)=h’(M), entonces se puede aceptar que el mensaje se a transmitido sin alteración


Los MAC sirven para autenticar el origen de los mensajes (junto con la integridad), un MAC es un mensaje junto con una clave simétrica que se les aplica un hash y se manda, al llegar la autenticidad del origen del mensaje se demuestra si la clave del receptor corresponde a la que se creo en el origen del mensaje.
Los MACs son usados para resolver el problema de autenticar el origen del mensaje y tienes el argumento siguiente:

Se combina el mensaje M con una clave privada K y se les aplica un hash h(M,K), si al llegar a su destino h(M, K) se comprueba de integridad de la clave privada K, entonces se demuestra que el origen es solo el que tiene la misma clave K, probando así la autenticidad del origen del mensaje.


Las propiedades que deben de tener las primitivas hash son:

1) Resistencia a la preimagen: significa que dada cualquier imagen y, es computacionalmente imposible encontrar un mensaje x, tal que h(x)=y. Otra forma como se conoce esta propiedad es que h sea de un solo sentido.
2) Resistencia a una 2° preimagen: significa que dado x, es computacionalmente imposible encontrar una x’ tal que h(x)=h(x’). Otra forma de conocer esta propiedad es que h sea resistente a una colisión suave.
3) Resistencia a colisión: significa que es computacionalmente imposible encontrar dos diferentes mensajes x, x’ tal que h(x)=h(x’). Esta propiedad también se conoce como resistencia a colisión fuerte.


Para ilustrar la necesidad de estas propiedades veamos los siguientes ejemplos:

Consideremos un esquema de firma digital con apéndice, entonces la firma se aplica a h(x), en este caso h debe ser un MDC con resistencia a una 2° preimagen, ya que de lo contrario un atacante C que conozca la firma sobre h(x), puede encontrar otro mensaje x’ tal que h(x) = h(x’) y reclamar que la firma es del documento x’.

Si el atacante C puede hacer que el usuario firme un mensaje, entonces el atacante puede encontrar una colisión (x, x’) (en lugar de lo más difícil que es encontrar una segunda preimagen de x) y hacer firmar al usuario a x diciendo que firmo x’. En este caso es necesaria la propiedad de resistencia a colisión.

Por último si (e,n) es la clave pública RSA de A, C puede elegir aleatoriamente un y y calcular z = y^e mod n, y reclamar que y es la firma de z, si C puede encontrar una preimagen x tal que z = h(x), donde x es importante para A. Esto es evitable si h es resistente a preimagen.

Las funciones hash más conocidas son las siguientes: las que se crean a partir de un block cipher como DES [29], MD5 [62], SHA-1, y RIPEMD [65].
Actualmente se ha podido encontrar debilidades en las funciones hash que tienen como salida una cadena de 128 bits, por lo que se ha recomendado usar salidas de 160bits. Así mismo se han encontrado ataques a MD5 y SHA-0 (antecesora de SHA-1), esto ha dado lugar que se dirija la atención sobre la función has RIPEMD.

1 comentario:

Santiago Bernal dijo...

interesante articulo , llegue de por casualidad a su blog,

aunque me dio pereza leer todo eso, nos vemos ps