>> ROB BOWDEN: Io sono Rob, e cerchiamo di ottenere cracking.
Quindi ricorda dalla spec pset che stiamo andando a essere la necessità di utilizzare il
funzione crypt.
Per la pagina man, abbiamo due hash definire _xopensource.
Non ti preoccupare perché abbiamo bisogno di fare questo.
E anche hash includono unistd.h.
>> Quindi, una volta che è fuori del modo, cerchiamo di raggiungere il vero programma.
La prima cosa che dobbiamo fare è fare in modo l'utente ha immesso un valido criptato
la password nella riga di comando.
Ricordate che il programma dovrebbe per essere eseguito come dot barra crepa, e
allora stringa crittografata.
>> Quindi qui stiamo controllando per assicurarsi che argc a due, se vogliamo
proseguire con il programma.
Se argc non è due, che significa o l'utente non ha inserito un messaggio crittografato
la password nella riga di comando, oppure entrato più di una semplice criptato
la password nella riga di comando, in cui caso non sappiamo cosa fare con il
gli argomenti della riga di comando.
>> Quindi, se argc aveva due anni, siamo in grado di continuare.
E qui, stiamo andando a dichiarare una variabile criptato.
Questo è solo andando a alias l'originale argv1 in modo che tutto questo
programma, non abbiamo chiamarlo argv1, che poi si deve pensare
su ciò che in realtà voleva dire.
>> Così alla fine, vogliamo confermare che la password cifrata dell'utente
entrato avrebbe potuto essere effettivamente una password cifrata.
Per la pagina man della cripta, il password crittografata deve essere 13
caratteri.
Fino qui, notiamo che abbiamo hash definito cifrare lunghezza 13.
Quindi, stiamo solo facendo in modo che il lunghezza della stringa del crittografata
parola d'ordine è 13.
>> E se non lo è, vogliamo per uscire dal programma.
Quindi, una volta che è fuori del modo, possiamo ora effettivamente cercare di trovare ciò che il
password che ha dato il crittografata parola d'ordine era.
Qui, vogliamo prendere il sale dalla password crittografata.
Ricordate, per la pagina man, che la primi due caratteri di un messaggio crittografato
stringa, come qui -
50ZPJ e così via -
le prime due cifre indicano noi il sale utilizzato
nella funzione cripta.
>> E qui, vediamo che il sale era ettari.
Quindi vogliamo copiare i primi due caratteri, lunghezza sale essendo hash
definita come due.
Dobbiamo copiare i primi due caratteri in questo array, sale.
Si noti che abbiamo bisogno di lunghezza sale più uno, dal momento che abbiamo ancora bisogno di un cavo null
terminatore all'estremità del nostro sale.
>> Poi andremo a dichiarare questa matrice, ospite, di dimensioni lunghezza Max Plus
uno, in cui lunghezza massima è di hash definito come otto, dato che la password massima
è lungo otto caratteri.
E abbiamo intenzione di usare questo per iterare su tutte le possibili stringhe che potrebbero
essere password valide.
Quindi, se i caratteri validi in una password erano semplicemente a, b, e c,
avremmo iterare su a, b, c, aa, BA, CA, e così via, fino
si arriva a vedere cccccccc -
otto di c.
>> E se non abbiamo giù un valido password, quindi abbiamo bisogno di dire che la
stringa cifrata non era valida per cominciare.
Così ora, raggiungiamo questo mentre 1 loop.
Si noti che significa che è un ciclo infinito.
>> Si noti non ci sono istruzione break all'interno di tale ciclo infinito.
Ci sono solo tornare dichiarazioni.
Quindi non abbiamo mai realmente aspettiamo per uscire dal ciclo.
Ci aspettiamo che solo per uscire dal programma.
Ho aggiunto questa dichiarazione di stampa alla cima di questo ciclo per stampare solo fuori
quello che la nostra ipotesi di corrente a ciò che la password è.
>> Ora, che cosa sta facendo questo ciclo?
E 'un ciclo su tutte le possibili stringhe che potrebbe essere password valide.
La prima cosa che andremo a fare è prendere la nostra ipotesi attuale per ciò che il
password è.
Prenderemo il sale che abbiamo preso da la stringa cifrata, e siamo
andando a crittografare la congettura.
Questo ci darà una congettura cifrato, che andremo a confrontare con
la stringa cifrata che l'utente inserito nella riga di comando.
>> Se sono uguali, nel qual caso stringa paragonabile tornerà a zero, se
sono la stessa cosa, quindi indovinare era la password che ha generato il crittografata
stringa, nel qual caso possiamo stampare che, come la nostra password e ritorno.
Ma se non fossero gli stessi, che significa che la nostra ipotesi era corretta.
>> E vogliamo iterare a il successivo indovinare valido.
Quindi questo è ciò che questo mentre ciclo sta cercando di fare.
E 'intenzione di iterare la nostra ipotesi al successivo indovinare valido.
Si noti che quando si dice che un particolare carattere nella nostra ipotesi ha
raggiunto il massimo simbolo, che qui hash viene definita come una tilde, poiché
questo è il più grande personaggio valore ASCII che un utente può immettere nella
tastiera, quando il personaggio raggiunge l' simbolo max, allora vogliamo inviare
di nuovo il simbolo minimo, che è uno spazio, ancora il più basso ASCII
simbolo valore che un utente può inserire la tastiera.
>> Quindi stiamo andando a impostare che al simbolo minimo.
E poi stiamo per andare al carattere successivo.
Così come sono le nostre supposizioni andando a iterare?
Beh, se i caratteri validi sono A, B, e C, quindi se abbiamo iniziato con una,
sara iterare per b, sarà iterare a c.
c è il nostro simbolo massimo, quindi dovremo impostare c di nuovo ad un, il simbolo minimo.
E poi ci iterare indice al carattere successivo.
>> Quindi se la congettura originale era C, il successivo personaggio sarà il nulla
terminatore.
Quaggiù, notare che se il personaggio che ora vogliamo
incremento è stato il terminatore null, poi andremo a impostarla sul
simbolo minimo.
Quindi, se l'ipotesi era c, allora il nostro nuova ipotesi sarà aa.
E se la nostra ipotesi iniziale era cccc, allora la nostra nuova ipotesi
sta per essere aaaaa.
>> Così ogni volta che si raggiunge la stringa di massimo di una data lunghezza, allora siamo
andando a implementare la stringa minima della lunghezza successivo, che sarà
basta essere tutti i caratteri di il simbolo minimo.
Ora, che cosa è questo controllo fa qui?
Beh, se l'indice spostato dalla ottava carattere a carattere nove -
in modo da aggiungiamo otto c di come nostro precedente indovinare -
allora indice si concentrerà sulla ultimo terminatore null della nostra ipotesi
array, che non è destinato a realtà essere utilizzato in nostra password.
>> Quindi, se siamo concentrati su quest'ultimo nullo terminator, quindi non abbiamo trovato un
la password che è valida utilizzando solo otto personaggi, il che significa che non c'è
password valida che crittografa alla stringa data.
E dobbiamo stampare che, dicendo Non siamo riusciti a trovare un valido
password e ritorno.
Quindi questo ciclo while sta per iterare su tutte le possibili stringhe.
>> Se ne trova una che crittografa la stringa crittografata previsto, sarà
restituire quella password.
E non trova nulla, allora tornerà, la stampa che
non è stato in grado di trovare qualsiasi cosa.
Ora, si noti che iterare su tutti possibili stringhe è probabilmente andando a
prendere un po '.
Diamo effettivamente vedere come lungo che prende.
>> Facciamo crepa.
Beh, oops - dice undefined riferimento alla cripta.
Quindi ricorda, per il p imposta specifica e anche la pagina di manuale per crypt che abbiamo
necessità di collegare in cripta.
Ora, il default rendono comando non sa che
voler utilizzare tale funzione.
>> Quindi cerchiamo di copiare questo comando del client e basta aggiungere alla fine
di esso, che collega cripta.
Ora, si compila.
Quindi Corriamo crepa su un dato stringa crittografata -
così Cesare.
Così che era piuttosto veloce.
>> Si noti che questo è conclusa il 13.
Beh, la password criptata di Cesare sembra essere 13.
Quindi cerchiamo di un'altra password.
Prendiamo cifrato di Hirschhorn password e cercare di cracking che.
>> Quindi notare abbiamo già raggiunto tre personaggi.
E stiamo iterare su tutti i possibili stringhe di tre caratteri.
Questo significa che abbiamo già finito l'iterazione di tutti i possibili uno e
due stringhe di caratteri.
Ora, sembra che questo sta per prendere un po 'prima di raggiungere la
stringhe di quattro caratteri.
Si potrebbe prendere un paio di minuti.
>> Non ci è voluto un paio di minuti.
Siamo sulle corde di quattro caratteri.
Ma ora, abbiamo bisogno di iterare su tutti possibili stringhe di quattro caratteri, che
che potrebbe prendere forse 10 minuti.
E poi, quando si arriva a cinque caratteri stringhe, abbiamo bisogno di iterare tutti
di quelli, che potrebbe prendere un paio d'ore.
E abbiamo bisogno di iterare su tutti i possibili sei caratteri corde, che
potrebbe richiedere un paio di giorni e così via.
>> Quindi potrebbe richiedere potenzialmente molto lungo tempo per scorrere tutte le possibili
otto caratteri e un minor numero di stringhe.
Quindi, si noti che questo non è necessariamente un algoritmo molto efficiente per trovare
una password.
Si potrebbe pensare che non ci sono modi migliori.
Per esempio, la ZYX Password 32AB Probabilmente non è una password molto comune,
mentre la password è 12345 probabilmente molto più comune.
>> Quindi un modo di cercare di trovare una password in modo più rapido è quello di guardare solo
presso le password che sono più comuni.
Così, per esempio, possiamo provare a leggere le parole da un dizionario e provare tutti
quelle parole come le nostre supposizioni password.
Ora, forse una password non è così semplice.
Forse l'utente era in qualche modo intelligente e provare aggiungendo un numero al
alla fine di una parola.
>> Così forse la loro parola d'ordine era password1.
Così si può provare iterare su tutte le parole nel dizionario con un one
aggiunto alla fine di esso.
E poi magari dopo aver fatto questo, dovrai aggiungere una due alla fine di esso.
>> O forse l'utente sta cercando di essere ancora più intelligente, e vogliono che il loro
la password per essere "hacker", ma sono andando a sostituire tutte le istanze e di
con coppia di tre.
Così si potrebbe fare anche questo.
Iterare su tutte le parole nel dizionario ma sostituire i caratteri che
guardare come numeri con quei numeri.
>> Quindi, in questo modo, si potrebbe prendere ancora di più le password che sono abbastanza comuni.
Ma alla fine, l'unico modo è possibile catturare tutte le password è quello di bruto
forzare iterare su tutti stringhe possibili.
Così, alla fine, si ha bisogno di iterare su tutte le stringhe da un personaggio
otto caratteri, che potrebbero richiedere un tempo molto lungo, ma è necessario farlo.
>> Il mio nome è Rob Bowden.
E questo è Crack.