¿Cuánto más seguro es el cifrado si el programa requiere una entrada aleatoria del usuario?

0

Sé que hay preguntas existentes sobre cómo Truecrypt usa la entrada del mouse para aumentar la entropía . Mi pregunta es, ¿cuánta diferencia hace? No conozco ninguna otra utilidad de cifrado que haga esto, ¿significa que el resto de ellas (como 7-zip) no son seguras? A mi entender, la forma típica de hacer esto es usar el tiempo de la computadora como semilla para el generador de números aleatorios, que en cierto sentido es lo mismo que la entrada del usuario cuando un ataque no sabe (al milisegundo) cuando el usuario presiona el botón. ¿Cuánto más seguro es el cifrado si utiliza la información del usuario, como mover el mouse o golpes de teclado aleatorios?

    
pregunta northerner 20.04.2017 - 02:00
fuente

2 respuestas

1

Básicamente cero.

Los sistemas operativos ya integran todas las fuentes de aleatoriedad potencial a las que pueden acceder para generar sus API de aleatoriedad (los ejemplos son CryptGenRandom() en Windows, /dev/urandom en las variantes de POSIX, getrandom(2) en Linux y getentropy(2) en FreeBSD). Estas fuentes incluyen movimientos del mouse, tiempos de disco y otros eventos impredecibles.

Lo importante es que, una vez que alcance un cierto punto, digamos 256 bits de entropía recopilada, que toma menos de unos pocos segundos en la práctica, el sistema operativo puede generar un flujo efectivamente ilimitado de números aleatorios impredecibles para la vida útil restante del sistema. Muchos sistemas operativos incluso guardan este estado interno al reiniciarse, lo que evita la necesidad de reinicializar el generador de números aleatorios del sistema nunca más. Más entropía en ese momento realmente no te hace más impredecible, y de todos modos, la recopilación de movimientos del mouse ya está hecho como parte de este proceso.

La entropía adicional permite que el sistema operativo se recupere de la exposición teórica o el deterioro de su estado aleatorio interno, pero es muy poco probable que esto ocurra en la práctica en una máquina no comprometida.

  

A mi entender, la forma típica de hacer esto es usar el tiempo de la computadora como semilla para el generador de números aleatorios ...

Ningún RNG criptográficamente seguro usa el reloj del sistema para este propósito. Como lo señala @CBHacking, esta es una fuente extremadamente débil de números aleatorios, ya que "a qué hora es" es altamente predecible (y algunas veces es fácilmente influenciable por fuentes externas). Los intervalos de microsegundos de la intervención humana también pueden ser semi predecibles, pero recopilar y mezclar estos datos repetidamente puede producir muy rápidamente una buena fuente de entropía. Las modernas funciones de mezcla de RNG son muy buenas para extraer y combinar incluso pequeñas cantidades de entropía.

    
respondido por el Stephen Touset 20.04.2017 - 02:57
fuente
2

TL; DR:

Ninguna, de verdad. Las computadoras modernas generan entropía de alta calidad ("aleatoriedad", esencialmente) lo suficientemente rápido como para que mover el mouse sea irrelevante.

Más detalles:

Los programas como Truecrypt (y posiblemente versiones más antiguas de cosas como ssh-keygen , gpg , etc.) que le dicen que haga cosas durante la generación de claves operan en el supuesto de que el sistema operativo no tenga fuentes de entropía muy rápidas. aparte de la interacción del usuario y / o un grupo de entropía muy pequeño para su generador de números pseudoaleatorios seguro criptográficamente (CSPRNG). En las computadoras antiguas, especialmente sin conexiones a Internet o recursos suficientes para ejecutar una gran cantidad de procesos en segundo plano, esto probablemente fue cierto al menos en algunas ocasiones.

