Generador de números pseudoaleatorios criptográficamente seguro

Un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG, del inglés «Cryptographically Secure PseudoRandom Number Generator») es un Generador de números pseudoaleatorios (PRNG) con características que lo hacen adecuado para su uso en criptografía.

Muchos aspectos de la criptografía requieren números aleatorios, por ejemplo:

La «calidad» de aleatoriedad requerida por estas aplicaciones varía. Por ejemplo, crear una nonce en algunos protocolos necesita que solo sea única. En el otro extremo, la generación de una clave maestra requiere tanto una mayor calidad, como una mayor entropía. Y en el caso de Libretas de un solo uso, la garantía teórica del secreto perfecto sólo vale si el material para la clave es obtenido de una fuente realmente aleatoria con alta entropía.

Idealmente, la generación de números aleatorios en un CSPRNG usa entropía obtenida de una fuente de alta calidad, que puede ser un generador de números pseudoaleatorios en hardware o incluso procesos de sistemas impredecibles —aunque se han encontrado correlaciones inesperadas en varios procesos ostensiblemente independientes. Desde un punto de vista teórico, la cantidad de aleatoriedad y la entropía que puede ser generada es igual a la entropía provista por el sistema. Pero, algunas veces —en situaciones prácticas— es necesario mayor cantidad de números aleatorios que la entropía disponible. También, en la práctica, los procesos que extraen aleatoriedad del sistema en marcha son lentos. En tales instancias, un CSPRNG puede ser usado. Un CSPRNG puede «alargar» la entropía disponible sobre más bits.

Cuando toda la entropía que se dispone está disponible antes que la ejecución del algoritmo comience, realmente tenemos un cifrador de flujo. Sin embargo, algunos diseños de criptosistemas permiten el ingreso de entropía durante la ejecución, en cuyo caso no es realmente un cifrador de flujo y por ende no puede ser usado como tal. Por lo tanto, el diseño de CSPRNG y cifradores de flujo están estrechamente relacionados.

Requerimientos

Los requerimientos de un CSPRNG ordinario también satisfacen los de un PRNG, pero no al contrario. Los requerimientos de un CSPRNG caen en dos grupos: primero, que sus propiedades estadísticas sean buenas (pasar pruebas estadísticas de aleatoriedad); y segundo, que puedan salir airosos bajo ataques severos, incluso si parte de su estado inicial o actual estado está disponible a un atacante.

Ejemplo: Si un CSPRNG bajo consideración produce su salida computando los bits de π en secuencia, comenzando desde un punto desconocido de la expansión binaria, puede muy bien satisfacer la prueba del siguiente bit y ser entonces estadísticamente aleatorio, ya que π parece ser una secuencia aleatoria. (Esto estaría garantizado si pi es un número normal, por ejemplo.) Sin embargo, este algoritmo no es criptográficamente seguro; un atacante que determina qué bit de pi está actualmente en uso (i.e. el estado del algoritmo) puede entonces usarlo para calcular todos los bits generados anteriormente.

La mayoría de los PRNGs no son aptos para ser usados como CSPRNG y pueden fallar en ambos ámbitos. Primero, mientras que la mayoría de las salidas de los PRNG parecen ser aleatorias ante pruebas estadísticas clasificadas, no son capaces de resistir ciertos tipos de ingeniería reversa. Pueden encontrarse pruebas estadísticas especializadas —diseñadas específicamente para un cierto PRNG— que evidencian la poca o nula aleatoriedad de los números generados. Segundo, para la mayoría de los PRNG —cuando su estado ha sido revelado— todos los números aleatorios generados anteriormente pueden ser obtenidos, permitiendo a un atacante leer todos los mensajes pasados, como también los futuros.

Los CSPRNG están diseñados explícitamente para resistir este tipo de Criptoanálisis.

Contexto histórico

Santha y Vazirani probaron que varios flujos de bit con aleatoriedad débil pueden ser combinados para producir un flujo de bits quasi-aleatorios de mejor calidad. Incluso antes, John von Neumann probó que un algoritmo simple puede remover una cantidad considerable de sesgo de cualquier flujo de bits que debería ser aplicado a cada flujo de bits antes de usar cualquier variación del diseño de Santha-Vazirani. El campo fue llamado extracción de entropía y es objeto de investigación activa (ej., N Nisan, S Safra, R Shaltiel, A Ta-Shma, C Umans, D Zuckerman).

Diseños

En la discusión de esta sección, los diseños de los CSPRNG son divididos en tres clases:

  1. Aquellos basados en Cifrado por bloques.
  2. Basados en problemas matemáticos «difíciles».
  3. Diseños de propósito especial.

Diseños basados en primitivas criptográficas

Un diseño de este tipo de clase está incluido en el estándar ANSI X9.17 (Financial Institution Key Management (wholesale), en español Manejo de Claves de Instituciones Financieras (mayorista)), y también ha sido adoptado como un estándar FIPS. Trabaja de la siguiente forma:

cada vez que un número aleatorio es requerido:

Se ha sugerido que este algoritmo podría ser improvisado usando AES en vez de DES (Young and Yung, op cit, secc 3.5.1)

Diseños de teoría numérica

Diseños especiales

Hay un número de PRNG prácticas que han sido diseñadas para ser criptográficamente seguras, incluyendo:

Estándares

Varios CSPRNG han sido estandarizados. Por ejemplo:

Una buena referencia (en inglés) es mantenida por el NIST.

También hay estándares para pruebas estadísticas de nuevos diseños de CSPRNG:

Referencias

  1. ↑ Miklos Santha, Umesh V. Vazirani (1984). «Generating quasi-random sequences from slightly-random sources (inglés)». Proceedings of the 25th IEEE Symposium on Foundations of Computer Science. ISBN 0-8186-0591-X, páginas 434–440.
  2. ↑ John von Neumann (1 de marzo de 1963). «Various techniques for use in connection with random digits». The Collected Works of John von Neumann. Pergamon Press. pp.  768-770. ISBN 0-08-009566-6.

Enlaces externos