Algoritmo de Encriptacion SHA1
La
familia SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es un
sistema de funciones hash criptográficas relacionadas de laAgencia
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 llamaSHA-0 para
evitar confusiones con sus sucesores. Dos años más tarde el primer sucesor de
SHA fue publicado con el nombre de SHA1.
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 2<sup>64</sup> bits, y se basa en principios similares a los usados por el profesor Ronald L. Rivest del MIT en el diseño de los algoritmos de resumen del mensaje MD4 y MD5.
La codificación hash vacía para SHA-1 corresponde a:
SHA1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709
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 2<sup>64</sup> bits, y se basa en principios similares a los usados por el profesor Ronald L. Rivest del MIT en el diseño de los algoritmos de resumen del mensaje MD4 y MD5.
La codificación hash vacía para SHA-1 corresponde a:
SHA1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709
Algoritmo
desarrollado por el NIST y publicado como estándar federal para el
procesamiento de la información (FIBS PUB 180); en 1995 se publicó una versión
revisada como FIBS PUB 180-1 conocida como SHA-1.
El
algoritmo toma como entrada mensajes de longitud máxima de 264 bits
que son procesados en bloques de 512 bits; el resultado que produce es de 160
bits. La imagen muestra de manera general el algoritmo.
Algoritmo de encriptación MD5
En criptografía, MD5 (Algoritmo
de Resumen del Mensaje 5) es un algoritmo de reducción criptográfico de 128
bits ampliamente usado. El código MD5 fue diseñado por Ronald Rivest en 1991.
El algoritmo MD5 es una función de cifrado tipo hash que acepta una cadena de texto como entrada, y devuelve un número de 128 bits. Las ventajas de este tipo de algoritmos son la imposibilidad (computacional) de reconstruir la cadena original a partir del resultado, y también la imposibilidad de encontrar dos cadenas de texto que generen el mismo resultado.
Esto nos permite usar el algoritmo para transmitir contraseñas a través de un medio inseguro. Simplemente se cifra la contraseña, y se envía de forma cifrada. En el punto de destino, para comprobar si el password es correcto, se cifra de la misma manera y se comparan las formas cifradas
CODIFICACION Y ALGORITMO DE MD5
La codificación
del MD5 funciona de la siguiente manera; su codificación de 128 bits es
representada típicamente como un número de 32 dígitos hexadecimal.
Un ejemplo a continuación de una codificación de MD5:
En MD5 ("esto si es una prueba de MD5")
Ahora vemos su Hash de salida=e99008846853ff3b725c27315e469fbc
Pero veamos lo complejo que puede llegar a ser, con tan solo cambiar una letra del mensaje original arroja un Hash de salida muy diferente;
En MD5 ("esto no es una prueba de MD5")
Ahora vemos su Hash de salida=dd21d99a468f3bb52a136ef5beef5034
El simple hecho de codificar un espacio vacío también os da como resultado un Hash de salida complejo al igual que los antes vistos;
En MD5 (" ")
Ahora vemos su Hash de salida=d41d8cd98f00b204e9800998ecf8427e
Un ejemplo a continuación de una codificación de MD5:
En MD5 ("esto si es una prueba de MD5")
Ahora vemos su Hash de salida=e99008846853ff3b725c27315e469fbc
Pero veamos lo complejo que puede llegar a ser, con tan solo cambiar una letra del mensaje original arroja un Hash de salida muy diferente;
En MD5 ("esto no es una prueba de MD5")
Ahora vemos su Hash de salida=dd21d99a468f3bb52a136ef5beef5034
El simple hecho de codificar un espacio vacío también os da como resultado un Hash de salida complejo al igual que los antes vistos;
En MD5 (" ")
Ahora vemos su Hash de salida=d41d8cd98f00b204e9800998ecf8427e
ALGORITMO MD5
Se comienza suponiendo que se tiene un mensaje de b bits de longitud, escritos m0, m1,...m(b-1).
El algoritmo tiene cinco pasos.
1. Adición de bits de relleno.
El mensaje es rellenado con n bits, de tal manera que le falte a su longitud 64 bits para ser múltiplo de 512. El primer de los nbits es 1 y el resto son 0.
2. Adición de la longitud.
La nueva longitud es una representación de 64 bits y es añadida en forma de dos palabras de 32 bits, en primer lugar se muestran los bits menos significativos. Si la longitud del mensaje es mayor que 264, se usan los 64 bits menos significativos.
3. Inicializar cuatro bufferes, A,B,C y D, que son registros de 32 bits.
Inicializados con los sigs. Valores
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
4. Procesar el mensaje en bloques de 16 bits (se tendrá una entrada y salida de 32 bits).
F(X,Y,Z) = (X AND Y) OR ((NOT(X)) AND Z)
G(X,Y,Z) = (X AND Z) OR (Y AND (NOT(Z))
H(X,Y,Z) = X XOR Y XOR Z
I(X,Y,Z) = Y XOR (X OR (NOT(Z)))
Se usa una tabla de 64 elementos T[1 ... 64] construida con la función seno, siendo Ti la parte entera de 294967296 * abs(sen(i)) (i en radianes).
5. Salida.
Mensaje producido por A, B, C, D, empezando con los bits menos significativos de A y terminando con los más significativos de D. Independientemente de la longitud del mensaje, su tamaño será de 128 bits.
Algoritmo de encriptación RSA
Interesado en conocer cómo funcionaban a bajo nivel los
sistemas de cifrado con juegos de clave pública/privada, y al no encontrar un
lugar donde se explique de manera terrenal (y no como para doctores en
matemáticas) voy a tratar de escribir este artículo lo más humanamente posible,
empezando desde cero y detallando cada uno de los pasos.
La wiki dice que lo primero que tenemos hacer es buscar (de
manera aleatoria) dos números primos distintos, llamados a partir de acá p y q,
y multiplicarlos entre sí para obtener un nuevo número que llamaremos n.
Para continuar a partir de acá debemos refrescar unos
conceptos de aritmética modular, y la mejor forma que encontré fueron unos
ejemplos que detallo a continuación:
Supongamos que tenemos que sumar o restar algunas horas
apoyándonos en un reloj de agujas, por ejemplo 6 horas más después de las 8. El
reloj claramente marcaría las 2 ya que al pasarnos de las 12, empezamos a
contar de nuevo. Bueno, esto, en principio, sería aritmética modular en
base 12. Y podríamos definir el caso anterior como 8 + 6 mod 12 = 2.
La única diferencia con la aritmética modular es que se
incluye al cero en nuestro universo de números, es por eso que si trabajamos
con base 7, los números representados son {0, 1, 2, 3, 4,
5, 6}.
Con un ejemplo un poco más complicado, si multiplicamos 3 *
5, con base 7 el resultado sería 1 (dos vueltas de reloj más una hora), o sea 3
* 5 mod 7 = 1.
A estas operaciones también las podemos relacionar con el
resto de una división, pudiendo representar esto de la siguiente manera: 15
/ 7 = 2 resto 1.
Algo para resaltar es que, al igual que con los números
reales, si dos números se multiplican entre sí y como resultado dan 1, es que
son inversos. Así como 5 y 1/5 son inversos
porque 5 * (1/5) = 1, 3 y 5son
inversos en módulo 7 ya que 3 * 5 mod 7 = 1.
Debemos mencionar una propiedad que dice que un número x
tiene inversa módulo y si no existe ningún número mayor a 1 y menor que x
e y que los divida en forma exacta. Y a estos números se los llama primos
relativos ya que no existe un divisor común mayor a 1. Por ejemplo 8 y 5
son primos relativos (aunque 8 no sea primo) ya su máximo común divisor es 1.
Seguimos un poco más. Se conoce al número phi como a la
cantidad de números que tienen inversa para un módulo. Si continuamos con
el ejemplo de módulo 7, tenemos que existen 6 números que tienen inversa (del 1
al 6) y de forma genérica se puede decir que si n es número primo, phi(n) es
igual a n – 1.
Entonces, si decimos que n está formado por
dos números primos, phi(n) es igual a (p – 1) * (q –
1)
Vamos a completar este caso con un ejemplo:
p = 3
q = 11
n = p * q = 3 * 11 = 33
phi(n) = 2 * 10 = 20
Generación de las claves
La clave pública será un número aleatorio que sea primo
relativo entre 1 y phi(n) al cual llamaremos e,
y para nuestro caso podemos usar el 7.
A la inversa la llamaremos d y surge, como
ya dijimos, de obtener el número que multiplicado por e nos de1
mod (phi(n)). Mucho me costó entender esta última parte y me quedo más que
claro después de leer varios ejemplos, así que vamos con uno:
Dijimos que:
e = 7 (exponente público)
Entonces, para encontrar d tenemos que
iterar desde 1 hasta 20 (o sea phi(n)) tratando
de ubicar un número tal que multiplicado por 7 nos de 1 en
módulo 20 (o sea phi(n)).
7 * d = 1 mod (20)
7 * 3 = 21
21 mod 20 = 1
d = 3 (exponente privado)
Ahora si tenemos todo como para armar la clave pública y la
clave privada, y ambas se definen de la siguiente manera:
Clave Pública: (n, e) o (33, 7)
Clave Privada: (n,d) o (33, 3)
Cifrar y descifrar:
Para cifrar un mensaje, lo único que debemos hacer es elevar
el dato a e(que dijimos, es el número de la clave pública). El
procedimiento para descifrar un mensaje se apoya en una nueva
propiedad que dice que si multiplicamos un número x por sí mismo phi(n) veces,
el resultado es 1 en módulo n, y en esta propiedad es donde se apoya el
algoritmo RSA.
Con los datos que venimos manejando, supongamos que queremos
cifrar el número 2.
dato = 2
Cifrar:
dato^e mod (n)
2 ^ 7 mod(33) = 128 mod (33) = 29 = datoCifrado
Descifrar:
datoCifrado^d mod(n)
29^3 mod(33) = 24389 mod(33) = 2 = dato

