Encriptación por SHA y por MD5



La familia SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es un sistema de funciones hash criptográficas relacionadas de la Agencia de Seguridad Nacional de los Estados Unidos y publicadas por el National Institute of Standards and Technology (NIST). El primer miembro de la familia fue publicado en 1993 es oficialmente llamado SHA. Sin embargo, hoy día, no oficialmente se le llama SHA-0 para evitar confusiones con sus sucesores. Dos años más tarde el primer sucesor de SHA fue publicado con el nombre de SHA-1.
Existen cuatro variantes más que se han publicado desde entonces cuyas
diferencias se basan en un diseño algo modificado y rangos de salida
incrementados: SHA-224, SHA-256, SHA-384, y SHA-512 (todos ellos son referidos como SHA-2).

En 1998,
un ataque a SHA-0 fue encontrado pero no fue reconocido para SHA-1, se
desconoce si fue la NSA quien lo descubrió pero aumentó la seguridad
del SHA-1.SHA-1 ha sido examinado muy de cerca por la comunidad
criptográfica pública, y no se ha encontrado ningún ataque efectivo. No
obstante, en el año 2004, un número de ataques significativos fueron divulgados sobre funciones criptográficas de hash con una estructura similar a SHA-1; esto ha planteado dudas sobre la seguridad a largo plazo de SHA-1.


SHA-0 y SHA-1 producen una salida resumen de 160 bits de un mensaje que puede tener un tamaño máximo de 264 bits, y se basa en principios similares a los usados por el profesor Ronald L. Rivest del MIT en el diseño de los a
lgoritmos de resumen del mensajeMD4 y MD5.
AUNQUE!!:

Hace unos años investigadores chinos habían logrado reducir la complejidad del algoritmo SHA-1 a 2^69, es decir, habían logrado reducir su complejidad en 2^11 en relación con el ataque de cumpleaños de 2^80, dicho de otro modo, Shandong, Wang, Yin y Yu, durante la "Cripto Conference" de 2004, demostraron que habían debilitado el SHA-1 en un factor de 2048, lo que no es poco.
Ahora, según he podido leer en un boletín de Hispasec, unos investigadores australianoshan logrado reducir su complejidad a 2^52, lo que es un logro impresionante, puesto que por cada unidad en la que se reduce el exponente, se reduce la fortaleza del algoritmo en un 50%. Dicho de otro modo, a fecha de hoy podemos decir que el algoritmo SHA-1 se ha debilitado en más de un 99% en relación con su fortaleza inicial derivada del ataque de cumpleaños, lo que es muy significativo, aunque nos parezca que 2^52 es una cifra suficientemente grande...
Si ya en el 2004/2005 se aconsejaba abandonar el SHA-1, con este nuevo avance logrado por los australianos, su sustitución por otros algoritmos más resistentes se hace indispensable. Una posible solución, hasta que se publique el SHA-3, es decir, el algoritmo que está llamado a sustituirlo, sería usar dos algoritmos consecutivos, por ejemplo SHA-1 Y RIPEMD-160, puesto que una colisión en SHA-1 es virtualmente imposible que coincida también en RIPEMD-160. Esta solución de la firma múltiple tiene como ventajas que usa algoritmos disponibles en sistemas criptográficos de todo tipo y no implica un excesiva computación.
Hay que señalar, que los documentos que hayamos firmado usando SHA-1 y que deban tener vigor en el tiempo, puede que no sean seguros dentro de unos meses. Como norma general, deberíamos usar algoritmos criptográficos que estimemos que vayan a ser seguros en un tiempo equivalente a la esperanza de vida de la persona que los utiliza y un 50% más.
Una caída del estándar SHA-1 también afectaría a la seguridad de los certificados digitales, puesto que sería factible generar certificados con el mismo fingerprint que otros, lo que permitiría suplantar la personalidad de personas, o de páginas web.
Hay que señalar, que el e-DNI se han establecido mecanismos que permiten construir el "PAHT" de Certificación (Cadena de Confianza) utilizando SHA-1 o SHA-256, para dar soporte a aquellos sistemas operativos que no contemplan el uso de SHA-256 como algoritmo de "hash" o resumen. Desgraciadamente, este mecanismo que depende del sistema operativo que estamos usando, es transparente al usuario la mayoría de las veces, siendo complicado saber la forma en la que se establece el "path" de confianza, sin embargo el e-DNI siempre usa el inseguro SHA-1 para firmar los documentos, según aparece en la página web oficialdel mismo.
También hay que tener en cuenta, que las claves de los e-DNI de los usuarios están firmadas usando SHA-1, lo que puede ser un problema de seguridad a medio y largo plazo y con independencia de la validez en el futuro de los documentos que firmemos, o que hayamos firmado anteriormente, usando el omnipresente algoritmo SHA-1. Sin embargo, las claves raíz y subordinadas del e-DNI, con una vida de 30 y 15 años respectivamente, están firmadas usando SHA-1 y SHA-256, por lo que las podemos considerar seguras en este momento.
Ni que decir que ya he configurado mi GPG para que use la función SHA-256 en la firma de documentos y correos electrónicos, aunque también es cierto que en los correos uso siempre firma doble, GPG y de la FNMT, para que no haya problemas.

 fuentes:
