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, … hasta9 - Para longitud
2. Se prueba:aa,ab,ac, …9a,9b, … hasta99. - Para longitud
3. Se prueba:aaa,aab, …9aa,9aab, … hasta999.
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.