Un CSPRNG es un generador de números pseudoaleatorios criptográficamente seguro. Calcula valores nuevos a partir de un estado interno secreto siguiendo un procedimiento preciso. «Pseudoaleatorio» no significa de mala calidad: el cálculo es reproducible, pero sin conocer ese estado sus resultados deben ser impredecibles en la práctica. Para ello necesita suficiente entropía, es decir, incertidumbre en la entrada que el atacante desconoce, y una integración correcta en la aplicación.
Imagina un programa que crea valores secretos para una cartera. Un atacante descubre algunos resultados anteriores. Un generador seguro no debe permitir que esa información facilite adivinar los demás. Esto exige más que una distribución de números atractiva en una gráfica. Por eso RFC 4086 distingue las secuencias criptográficamente fuertes de los generadores habituales de simulación. Ni siquiera un buen resultado estadístico basta si se puede adivinar el seed, el valor inicial con el que comenzó la generación. [1]
La documentación técnica también habla de DRBG, un generador determinista de bits aleatorios. «Determinista» significa que el mismo estado y las mismas entradas producen el mismo resultado; por eso el estado debe mantenerse secreto. NIST SP 800-90A Rev. 1 describe mecanismos concretos: Hash_DRBG, HMAC_DRBG y CTR_DRBG. Son procedimientos técnicos, no un sello de calidad para cualquier programa que los mencione. También hay que revisar su configuración, el origen de la entropía y el código que los implementa. [2]
Una filtración del estado plantea dos preguntas distintas. ¿Puede el atacante reconstruir los resultados secretos anteriores? ¿Puede predecir los siguientes? La protección del pasado se llama Backtracking resistance; la del futuro, Prediction resistance. Para esta última, NIST SP 800-90A exige incorporar eficazmente entropía nueva que separe los resultados futuros del estado expuesto. Repetir el cálculo no necesariamente recupera la seguridad. Tener una de estas protecciones tampoco demuestra automáticamente la otra. [2]
Una biblioteca es un componente de software ya preparado que la cartera puede usar, pero una llamada puede fallar. En OpenSSL 3.5, RAND_bytes() y RAND_priv_bytes() devuelven 1 si hay éxito, 0 ante otro fallo y -1 si el método actual no está soportado. Si falla la fuente de entropía, la generación puede rechazarse. El programa debe comprobarlo antes de usar la zona de memoria reservada, llamada búfer. De lo contrario, podría utilizar datos que nunca se generaron de forma segura. [3]
Repetir resultados resulta útil en las pruebas: el desarrollador quiere compararlos con lo esperado. Por eso la función randombytes_buf_deterministic() de libsodium produce la misma secuencia a partir del mismo seed. En funcionamiento normal, una repetición involuntaria es un problema. Una instantánea de una máquina virtual guarda el estado del ordenador, incluida su memoria; al restaurarla, pueden repetirse el estado y la salida del generador. Las copias del entorno, por tanto, no garantizan secretos independientes. [4]
Un generador puede entregar buenos datos aleatorios y la aplicación procesarlos mal. Al convertirlos a un intervalo permitido más pequeño mediante un simple resto de división, algunos resultados pueden volverse más frecuentes que otros. La función randombytes_uniform() de libsodium lo evita seleccionando uniformemente por debajo de un límite superior. Las claves deben respetar, además, las reglas de su algoritmo. La seguridad no termina al obtener bytes aleatorios: también importa qué se hace después con ellos. [4]
Un nonce es un valor destinado a un uso concreto dentro de un procedimiento criptográfico. Sus reglas dependen del protocolo. RFC 8439 exige que no se repita con la misma clave; parecer aleatorio no garantiza que sea único. RFC 6979 describe, en cambio, cómo calcular de forma determinista el valor k necesario para una firma digital a partir de la clave secreta y el mensaje firmado. Son diseños distintos, no una contradicción. «Añadir aleatoriedad a todo» no sustituye al procedimiento correcto. [5] [6]
La etiqueta CSPRNG no demuestra que una cartera utilice correctamente todo el sistema. Una revisión técnica comprueba la versión concreta de la biblioteca, el inicio del generador, el manejo de errores y el comportamiento tras restaurar o copiar su estado. La documentación de OpenSSL y libsodium acredita propiedades de sus funciones, no la seguridad de cualquier aplicación que las llame. También importa lo que ocurre después: un secreto perfectamente generado deja de proteger los fondos si se filtra una copia de seguridad que permite recuperar el acceso. [3] [4]
Para obtener la imagen más completa, lee esta entrada junto con Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. También enlazan con esta entrada Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.