Ahora el MD5
MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad.
A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash, plantea una serie de dudas acerca de su uso futuro.
§  Terminologías y notaciones
En este documento "palabra" es una entidad de 32 bits y un byte es una entidad de 8 bits. Una secuencia de bytes puede ser interpretada de manera natural como una secuencia de bits, donde cada grupo consecutivo de ocho bits se interpreta como un byte con el bit más significativo al principio. Similarmente, una secuencia de bytes puede ser interpretada como una secuencia de 32 bits (palabra), donde cada grupo consecutivo de cuatro bytes se interpreta como una palabra en la que el byte menos significativo está al principio.
   El símbolo "+" significa suma de palabras.
   X <<< s se interpreta por un desplazamiento a la izquierda 's' posiciones
   not(x) se entiende como el complemento de x
§  Descripción del algoritmo md5
Empezamos suponiendo que tenemos un mensaje de 'b' bits de entrada, y que nos gustaría encontrar su resumen. Aquí 'b' es un valor arbitrario entero no negativo, pero puede ser cero, no tiene por qué ser múltiplo de ocho, y puede ser muy largo. Imaginemos los bits del mensaje escritos así:
  m0 m1 ... m{b-1}
Los siguientes cinco pasos son efectuados para calcular el resumen del mensaje.

Paso 1. Adición de bits

El mensaje será extendido hasta que su longitud en bits sea congruente con 448, módulo 512. Esto es, si se le resta 448 a la longitud del mensaje tras este paso, se obtiene un múltiplo de 512. Esta extensión se realiza siempre, incluso si la longitud del mensaje es ya congruente con 448, módulo 512.
La extensión se realiza como sigue: un solo bit "1" se añade al mensaje, y después se añaden bits "0" hasta que la longitud en bits del mensaje extendido se haga congruente con 448, módulo 512. En todos los mensajes se añade al menos un bit y como máximo 512.

Paso 2. Longitud del mensaje

Un entero de 64 bits que represente la longitud 'b' del mensaje (longitud antes de añadir los bits) se concatena al resultado del paso anterior. En el supuesto no deseado de que 'b' sea mayor que 2^64, entonces sólo los 64 bits de menor peso de 'b' se usarán.
En este punto el mensaje resultante (después de rellenar con los bits y con 'b') se tiene una longitud que es un múltiplo exacto de 512 bits. A su vez, la longitud del mensaje es múltiplo de 16 palabras (32 bits por palabra). Con M[0 ... N-1] denotaremos las palabras del mensaje resultante, donde N es múltiplo de 16.

Paso 3. Inicializar el búfer MD

Un búfer de cuatro palabras (A, B, C, D) se usa para calcular el resumen del mensaje. Aquí cada una de las letras A, B, C, D representa un registro de 32 bits. Estos registros se inicializan con los siguientes valores hexadecimales, los bits de menor peso primero:

  palabra A: 01 23 45 67
  palabra B: 89 ab cd ef
  palabra C: fe dc ba 98
  palabra D: 76 54 32 10
fuente: