Come creare un Bruteforce password cracker per alfabetici e alfanumerici password?

Ho bisogno di fare piccoli programmi per la scuola per la forza bruta di un crack di diversi tipi di password; sto cercando di creare una forza bruta codice python che verrà eseguito attraverso ogni possibile combinazione di alfabetici e alfanumerici e password e mi danno la password e la quantità di tempo impiegato per il crack.

Ho fatto lo stesso con puramente numerici password e l’ho:

import datetime as dt

Password4 = 123456

def crack_password():
    start = dt.datetime.now()
    for n in range(1000000):
        password_guess = '{0:04d}'.format(n)
             if password_guess == str(Password4):
                end = dt.datetime.now()
                print("Password found: {} in {}".format(password_guess, end - start))
               break
    guesses = crack_password()

Poi ho provato a fare qualcosa di simile per alfabeto/password alfanumerica, ma non ha funzionato qualunque cosa ho provato:

    import random

    letters = [str(i) for i in range('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p')]
    s = [''.join([a,b,c,d,e,f,g,h]) for a in letters for b in letters for c   in letters for d in letters for e in letters for f in letters for g in letters  for h in letters]
    random.shuffle(s)
    real_password = 'aaaaaaaa'
    i = 0

    for code in s:
        if code == real_password:
            print()
            print('The password is: ', code)
             break
        else:
            i += 1
            print(i, ' failures', end='\r')

È di vitale importanza che il programma di includere il numero di fallimenti o il tempo impiegato per trovare la password, che è il motivo per cui io non posso fare semplicemente un generatore di password.

Si prega di notare: io sono abbastanza nuovo per la codifica e sono molto grato per il vostro aiuto 🙂

  • Vi suggerisco di dare un’occhiata a questo script PHP, io la trovo ben scritta: gist.github.com/popc0rn/5859209
  • grazie @YannChabot, tuttavia sto cercando di fare questo programma in python e non so davvero come tradurre tra lingue diverse
  • letters = [str(i) for i in range('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p')] non funziona come si pensa….
  • So che PHP non è la stessa come python, ma penso che si può ancora capire la logica, è abbastanza vicino da php
  • letters = 'abcdefghijklmnopqstuvwxyz' è ciò che si sta puntando per
InformationsquelleAutor Alex H | 2016-10-26



2 Replies
  1. 8

    Ecco un naiive metodo forza bruta che immagino numeri (string.digits) e lettere minuscole (string.ascii_lowercase). È possibile utilizzare itertools.product con repeat regolare la lunghezza delle password difficili da indovinare. Si può iniziare a 1 carattere password (o qualunque sia il vostro limite inferiore è), poi il tappo a una lunghezza massima di troppo. Poi basta return quando si trova la partita.

    import itertools
    import string
    
    def guess_password(real):
        chars = string.ascii_lowercase + string.digits
        attempts = 0
        for password_length in range(1, 9):
            for guess in itertools.product(chars, repeat=password_length):
                attempts += 1
                guess = ''.join(guess)
                if guess == real:
                    return 'password is {}. found in {} guesses.'.format(guess, attempts)
                print(guess, attempts)
    
    print(guess_password('abc'))

    Uscita

    a 1
    b 2
    c 3
    d 4
    ...
    aba 1369
    abb 1370
    password is abc. found in 1371 guesses.
    • Grazie mille! Quando mi supera i 4 caratteri per la password del mio IDE mi dice che c’e ‘troppo di uscita’. Funziona ancora, ma richiede molto più tempo – questo È qualcosa che ho solo bisogno di fare con quanto è una forza bruta programma?
    • Basta eliminare il print(guess, attempts) linea di sopprimere l’uscita. Sarà quindi solo correre fino a che non trova una corrispondenza di un ritorno della finale di indovinare e di conteggio.
  2. 0

    Una possibile opzione che vorresti conservare quasi esattamente il codice attuale è per la conversione di base 36 con il seguente “cifre”: 0-9a-z. Questo vi darà ogni possibile alfa-numerico combinazione di n caratteri, se si cerca in range(36**n).

    Semplificata utilizzando la funzione da Come convertire un intero in qualsiasi base di una stringa?:

    def baseN(num, b=36, numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
        return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

    È possibile quindi scorrere i numeri come nel tuo esempio:

    >>> for i in range(10000, 10005):
    ...     print(baseN(i).zfill(5))
    ...
    007ps
    007pt
    007pu
    007pv
    007pw

    Per ottenere tutte e 3-lettera possibilità, si può loop come segue:

    for i in range(36**3):
        possible = baseN(i).zfill(3)

Lascia un commento