CSPRG en Python

Quiero implementar un CSPRNG para un cifrado de flujo. Intenté implementar el BBS, pero escuché que necesita semillas muy grandes para ser seguro.

¿Hay alguna función en alguna biblioteca para Python 3 que agregue un generador de números pseudoaleatorios que sea seguro y proporcione los mismos resultados para cada semilla?

Sin embargo, puede implementar un PRNG (o un cifrado de flujo incluso más fácilmente) usando los hashes seguros en hashlib. También hay planes para agregar un CSPRNG a la biblioteca estándar en 3.6 IIRC.

Respuestas (3)

Lo que está buscando es realmente un DRBG (generador de bits aleatorio determinista) en lugar de un CSPRNG, ya que este último no necesita ser reproducible o incluso tener un estado observable. Los DRBG están definidos para tomar una semilla y devolver un flujo de bits criptográficamente seguros basados ​​en esa semilla (es decir, los DRBG son técnicamente un subconjunto de todos los CSPRNG, pero cuando las personas dicen CSPRNG, generalmente se refieren al tipo de "grupo de entropía" de diseños no deterministas) .

No hay nada dentro de Python para esto, ya que la única fuente de bytes criptográficamente seguros que proporciona Python es, en última instancia, el propio generador no determinista del sistema operativo que no satisface sus necesidades.

Podría usar primitivos criptográficos PyCrypto para implementar un DRBG bueno conocido como HMAC-DRBG. También existe este repositorio de Github que implementa HMAC-SHA512-DRBG con vectores de prueba. También puede haber enlaces de Python a bibliotecas criptográficas como SSL que pueden proporcionar un DRBG listo para usar (aunque no sé si la capa criptográfica de OpenSSL proporciona tal cosa).

HMAC está en las bibliotecas estándar, por lo que no es necesario usar PyCrypto.
@otus Buen punto, puede hacerlo de inmediato si solo necesita una función hash o primitivas HMAC para su construcción. ¡Tan pronto como necesite cualquier tipo de esquema de encriptación, no tendrá suerte!

Tengo un código de Python que implementa un PRBG basado en RSA, disponible en http://s13.zetaboards.com/Crypto/topic/7234475/1/ Espero que pueda serle útil en un sentido u otro.

El mejor CSPRNG para implementar un cifrado de flujo es, espérelo, un cifrado de flujo o un cifrado de bloque en modo de cifrado de flujo, como AES en modo de contador (CTR). Tal cosa es teóricamente hablando un CS-PRNG.

Las implementaciones reales del generador de números aleatorios pueden cambiar en la forma en que devuelven bits/bytes, pueden usar una semilla aleatoria o pueden volver a sembrar. Después de todo, han sido diseñados para proporcionar una salida aleatoria. Así que no los usaría para donde un cifrado de flujo está perfectamente bien.