Link Search Menu Expand Document
El Libro De Python (24.95 €) 39.95 €

Fuerza bruta con itertools

Veamos como escribir una función que pueda romper contraseñas probando con fuerza bruta todas las combinaciones posibles.

En c definimos todas las posibles letras que usaremos. Usamos sólo minúsculas y números para que sea más sencillo de romper. Cuantas más letras posibles, como mayúsculas o caracteres raros como ?-.,, más complicada de romper será.

El algoritmo es muy sencillo y prueba combinaciones desde longitud 1 hasta long_mag. Estos serían alguno de los ejemplos probados.

  • Para longitud 1. Se prueba: a, b, c, … hasta 9
  • Para longitud 2. Se prueba: aa, ab, ac, … 9a, 9b, … hasta 99.
  • Para longitud 3. Se prueba: aaa, aab, … 9aa, 9aab, … hasta 999.

Como puedes ver, las combinaciones crecen de forma exponencial. Cuantos más letras posibles y mayor longitud, más difícil es de romper.

import itertools

def fuerza_bruta(contrasenia, long_max=6):
    c = "abcdefghijklmnopqrstuvwxyz0123456789"
    
    for longitud in range(1, long_max + 1):
        print(f"Longitud {longitud}...")
        for intento in itertools.product(c, repeat=longitud):
            intento_s = ''.join(intento)
            if intento_s == contrasenia:
                return intento_s
    return None

Si nuestra contraseña solo tiene letras y números y es de longitud 6, puedes ver de la siguiente manera cómo la podemos romper en unos pocos segundos.

contrasenia = "pass67"
encontrada = fuerza_bruta(contrasenia, long_max=8)
print(f"Contraseña encontrada: {encontrada}")

✏️ Ejercicios:

  • Calcula las combinaciones posibles para una contraseña con números y letras de longitud 10. Intenta romperla con fuerza bruta.