Hoy no me podía acostar sin programar algo.
Criptografia
No pude dormir anoche, hoy es mi cumpleaños que pase trabajando, pero hoy también es día del programador -el dia 256 de cada año, siempre cae en mi cumpleaños salvo los años bisiestos- asi que tengo que programar.
Asi que tengo hasta las 11:59pm para escribir un programa pequeño que no sea basura (puede serlo, pero tiene que ser basura interesante) así que inicio (hora 11:23pm).
Ok. 11:56pm y este es el resultado:
/* Sencillo y Pequenio generador de claves de calidad usando Numeros
* PseudoAleatorios para GNU/Linux.
*
* Se usan "SystemCalls" por puro gusto.
*
* Rapidamente:
* Los enteros en una arquitectura basada en X86 suelen ser de 4 bytes (con
* un compilador decente ejem. gcc, icc).
* Un char tiene un tamaño de 1 byte.
*
* 0 stdin
* 1 stdout
* 2 stderr
*
* Alberto Rodriguez Sanchez (aka Vendaval)
* 13/09/2009
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define RNDFILE "/dev/random"
#define ENTROPYA "/proc/sys/kernel/random/entropy_avail"
#define BUFFSIZE 4096
#define RETSIZE 64
int main(int argc,char **argv){
unsigned char buff[BUFFSIZE],select;
int frandom, fentropy, count=RETSIZE-1;
unsigned jump;
if((fentropy=open(ENTROPYA,O_RDONLY))==-1){
perror(">>");
exit(-1);
}
if((read(fentropy,buff,BUFFSIZE))==-1){
perror(">>");
exit(-2);
}
printf("La Entropia del sistema varia alrededor de %d",atoi(buff));
printf("\nEl valor sugerido es ~2000 o mas\n");
close(fentropy); //cerrando archivo entropy_avail
if((frandom=open(RNDFILE,O_RDONLY))==-1){
perror(">>");
exit(-3);
}
if((read(frandom,buff,BUFFSIZE))==-1){
perror(">>");
exit(-4);
}
close(frandom);
srand((uint) time(NULL)); //Semilla de rand() segun hora UNIX(R)
while(count--){
jump=rand()%(BUFFSIZE-1);
select=rand()%256;
printf("%02X",(buff[jump] | select));
}
write(1,"'\n'",1);
return 0;
}
Noten que el programa tarda en ejecutarse una segunda vez, ademas de que la entropia baja dramaticamente, la razon es que /dev/random es bloqueado cuando se vacia la fuente de entropia, entonces no es accesible mietras se recoge mas ruido de uestro sistema. /dev/urandom no tiene esta cualidad por lo que se puede hacer uso intensivo del dispositivo a costa de perder algo de seguridad.
El asunto de la entropia es delicado cuando juegas con criptografia, a nivel militar se usa hardware generador o números verdaderamente aleatorios como los provenientes del ruido atmosferico. Mas cercano a los simples mortales es usar herramientas que ayuden a generar mayor entropia en el sistema como por ejemplo: rng-tools.
apt-get install rng-tools- Edita
/etc/default/rng-tools - Agrega/cambia
HRNGDEVICE=/dev/urandom - corre
/etc/init.d/rng-tools start
Debe dar algo entre 1500 y 4000 en "/proc/sys/kernel/random/entropy_avail" que es un rango de valores mas apriado cuando tus aplicaciones usan TSL(SSL).
El programa no es lo mejor que se pueda hacer, por ejemplo podria -facilmente- recibir argumentos desde la linea de comandos para ajustar la longitud de la clave, pero otro dia sera, solo queria irme a la cama con la conciencia tranquila.
Permalink: http://www.mononeurona.org/entries/view/vendaval/1902
Commentblogs:









