jueves, 22 de octubre de 2015

FUNCION HASH

Una función hash es método para generar claves o llaves que representen de manera casi unívoca a un documento o conjunto de datos. Es una operación matemática que se realiza sobre este conjunto de datos de cualquier longitud, y su salida es una huella digital, de tamaño fijo e independiente de la dimensión del documento original. El contenido es ilegible.

Es posible que existan huellas digitales iguales para objetos diferentes, porque una función hash, en el caso del SHA-1 tiene 160bits, y los posibles objetos a resumir no tienen un tamaño límite.
A partir de un hash o huella digital, no podemos recuperar el conjunto de datos originales. Los más conocidos son el MD5 y el SHA-1. Cifrar una huella digital se conoce como firma digital.

Requisitos que deben cumplir las funciones hash:
  • Imposibilidad de obtener el texto original a partir de la huella digital.
  • Imposibilidad de encontrar un conjunto de datos diferentes que tengan la misma huella digital (aunque como hemos visto anteriormente es posible que este requisito no se cumpla).
  • Poder transformar un texto de longitud variable en una huella de tamaño fijo (como el SHA-1 que es de 160bits).
  • Facilidad de empleo e implementación.

Ejemplos de funciones Hash

MD5
Es una función hash de 128 bits. Como todas las funciones hash, toma unos determinados tamaños a la entrada, y salen con una longitud fija (128bits).
El algoritmo MD5 no sirve para cifrar un mensaje. La información original no se puede recuperar ya que hay pérdida de datos. MD5 es usado para firmas digitales

SHA-1
Es parecido al famoso MD5, pero tiene un bloque de 160bits en lugar de los 128bits del MD5. La función de compresión es más compleja que la función de MD5. SHA-1 es más lento que MD5 porque el número de pasos son de 80 (64 en MD5) y porque tiene mayor longitud que MD5 (160bits contra 128bits). Lo que convierte a SHA-1 más robusto y seguro, totalmente apto para VPN’s por ejemplo.

SHA-2
Las principales diferencias con SHA-1 radica en en su diseño y que los rangos de salida han sido incrementados y podemos encontrar:
SHA-224, SHA-256, SHA-384, y SHA-512
El más seguro, es el que mayor salida de bits tiene, el SHA-512, que tiene 80 rondas (pasos), como el SHA-1 pero se diferencia de éste en:
  • Tamaño de salida 512 por los 160 de SHA-1.
  • Tamaño del bloque, tamaño de la palabra y tamaño interno que es el doble que SHA-1.


Como ocurre con todos los cifrados y hash, cuanto más seguro, más lento su procesamiento y uso, debemos encontrar un equilibrio entre seguridad y velocidad.


Whitfield Diffie y Martin Hellman

El algoritmo de Diffie-Hellman (en honor a sus creadores, Whitfield Diffie y Martin Hellman) permite acordar una clave secreta entre dos máquinas, a través de un canal inseguro y enviando únicamente dos mensajes. La clave secreta resultante no puede ser descubierta por un atacante, aunque éste obtenga los dos mensajes enviados por el protocolo. La principal aplicación de este protocolo es acordar una clave simétrica con la que posteriormente cifrar las comunicaciones entre dos máquinas.
El protocolo de Diffie-Hellman fue publicado en 1976. Actualmente se conoce que es vulnerable a ataques de hombre en medio (MitM): un atacante podría situarse entre ambas máquinas y acordar una clave simétrica con cada una de las partes, haciéndose pasar por el host A de cara al host B y viceversa. Una vez establecidas las 2 claves simétricas, el atacante haría de puente entre los 2 hosts, descifrando toda la comunicación y volviéndola a cifrar para enviársela al otro host.
las implementaciones actuales del protocolo Diffie-Hellman utilizan números primos muy grandes, lo que impide a un atacante calcular los valores del mensaje

Desde la antigüedad clásica, y tal vez incluso antes, la gente usa el cifrado para transmitir mensajes secretos. La idea era simple: tengo un método o una clave que se utiliza para "scramble" un mensaje y sólo aquellos que conocen este método o mensaje podría hacer que este mensaje puede leer de nuevo.
El gran problema con este enfoque es que tanto el emisor como el receptor deben conocer la clave de cifrado. Por ejemplo, si yo - yo estoy en SP - quería enviar un mensaje cifrado a mí por el personal de lambda3 RJ ahora, usted tendría que encontrar una manera segura de enviar la clave utilizada para cifrar el texto. ¿Cómo podría enviar esta clave de forma segura? Yo no podía.

Este enfoque se conoce como criptografía de clave simétrica. Para resolver su problema, que comenzó a pensar en un cifrado de clave asimétrica, es decir, con dos o más teclas.

CRIPTOGRAFIA



En la historia hemos tenido multitud de ejemplos de formas de encriptar mensajes como los métodos espartanos de hace 2.500 años, el cifrado de Polybios (de los griegos) o el cifrador del César (de los romanos), y sin olvidarnos de la máquina de encriptación más famosa de la historia: la máquina Enigma. 
En este artículo voy a tratar solamente de la historia de la criptografía y pondré unos ejemplos prácticos, posteriormente me adentraré en los distintos tipos de criptografía moderna y posteriormente su uso.

