2010-05-23 10 views
6

Questo problema potrebbe essere relativamente semplice, ma mi vengono dati due file di testo. Un file di testo contiene tutte le password crittografate crittografate tramite crypt.crypt in python. L'altro elenco contiene oltre 400k + parole normali del dizionario.Che cosa è un modo efficiente per scrivere l'algoritmo di cracking della password (python)

L'assegnazione è data da 3 diverse funzioni che trasformano le stringhe dal loro caso normale a tutte le diverse permutazioni delle maiuscole, trasforma una lettera in un numero (se ha lo stesso aspetto, ad esempio G -> 6, B -> 8), e inverte una stringa. Il fatto è che date le 10 - 20 password crittografate nel file delle password, qual è il modo più efficiente per ottenere la soluzione più veloce in esecuzione in python per eseguire quelle funzioni sulla parola del dizionario nel file di parole? È dato che tutte quelle parole, una volta trasformate in qualsiasi modo, crittografano una password nel file delle password.

Ecco la funzione che controlla se una data stringa, quando cifrato, è la stessa della password crittografata in passato:

def check_pass(plaintext,encrypted): 
crypted_pass = crypt.crypt(plaintext,encrypted) 
if crypted_pass == encrypted: 
    return True 
else: 
    return False 

Grazie in anticipo.

+3

'return crypted_pass == encrypted' – SilentGhost

+5

' return encrypted == crypt.crypt (plaintext, encrypted) ' –

risposta

3

Senza conoscere i dettagli dell'algoritmo di hash sottostante e le possibili debolezze dell'algoritmo, tutto ciò che si può fare è eseguire un attacco di forza bruta cercando tutte le possibili trasformazioni delle parole nell'elenco delle password.

L'unico modo per accelerare un simile attacco a forza bruta consiste nell'ottenere hardware più potente e dividere l'attività e eseguire il cracker in parallelo.

+0

Come una leggera ottimizzazione dello spazio masticabile, potrebbe essere utile provare le parole inalterate prima di iniziare a modificarle. Le persone tendono ad usare parole vere, e hanno molte meno probabilità di usare permutazioni inclusi numeri, ecc.Certo, se questo è compito, YMMV. ;) –

+0

Sì, @JosephMastey, ma questo sembra un compito a casa, nel qual caso la tua ipotesi non reggerebbe – inspectorG4dget

+0

@ inspectorG4dget Sicuramente lo fa, ma facciamo finta che il prof sia venuto fuori con un set di dati ragionevolmente realistico, solo per farmi sentire meglio con me proprio laurea CS. –

2

Sul mio computer portatile lento, crypt.crypt dura circa 20 microsecondi:

$ python -mtimeit -s'import crypt' 'crypt.crypt("foobar", "zappa")' 
10000 loops, best of 3: 21.8 usec per loop 

modo, l'approccio forza bruta (in realtà l'unico sensibile) è "un po" fattibile. Applicando le tue funzioni di trasformazione otterrai (stima stimata) circa 100 parole trasformate per parola del dizionario (principalmente dai cambiamenti di maiuscole), quindi circa 40 milioni di parole trasformate dall'intero dizionario. A 20 microsecondi ciascuno, ci vorranno circa 800 secondi, chiamiamoli 15 minuti, per lo sforzo di cercare di decifrare una delle password che in realtà non corrisponde a nessuna delle varianti; tempo previsto circa la metà di quello, per rompere una password che corrisponde a .

Quindi, se si hanno 10 password da scoppiare, e tutte corrispondono a una parola del dizionario trasformata, si dovrebbe fare in un'ora o due. È ok? Perché non c'è molto altro che puoi fare se non distribuire questo imbarazzante problema parallelo su quanti più nodi e core puoi afferrare (oh, e, usare una macchina più veloce in primo luogo - che potrebbe comprarti forse un fattore due o giù di lì).

Non esiste un trucco di ottimizzazione approfondito che è possibile aggiungere, quindi la logica generale sarà quella di un ciclo a triplo nidificato: un livello scorre su una password crittografata, una sopra le parole nel dizionario, una sopra le varianti di ogni parola del dizionario. Non c'è molta differenza riguardo al modo in cui nidificare le cose (eccetto che il ciclo delle varianti deve rientrare nel ciclo delle parole, per semplicità). Raccomando di incapsulare "dammi tutte le varianti di questa parola" come generatore (per semplicità, non per velocità) e minimizzando altrimenti il ​​numero di chiamate di funzione (es. Non c'è motivo di usare quella funzione check_pass poiché il codice in linea è altrettanto chiaro e sarà microscopicamente più veloce).

Problemi correlati