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.