La escítala espartana (siglo V a. C.)

Los primeros mensajes cifrados que conocemos datan del siglo V antes de Cristo, de procedencia espartana, que ponían en práctica un método simple y rudimentario que consistía en coger una vara (llamada escítala), se le enroscaba una cinta de cuero o papiro y posteriormente se escribía de forma longitudinal (como en la imagen).


Y por último se desenrollaba la cinta, con un puñado de letras sin sentido y se mandaba a través del seur mensajero de turno al trote.
Supuestamente solo se podía desencriptar la información con una vara del mismo diámetro que la original sobre la que se escribió (obviamente si te pones a intentar cuadrar las letras acabas sacando algo en claro, pero en la época no se sabía demasiado leer, tampoco el idioma origen y mucho menos tenían la cultura general necesaria para pensar que la información estaba encriptada).

Uso

El diámetro de la escítala es la clave de este método de encriptación (o simplemente cada cuantos caracteres empieza una vuelta).
Y como clave o diámetro de la escítala (n) tomaremos el número 7, es decir, en cada vuelta de la cinta enroscada en el la vara pondremos 7 caracteres. 
Este es un código de ejemplo de como funcionaria esta encriptación



El cifrador de Polybios (siglo II a. C.) 

Este sistema es el primer cifrado por sustitución de caracteres. Se atribuye la invención a el historiador griego Polybios y el sistema de cifrado consiste en sustituir un carácter por el numero o letra de una columna o fila



Hola = bcca
Nota: tenemos que tener en cuenta que en este método se sustituye la letra “J“ por la “I“.  
Ese es un ejemplo en código para encriptar y desencriptar el sistema griego 

var let='abcdefghiklmnopqrstuvwxyz' 
var tra='ABCDE' 
//función de encriptación 
function polybios_enc(txt){ 
 //Comprobamos que el texto es válido 
 var pat=/^[0-9A-z\s]*$/ 
 if(!pat.test(txt)) return 'Texto no válido' 
 //Lo pasamos a minúsculas y convertimos la "j" en "i" (como requiere el método) 
 var txt=txt.toLowerCase().replace('j','i') 
 var r='' 
 for(var a=0;a<txt.length;a++){ 
  //Comprobamos si el carácter es un espacio 
  if(txt.charAt(a)!=' '){ 
   //Buscamos la posición del carácter en el abecedario 
   var l=txt.charAt(a) 
    l=let.indexOf(l) 
   //Comprobamos la posición de la fila y columna 
   var c1=Math.floor(l/let.length*tra.length) 
   var c2=Math.round(((l/let.length*tra.length)*tra.length)-(c1*tra.length)) 
   //Añadimos la letra correspondiente a la fila y columna 
   r+=tra.charAt(c1)+tra.charAt(c2) 
  }else{ 
   r+=' ' 
  } 
 } 
 return r 
} 
//función de desencriptación 
function polybios_dec(txt){ 
 var pat=/^[ABCDE\s]*$/ 
 if(!pat.test(txt)) return 'Texto no válido' 
 var t=txt,r='',c 
 while(t.length>0){ 
  if(t.substr(0,1)==' '){ 
   r+=' ' 
   c=1 
  } 
  else{ 
   var s=t.substr(0,2).split('') 
   r+=let.charAt((tra.indexOf(s[0])*tra.length)+tra.indexOf(s[1])) 
   c=2 
  } 
  t=t.substr(c,t.length-c) 
 } 
 return r 
}

El cifrador del César (siglo I a. C.)

Los romanos hace 2100 años idearon su propio sistema de enscriptación (a la altura de los anteriores) que consistía en sustituir cada letra por otro que es el resultado de desplazar tres posiciones hacia la derecha desde el carácter origen en el abecedario (con la imagen de abajo se entenderá a la perfección).



Esta técnica se podría mejorar cambiando el abecedario “desplazado” por uno aleatorio, por ejemplo, pero el método en principio es desplazando tres caracteres a la derecha (y para desencriptarlo hacerlo al contrario, a la izquierda).
Nota: este sistema puede admitir también los espacios, que se añadirán como un carácter más o de no usarse se omitirán.

Anexo otro ejemplo en código del sistema de enscriptación del César, que admite distinto número de desplazamiento (n), sea positivo o negativo (si lo encriptamos con n=3 debemos de desencriptarlo con n=-3).

function cesar(txt,n,space){ 
 //Comprobamos que el texto es válido 
 var pat=/^[0-9A-z\s]*$/ 
 if(!pat.test(txt)) return 'Texto no válido' 
 //Adaptamos el texto según si admitimos espacios 
 var let='abcdefghijklmnopqrstuvwxyz'+(space?' ':'') 
 var txt=txt.toLowerCase() 
 if(!space) for(var a=0;a<txt.length;a++) txt=txt.replace(' ','') 
 //Ajustamos el desplazamiento de "n" 
 var n=n%let.length,r='' 
  n=n<0?let.length+n:n 
 for(var a=0;a<txt.length;a++){ 
  //Desplazamos el abecedario 
  l=let.charAt((let.indexOf(txt.charAt(a))+n)%let.length) 
  r+=l.length==0?' ':l 
 } 
 return r 
}