2011-07-08 4 views
9

This article establece que¿Cómo (si existe) un generador de números aleatorios predecible se vuelve más seguro después de SHA-1 en su salida?

A pesar del hecho de que el Mersenne Twister es un muy buen generador de números pseudo-aleatorios, no es criptográficamente seguro por sí mismo por una razón muy simple. Es posible determinar todos los estados futuros del generador a partir del estado que tiene el generador en un momento determinado, y ya sea 624 salidas de 32 bits o 19,937 salidas de un bit son suficientes para proporcionar ese estado. El uso de una función hash criptográficamente segura, como SHA-1, a la salida de Mersenne Twister ha sido recomendada como una forma de obtener un flujo de claves útil en criptografía.

Pero no hay referencias sobre por qué digerir la salida lo haría más seguro. Y, sinceramente, no veo por qué debería ser así. El Twister de Mersenne tiene un período de 2^19937-1, pero creo que mi razonamiento también se aplicaría a cualquier PRNG periódico, p. Generadores congruenciales lineales también. Debido a las propiedades de una función segura unidireccional h, se podría pensar en h como una función inyectiva (de lo contrario, podríamos producir colisiones), por lo tanto, simplemente se correlacionan los valores de su dominio en su rango de una a una.

Con esto en mente, yo diría que los valores hash producirán exactamente el mismo comportamiento periódico que el Mersenne Twister original. Esto significa que si observas todos los valores de un período y los valores comienzan a repetirse, entonces eres perfectamente capaz de predecir todos los valores futuros.

Supongo que esto está relacionado con el mismo principio que se aplica en el cifrado basado en contraseña (PKCS#5), porque el dominio de las contraseñas no proporciona suficiente entropía, simplemente las contraseñas hash no agregan ninguna entropía adicional. necesitas quitar las contraseñas antes de hackearlas. Creo que exactamente el mismo principio se aplica aquí.

Un simple ejemplo que finalmente me convenció: supongamos que tiene un PRNG muy malo que siempre producirá un "número aleatorio" de 1. Entonces, incluso si SHA-1 sería una función unidireccional perfecta, aplicando SHA-1 a la salida siempre dará el mismo valor, por lo que la salida no es menos predecible que antes.

Aún así, me gustaría creer que hay algo de cierto en ese artículo, así que seguramente debo haber pasado por alto algo. ¿Me puede ayudar? En gran parte, he omitido el valor inicial de mis argumentos, ¿tal vez aquí es donde sucede la magia?

+1

Su ejemplo trivial no es muy útil, ya que el período es pequeño. En cambio, un ejemplo trivial sería un generador que emite 1, 2, 3, ..., 2^32-1, 0, 1, .... El estado es un par de bytes, el período es grande. Se necesita una salida para predecir el siguiente valor, pero no es así si el valor se ha corregido con una sal secreta. –

Respuesta

14

El estado del twister de mersenne está definido por las salidas n anteriores, donde n es el grado de repetición (una constante). Como tal, si le da al atacante n salidas directamente de un twister de mersenne, inmediatamente podrá predecir todos los valores futuros.

Pasar los valores a través de SHA-1 lo hace más difícil, ya que ahora el atacante debe intentar invertir el RNG. Sin embargo, para un tamaño de palabra de 32 bits, es poco probable que sea un impedimento grave para un atacante determinado; pueden construir una tabla arcoíris o utilizar algún otro enfoque estándar para revertir SHA-1 y, en el caso de colisiones, filtrar candidatos según si producen el flujo de RNG observado. Como tal, el twister de mersenne no debe usarse para aplicaciones criptográficamente sensibles, SHA-1 masking o no. Hay un número de standard CSPRNGs que se puede usar en su lugar.

+0

¡Gracias por esta agradable respuesta! – emboss

5

Un atacante es capaz de predecir la salida de MT basándose en relativamente pocas salidas, no porque se repite en un período tan corto (no), sino porque la salida filtra información sobre el estado interno de la PRNG. Hashing la salida oscurece esa información filtrada.Como @bdonlan señala, sin embargo, si el tamaño de salida es pequeño (32 bits, por ejemplo), esto no ayuda, ya que el atacante puede enumerar fácilmente todos los textos válidos y precalcular sus valores hash.

El uso de más de 32 bits de salida de PRNG como entrada para el hash lo haría impráctico, pero un PRNG criptográficamente seguro es aún una opción mucho mejor si necesita esta propiedad.

Cuestiones relacionadas