[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Generar numeros aleatorios con gcc



Bueno, esto no es portable :( Y por otro lado, hay algunos problemas.

El primero, es que el sistema podría poner a dormir el programa
si no hay suficientes bytes de calidad. Para algunas aplicaciones esto
no es viable. Si no se requieren bytes de tanta calidad, mejor sería
usar /dev/urandom.

En todo caso, si quieres usar /dev/random, toca verificar el
número de bytes que retorna la llamada read, en caso de que la
lectura sea incompleta (algo que puede pasar justo antes de un
EOF).

void linux_rand( BYTE * cadenarnd){

  int fd;

  fd=open("/dev/random",O_RDONLY);
  if (!fd)
    return;

  read(fd,cadenarnd,RND_LEN);
  close (fd);
}

Creo que si me tocara leer de /dev/random, escribiría algo como:

#include <stdio.h>
#include <stdlib.h>

static FILE *rndf = 0;

void
linux_rand(char *buff, size_t size)
{
 int nread;

 if (!rndf)
 {
   rndf = fopen("/dev/random", "r");

   #if 0 /* Dev urandom no se bloquea si se acaban los bytes de calidad */
   rndf = fopen("/dev/urandom", "r");
   #endif

   if (!rndf)
     perror("fopen"), exit(EXIT_FAILURE);
 }

 while (size > 0)
 {
   nread = fread(buff, 1, size, rndf);

   if (!nread)
   {
     if (feof(rndf))
       fprintf(stderr, "EOF in /dev/random\n"); /* Nunca pasa? */
     else
       perror("fread");

     exit(EXIT_FAILURE);
   }

   size = size - nread;
   buff = buff + nread;
 }
}

#define SIZE 1024

int
main(int argc, char *argv[])
{
 char buff[SIZE];
 int i;

 linux_rand(buff, SIZE);

 for (i = 0; i < SIZE; ++i)
   printf("buff[i] = %d\n", buff[i]);

 return EXIT_SUCCESS;
}


Si el programa se duerme, toca mover el ratón :) O hacer cosas que
alimenten al "entropy pool".

Me corrigen si hay un error.

Atte,
Nelson.-

--
http://arhuaco.org/



Reply to: