[en] Hashing algorithms are commonly used in the field of cybersecurity to encrypt secret information, for example, they are used to encrypt all kinds of passwords. For this reason, computer system attackers often devise and implement means to decrypt hash codes. In all of them it is necessary to use high-performance computing resources, since a common form of attack is to encrypt several candidate passwords obtaining their corresponding hash code, to compare it with the hash code that is the object of the attack. Hashcat is an open source tool that implements a wide variety of these attacks. To make efficient use of the computational resources available on a given platform, Hashcat primarily uses the OpenCL parallelization platform. This platform is a standard that allows you to exploit the parallel capabilities of all types of multi-core processors and graphics cards. However, the support of OpenCL by many candidates has declined in recent years, being in some cases non-existent and in others poor. This lack of OpenCL support is especially relevant on Nvidia graphics cards, where the manufacturer itself offers a proprietary alternative called CUDA. In this work we will explore the possibilities of replacing the use of OpenCL with the use of CUDA in hashcat. We will study how we can improve the performance of the tool using CUDA. For this we will have to carry out three fundamental tasks: (1) A reverse engineering task to understand how Hashcat works internally and the degree of support that exists for CUDA technology. This task is necessary due to the scarce documentation that the application provides for its developers. (2) A performance analysis task of the Hashcat tool, and (3) make a proposal to improve CUDA support within the application, studying the effect that this improvement may have on performance.

[es] Los algoritmos de hashing se utilizan habitualmente en el ámbito de la ciberseguridad para encriptar información secreta, por ejemplo, se usan para la encriptación de todo tipo de contraseñas. Por este motivo, los atacantes de sistemas informáticos suelen idear y poner en práctica medios para desencriptar códigos hash. En todos ellos es necesario utilizar recursos computacionales de altas prestaciones, pues una forma habitual de ataque consiste en encriptar varias contraseñas candidatas obteniendo su código hash correspondiente, para compararlo con el código hash objeto del ataque. Hashcat es una herramienta de código abierto que implementa una gran variedad de estos ataques. Para hacer un uso eficiente de los recursos computacionales disponibles en una plataforma dada, Hashcat utiliza principalmente la plataforma de paralelización OpenCL. Esta plataforma es un estándar que permite explotar las capacidades paralelas de todo tipo de procesadores multinúcleo y de tarjetas gráficas. Sin embargo, el soporte de OpenCL por parte de muchos candidatos ha decaído en los últimos años, siendo en algunos casos inexistente y en otros deficiente. Esta falta de soporte de OpenCL es especialmente relevante en las tarjetas gráficas Nvidia, donde el propio fabricante ofrece una alternativa propietaria llamada CUDA. En este trabajo exploraremos las posibilidades de reemplazar el uso de OpenCL por el uso de CUDA en hashcat. Estudiaremos hasta qué punto podemos mejorar el rendimiento de la herramienta utilizando CUDA. Para ello deberemos realizar tres tareas fundamentales: (1) Una tarea de ingeniería inversa para entender cómo funciona Hashcat internamente y el grado de soporte que existe para la tecnología CUDA. Esta tarea es necesaria debido a la escasa documentación que la aplicación aporta para sus desarrolladores. (2) Una tarea de análisis de rendimiento de la herramienta Hashcat, y (3) efectuar una propuesta de mejora del soporte de CUDA dentro de la aplicación, estudiando el efecto que esta mejora puede tener en el rendimiento.