Yo también iba a sugerir la OpenSSL libraries. Y también incluye cifrado, SSL, hash, etc.
Indy ha convertido muchos de los encabezados e incluye RAND_screen, pero eso no se puede/no se puede usar, al parecer, en programas sin una IU. Desafortunadamente, se pierde la mayoría de los RAND_ *, pero son muy fáciles de importar y usar.
por ejemplo:
function RAND_load_file(const filename: PAnsiChar; max_bytes: longint): integer; cdecl; external 'libeay32.dll';
function RAND_bytes(buf: PByte; num: integer): integer; cdecl; external 'libeay32.dll';
function RAND_pseudo_bytes(buf: PByte; num: integer): integer; cdecl; external 'libeay32.dll';
a continuación en el código:
RAND_load_file(PAnsiChar(AnsiString('name-of-seed-file')), 512);
//or
//RAND_screen;
...
...
const
PKCS5_SALT_LEN = 8;
var
salt: TBytes;
begin
SetLength(salt, PKCS5_SALT_LEN);
RAND_pseudo_bytes(@salt[0], PKCS5_SALT_LEN);
...
end;
Las mismas cuestiones de semillas como se explica todavía aplican, por supuesto.
Revisa http://blog.synopse.info/post/AES-CSPRNG - es un sólido generador de números pseudoaleatorios criptográficamente seguro basado en AES-256, con mayor seguridad que la caja negra de CryptoAPI (solo utiliza CryptGenRandom como fuente de entropía). –