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.