¿Por qué las GPU son tan buenas para descifrar contraseñas?

32

¿Qué tienen las GPU que les permiten descifrar contraseñas tan rápidamente?

Parece que la fuerza impulsora detrás de la adopción de buenas funciones de derivación de claves para contraseñas (bcrpyt, PBKDF2, scrypt) en lugar del hash criptográfico de ayer (MD *, SHA *) es que estos últimos son vulnerables a los programas que se ejecutan en GPUs y Adivina enormes cantidades de contraseñas extremadamente rápido. ¿Por qué las GPU deberían ser mucho mejores para evaluar esas funciones hash que las CPU?

    
pregunta Nick 19.03.2013 - 03:03
fuente

2 respuestas

40

Para completar la respuesta de @Terry: una GPU tiene muchos núcleos (cientos). Básicamente, cada núcleo es capaz de calcular una operación aritmética de 32 bits por ciclo de reloj, como una canalización . De hecho, la GPU funciona bien con paralelismo extremo : cuando hay que realizar muchas unidades de trabajo idénticas, en realidad muchas más que los núcleos reales ("idéntico" significa "mismas instrucciones", pero no "mismos datos").

Algunos detalles , para una tarjeta NVidia algo antigua (una GTX 9800+, desde principios de 2009): hay 128 núcleos, divididos en 16 "unidades multinúcleo". Cada núcleo múltiple puede iniciar 8 operaciones por ciclo (de ahí la idea de 128 núcleos: 16 veces 8). El multinúcleo maneja las unidades de trabajo ("hilos") por grupos de 32, de modo que cuando un multinúcleo tiene una instrucción para ejecutar, en realidad emite esa instrucción a sus 8 núcleos en 4 ciclos de reloj. Esta es la operación iniciación : cada operación individual toma hasta 22 ciclos de reloj para ejecutarse. Puedes imaginar la instrucción y sus operandos caminando en el circuito como una línea de frente que avanza, como una ola en un grupo: una ola dada tardará un poco en llegar al otro extremo del pozo, pero puedes enviar varias olas de forma secuencial.

Por lo tanto, puede mantener el ritmo de "128 operaciones de 32 bits por ciclo" solo mientras tenga al menos 22 veces más "hilos" para ejecutar (es decir, un mínimo de 22 · 128 = 2816), de modo que Los hilos se pueden agrupar por paquetes de 32 hilos "idénticos" que ejecutan las mismas instrucciones al mismo tiempo, como los bailarines de hip-hop. En la práctica, hay algunos umbrales y restricciones internos que requieren más hilos para lograr el ancho de banda óptimo, hasta aproximadamente 4096.

Podría lograr cerca del 99% del ancho de banda óptimo con una implementación SHA-1. SHA-1 usa un poco más de 1100 operaciones de 32 bits (eso sería alrededor de 900 en una CPU, pero una GTX 9800+ no tiene un código de operación rotación , por lo que las rotaciones deben dividirse en dos turnos y una lógico o), y la GPU se ejecutó a 1450 MHz, para un total general de alrededor de 160 millones de cálculos SHA-1 por segundo. Esto solo se puede lograr siempre que tenga millones de instancias de SHA-1 para calcular en paralelo, como es el caso de descifrado de contraseñas (en cualquier momento, necesita 4096 SHA-1 en paralelo para alimentar a Los núcleos de GPU, pero también tiene que lidiar con los costos de E / S para el ingreso de contraseñas potenciales, y estos costos dominarán si no tiene muchas instancias SHA-1 para procesar).

El PC host, en su CPU (un Intel Core2 de cuatro GHz de cuatro núcleos), podría alcanzar aproximadamente 48 millones de SHA-1 por segundo, y que estaba con código SSE2 completamente optimizado. Un solo SHA-1 usará aproximadamente 500 ciclos de reloj en dicha CPU (la CPU puede computar varias instrucciones en un solo ciclo, siempre que no compitan por los recursos y no dependan entre sí), pero, para el descifrado de contraseñas , vale la pena usar SSE2 con sus registros de 128 bits, y poder calcular 4 instrucciones en paralelo. Con las restricciones de SSE2, se requieren aproximadamente 800 ciclos de reloj para ejecutar cuatro SHA-1 en paralelo, por lo que son 200 ciclos de reloj por instancia de SHA-1. Hay cuatro núcleos en esa CPU y todo funciona a 2400 MHz, por lo tanto, 48 millones por segundo.

El hardware más reciente será más rápido, pero la GPU lo será más. Un GTX 680 tiene 1536 núcleos de chiflado, y hay dos como GPU en un GTX 690. Estamos hablando de miles de millones de instancias de SHA-1 por segundo aquí.

(Para comparar, también hice una implementación de SHA-1 en el procesador de células , es decir, la CPU en una consola PS3, con sus 8 coprocesadores "SPU". Una SPU no estaba disponible. Con las otras 7, alcancé unos 100 millones de SHA-1 por segundo, es decir, mejor que una CPU de PC grande contemporánea, pero no tan buena como una buena GPU de la misma época.)

Resumen: la GPU logra un gran rendimiento al usar un paralelismo intenso, con cientos (si no miles) de núcleos. Esto se hace posible mediante canalización (cada operación individual toma muchos ciclos para ejecutarse, pero se pueden iniciar operaciones sucesivas como camiones en una carretera) y compartir la decodificación de instrucciones (ya que muchos núcleos ejecutarán las mismas instrucciones en el mismo tiempo).

    
respondido por el Thomas Pornin 19.03.2013 - 14:22
fuente
19

Una GPU es excelente para procesar cálculos matemáticos. La representación gráfica es simplemente una serie de cálculos matemáticos complejos. Así son los algoritmos de hash.

Una GPU tiene cientos de núcleos que pueden usarse para calcular funciones matemáticas en paralelo. Una CPU suele tener 4-8 núcleos. Aunque un núcleo de CPU es mucho más rápido que un núcleo de GPU, el hashing de contraseñas es una de las funciones que se puede hacer en paralelo con mucha facilidad. Esto es lo que le da a las GPU una ventaja masiva en el descifrado de contraseñas.

Debe tener en cuenta que de los tres algoritmos que mencionó, el PBKDF2 aún puede ser resquebrajado con relativa facilidad en una GPU. El algoritmo PBKDF2 en términos muy básicos contiene una contraseña con una función hash como MD5 o SHA1 miles de veces. Aunque es mucho más fuerte que un simple hash MD5 o SHA1, aún puede ser resquebrajado relativamente rápido con una GPU.

bcrypt y scrypt están diseñados para evitar la aceleración masiva en el tiempo de craqueo que una GPU proporciona a un atacante. Vea esta increíble respuesta de Thomas Pornin para obtener más información: enlace

    
respondido por el Ayrx 19.03.2013 - 03:23
fuente

Lea otras preguntas en las etiquetas