Hola tanto tiempo gente!! vengo a hacer una intro didactica a temas de criptografia para empezar con el pie derecho el 2012..
Hice un mini programa en C que si le pasas un parametro en argv[1] te lo pasa a DES con la función crypt de UNIX...
Pero a los que recien se meten en el mundo de la criptografia..se preguntaran que es todo esto??
bien empezamos con lo basico,
Encriptar (cifrar) es básicamente aplicar una función matematica o un algoritmo de programacion a un conjunto de bits (ya sea un archivo o una cadena de caracteres) para provocar una salida ilegible
Desencriptar (Descifrar) es hacer el proceso inverso para obtener una funcion 'f tal que f = 'f y por lo tanto validar la autentificación si es el caso.
Criptoanalisis: se trata de apartir de un texto cifrado obtener un texto legible, mediante tecnicas dependiendo si es criptografia antigua o moderna , teniendo asi la busqueda de patrones y el clasico analisis de frecuencias (en el cual buscas la frecuencia de una letra en un mensaje dependiendo la frecuencia en la que aparece en el mensaje y en el idioma se puede predecir si es una a o una i o lo que sea , para esto es muy bueno una herramienta para windows llamada cryptool, con cifrados clasicos como rot-13 (cesar) los cifrados hebraicos vignere polimorficos ,etc.
Ataques
Para las mas modernas se tiene las tecnicas de
ataque de cumpleaños para las funciones de resumen o hash (en las cuales un mismo documento genera un hash el cual es one-way , o sea es irreversible y genera una cadena de longitud constante),el ataque de cumpleaños se basa en basicamente en la llamada paradoja del cumpleaños la cual se deprende de que si generas en un hash de 128 bits para obtener una colision del mismo necesitarias 2^128 o mejor 2^(1*128/2) o sea 2^64 lo cual sigue siendo mucho , pero imaginen por ejemplo un hash de 40 bits como lo es el de algunos sistemas de DVD entonces necesitarias una fuerza bruta de 2^20 para obtener una colision que seria otro hash igual con un mensaje distinto lo cual lo hace muy favorable para un ataque por la debilidad del cifrado.
Otro ataque interesante es utilizar las tablas rainbow que son tablas de hashes precomputados los cuales se comparan con el original, lo cual termina siendo un ataque de diccionario pero se agilizan los tiempos y se obtienen mejores resultados de performance para los ataques.
Sin embargo el hecho de la seguridad en los hashes ha sido puesta en duda por un par de matematicos chinos que han logrado romper los hashes MD5 crudo y sha-1 (Secure hash Algorithm de 160 bits en adelante) demostrando que ya no son utiles estos algoritmos, y por lo tanto abre una brecha enorme de seguridad en la web.
El md5 es casi el standard en algunos casos, y la solución seria implementar un propio algorimo que sea lo suficientemente rapido para este proposito, uno de los grandes de la Criptografia Moderna y padre del algoritmo blowfish y Two Fish, ademas autor de varios libros como Practical Cryptography o el libro rojo de la criptografia (Applied Cryptography) el cual tiene una verson en creative commons si mal no recuerdo.
Bruce Schneider esta trabajando para la creación de un nuevo standard para funciones hash.
Sino mas practico combinar varios algoritmos de hash o sea hasear una palabra 2 veces
h(md5)+h(sha-1)
DES (Data Encryption Standard) es uno de los algoritmos del que mas se ha escrito asi que no me voy a meter a hablar del propio algoritmo de iteracion de bloques ni nada de eso.. lo que se puede agregar a modo de introduccion es que es un cifrado de bloque de bits el cual lo ideal es implementarlo uno mismo para aprender, volviendo a lo anterior el problema de este algoritmo es la longitud de 56 bits lo cual en la practica se puede romper en poco tiempo con las computadoras actuales, el cual es ideal para esto el software John the ripper por ejemplo, eligiendo el charset adecuado para ataques de fuerza bruta
DES ya habia sido roto por el equipo diffie-helman alla por 1977, teoricamente aunque en la practica se construyo una computadora con la unica finalidad de romper este algoritmo a finales del siglo XX por lo cual se cambio el standard al AES (o sea el llamado algoritmo rinjdael en honor a las siglas de los que lo inventaron) y es un estandard actual.
En C de UNIX al igual que en Python existe la función crypt para hacer esta encriptacion que varia segun la salt que le pongas , siendo la salt el modificador para que cambie hasta 4096 veces la clave segun las combinaciones que se den, el problema que tiene esta función es que utiliza (si no se cambia) el algoritmo de encriptacion DES el llamado Data Encryption Standard, que es debil a un ataque de fuerza bruta (existen otros tipos de ataques teoricos como el criptoanalis diferencial y el criptoanalisis lineal pero parten de tener parte de la informacion conocida en texto plano (asi que en la practica es poco viable)
Dicho todo esto los códigos..
Acá el código en C:
Lenguaje C
/*
* Para compilar: gcc -lcrypt DES -o DES
* Para ejecutar ./DES <PASSWORD_A_CIFRAR>
*/
#include <stdio.h>
#include <unistd.h> //libreria de constantes simbolicas
#define _XOPEN_SOURCE
int main (int argc, char* argv[]) {
char *password; //puntero al string password (retorna la direccion del argumento value)
printf("El password en DES es: %snn", crypt (argv[1], "$6$"); // el parametro $6$ es un modificador "salt" de la funcion crypt()
return 0;
}
Para mas información:
Aca el código en python:
Lenguaje PYTHON
#!/usr/bin/env python
# coding utf-8
import getpass
import crypt
semilla = 'sl'
pass_unix = getpass.getpass()
def login_user(semilla,pass_unix:(
return crypt.crypt(semilla,pass_unix)
print login_user(semilla,pass_unix)
recomendación a modo anecdotario..
no usar DES, usar blowfish u otro mas seguro que ademas, esta disponible en suse por ejemplo.
Para mas información de crypt en python:
http://docs.python.org/library/crypt.html
Saludos