Ir al contenido



Foto

Generar datos aleatorios


  • Por favor identifícate para responder
1 respuesta en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.249 mensajes
  • LocationEspaña

Escrito 20 junio 2012 - 03:34

Este es un sencillo programa que genera caracteres aleatorios (o todo lo aleatorios que pueden ser usando Random), y los envía a salida estándar. Se puede usar para generar contraseñas, crear ficheros con contenido aleatorio o cualquier otro uso que se nos ocurra, solo hay que pensar en como se utiliza en linux el dispositivo /dev/urandom.

El código (es una aplicación de consola)


delphi
  1. program genrandom;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   Windows, SysUtils;
  7.  
  8. Const
  9.   BUFFERSIZE = 4 * 1024;
  10.  
  11. procedure WriteError(Str: AnsiString);
  12. begin
  13.   FileWrite(GetStdHandle(STD_ERROR_HANDLE), PAnsiChar(Str)^, Length(Str));
  14. end;
  15.  
  16. function Min(i,j: int64): int64;
  17. begin
  18.   if i<j then
  19.     Result:= i
  20.   else
  21.     Result:= j;
  22. end;
  23.  
  24. var
  25.   i: Integer;
  26.   l, j, k: int64;
  27.   b: Byte;
  28.   Buffer: PByteArray;
  29.   Output: THandle;
  30. begin
  31.   l:= -1;
  32.   // Si le pasamos el tamaño como parametro
  33.   try
  34.     if ParamCount > 0  then
  35.     begin
  36.       l:= 1;
  37.       // El tamaño es el resultado de multiplicar todos los parametros
  38.       for i:= 1 to ParamCount do
  39.         l:= l * StrToInt(ParamStr(i));
  40.     end;
  41.   except
  42.     // Si un parametro nos es valido mostramos el error
  43.     On E: Exception do
  44.     begin
  45.       WriteError(E.Message);
  46.       Halt;
  47.     end;
  48.   end;
  49.   Randomize;
  50.   // Reservamos memoria para el buffer
  51.   GetMem(Buffer,BUFFERSIZE);
  52.   try
  53.     // Obtenemos el handle de la salida
  54.     Output:= GetStdHandle(STD_OUTPUT_HANDLE);
  55.     while l<>0 do
  56.     begin
  57.       j:= 0;
  58.       // Si le pasamos un tamaño lo usamos
  59.       if l > 0 then
  60.         k:= Min(l,BUFFERSIZE)
  61.       else
  62.         // ... de lo contrario usamos todo el buffer
  63.         k:= BUFFERSIZE;
  64.       // Rellenamos el buffer
  65.       while j < k do
  66.       begin
  67.         b:= Byte(Random(256));
  68.         // Solo usamos estos caracteres
  69.         if AnsiChar(b) in ['A'..'Z','a'..'z','0'..'1','$','#','!'] then
  70.         begin
  71.           Buffer[j]:= b;
  72.           inc(j);
  73.         end;
  74.       end;
  75.       // Escribimos el buffer
  76.       if j > 0 then
  77.         FileWrite(Output,Buffer^,j);
  78.       // Restamos del tamaño lo que llevamos escrito
  79.       if l > 0 then
  80.         dec(l,j);
  81.     end;
  82.   finally
  83.     // Liberamos la memoria reservada para el buffer
  84.     FreeMem(Buffer);
  85.   end;
  86. end.



Posibles usos:

Generar una contraseña de 6 caracteres:


delphi
  1. genramdom 6



Crear un archivo de 4Kb:


delphi
  1. genrandom 4 1024 1024 > archivo.txt



Si lo ejecutas sin parámetros tu pantalla parecerá la de un hacker  :D


delphi
  1. genrandom



Si lo combinamos con ncat  tendremos un bonito servidor de datos aleatorios:


delphi
  1. ncat -l 5000 -k -e genrandom



... etc

Saludos


Archivos adjuntos


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 junio 2012 - 03:44

Gracias, ya le encontraremos un buen uso. (y)

Saludos
  • 0