Las computadoras modernas son bastante buenas en la generación de entropía y tienen grupos de entropía relativamente grandes que pueden arrojar fácilmente pozos suficientes para generar una clave. Además, en estos días es común usar CSPRNG que admiten la entropía de estiramiento (en los sistemas operativos * nix, esta sería la diferencia entre /dev/random , que se extrae directamente del grupo de entropía, y /dev/urandom que puede tomar una pequeña cantidad de entropía del grupo y utilícelo para generar una gran cantidad de bits un poco menos aleatorios; /dev/urandom es, en sistemas operativos modernos, todavía lo suficientemente bueno para la generación de claves). Todavía es teóricamente posible terminar con máquinas que tienen grupos predecibles de entropía del kernel (un grupo de máquinas virtuales idénticas que se ejecutan en máquinas sin cabeza idénticas que ejecutan versiones de software idénticas iniciadas al mismo tiempo, etc. a veces pueden tener la misma entropía del kernel inicialmente), pero es no es fácil. Este tipo de cosas es la razón por la que los hosts de máquinas virtuales modernas tienen formas de alimentar algo de entropía a los invitados de máquinas virtuales en función de los estados de hardware, etc. que se usan habitualmente en la generación de entropía del kernel en estos días.

La mayoría de las CPU modernas tienen incluso qué cantidad de RNG de hardware basadas en cosas como el estado térmico de las diferentes partes del chip de la CPU, que varían rápidamente dependiendo de cosas como exactamente qué instrucciones se han ejecutado recientemente y si causaron errores de caché o no, variaciones minúsculas en el voltaje de la fuente de alimentación, el movimiento del aire en la habitación y otras cosas por el estilo; las diferencias son leves, pero en conjunto hay mucha entropía allí y la CPU tiene hardware dedicado para recopilarlo y nuevos códigos de operación para proporcionarlo al sistema operativo. Muchos sistemas operativos mezclan esto con su grupo de entropía del kernel, junto con otras entradas, lo que hace que sea muy difícil agotar la entropía bajo las cargas de trabajo normales de "usuario" en una PC moderna.

IMPORTANTE:

¡No hay CSRPNG en el mundo que esté sembrado en un grado significativo fuera del reloj del sistema! La razón por la cual es simple. Parece que piensas que el tiempo "hasta el milisegundo" es lo suficientemente aleatorio para el cifrado, pero estás bastante equivocado al respecto. Tomemos algo como generar un par de claves GPG como ejemplo. Los que generalmente tienen un período de validez en sus claves públicas, que me dice (tengo su clave pública, después de todo, es pública) cuando se generó la clave, hasta el día. Hay 86400000 ms en un día (ignorando el hecho de que probablemente pueda reducir eso en mucho considerando las horas en que es probable que una persona esté despierta). Log2 (86400000) tiene 26.36 bits. ¡Su par de claves RSA de 4096 bits supuestamente seguro en realidad tiene menos entropía que una contraseña de calidad decente! Los 86400000 pares diferentes de claves forzadas brutas para encontrar la clave privada correspondiente tomarán un tiempo, pero mucho menos tiempo que intentar factorizar una clave pública RSA de 4096 bits. De hecho, no hay suficientes milisegundos desde el inicio de la computación electrónica para producir una clave de DES completamente aleatoria (56 bits) al elegir entre ellos, y podemos usar el DES de fuerza bruta en menos de un día si se usan de forma estándar. hardware ( sí, la generación de claves RSA requiere mucho más trabajo que solo tomar 56 bits y calcular su paridad para la generación de claves DES, pero aún es lo suficientemente rápido para este propósito ).

En su lugar, cualquier programa criptográfico que no sea puramente basura sin valor (y algunos que lo son) usa un CSPRNG (como /dev/urandom en sistemas similares a Unix, o CryptGenRandom() en Windows) para generación de claves. De manera similar, la mayoría de las bibliotecas estándar de lenguaje de programación incluyen al menos dos PRNG: una rápida pero insegura para cosas en las que realmente no importa si alguien podría predecir teóricamente la salida (en Java, es java.util.Random ), y una seguridad criptográfica segura uno, por lo general, sembrado por o directamente devolviendo la salida del OS CSPRNG, para cosas como crypto (en Java, esto es java.security.SecureRandom ). Ningún PRNG sembrado por la hora actual, independientemente del algoritmo que use, podría considerarse criptográficamente seguro; el espacio de búsqueda es demasiado pequeño.

    
respondido por el CBHacking 20.04.2017 - 02:55
fuente

Lea otras preguntas en las etiquetas