ROB BOWDEN: Sunt Rob, și Să dăm bătaie. Deci, amintiți-vă de la spec. PSET care vom avea nevoie să utilizeze crypt funcția. Pentru pagina de om, avem doi hash defini _xopensource. Nu vă faceți griji cu privire la ce avem nevoie pentru a face acest lucru. Și, de asemenea hash includ unistd.h. Deci, odată ce a ieșit din drum, să ajunge la programul actual. Primul lucru pe care trebuie să faceți este să vă asigurați utilizatorul a introdus o criptat valabil parola de la linia de comandă. Amintiți-vă că programul este presupus pentru a fi rulat ca punct slash crack, și apoi string criptat. Deci, aici suntem de verificare pentru a se asigura care argc a doua, dacă vrem să continua cu programul. Dacă argc nu este de doi, care înseamnă fie utilizatorul nu a introduce o criptat parola de la linia de comanda, sau ei a intrat mai mult decât criptat parola de la linia de comandă, în care caz că nu știu ce să fac cu argumente în linia de comandă. Deci, dacă argc fost doi, putem continua. Și aici, vom declara o variabilă criptate. Care este doar de gând să alias originale argv1 astfel încât pe parcursul acestui Programul, nu trebuie să spunem argv1, care apoi va trebui să se gândească despre ceea ce înseamnă că, de fapt. Deci, în final, dorim să valideze că parola criptată utilizator a intrat ar fi fost de fapt o parolă criptată. Pe pagina de manual a cripta, parola criptată trebuie să fie 13 caractere. Aici, observăm că noi hash definit cripta lungime de 13. Deci, suntem doar asigurându-vă că Lungimea șir de criptat parola este 13. Și dacă nu e, vrem pentru a ieși din program. Deci, odată ce a ieșit din drum, putem acum, de fapt încerca să găsească ceea ce parola pe care a dat criptate parola a fost. Aici, ne-o dorim pentru a apuca de sare de parola criptat. Amintiți-vă, pe pagina de om, care Primele două caractere ale unui criptat șir, ca aici - 50ZPJ și așa mai departe - primele două caractere da ne sare, care a fost utilizat în funcția de cripta. Și aici, vedem că sarea a fost ha. Așa că vrem să copiați primele două caractere, lungimea sare fiind hash definite ca două. Avem de a copia primele două caractere în această matrice, sare. Observați că avem nevoie de lungime sare plus o, deoarece avem nevoie de încă un nul terminator la sfârșitul sare nostru. Apoi, vom declara această matrice, invitat, de dimensiune lungime max plus unul, în cazul în care lungimea maximă este hash definit ca opt, deoarece parola maximă este de opt caractere. Și vom folosi acest lucru pentru a repeta peste toate sforile posibile care ar putea fi parole valide. Deci, dacă caracterele valabil într-un parolă au fost doar a, b și c, apoi ne-ar repeta peste a, b, c, AA, BA, CA, și așa mai departe, până când vom ajunge pentru a vedea cccccccc - opt c lui. Și dacă nu avem în jos un pașaport valabil parola, atunci trebuie să spunem că string criptat nu a fost valabil pentru a începe cu. Deci, acum, vom ajunge la asta în timp ce 1 bucla. Observați că înseamnă că este o buclă infinită. Observați există nici o declarație pauză în interiorul acestui ciclu infinit. Nu se întoarce doar declarații. Deci, nu ne așteptăm de fapt pentru a ieși din bucla. Ne așteptăm doar pentru a ieși din program. Am adăugat această declarație de imprimare la partea de sus a acestei bucle doar pentru a imprima Ghici nostru actual de la ce parola este. Acum, ceea ce face această buclă? Este looping peste toate sforile posibile care ar putea fi parole valide. Primul lucru pe care am de gând să faceți este să ia ghici noastră actuală pentru ceea ce parola este. Vom lua sare pe care l-am prins de la string criptat, iar noi suntem merge pentru a cripta ghici. Acest lucru ne va oferi o presupunere criptat, care vom compara împotriva șir criptată ce utilizatorul a intrat la linia de comandă. Dacă acestea sunt identice, în care caz șir comparabil va reveni la zero, în cazul în care ei sunt la fel, atunci ghici fost parola care a generat criptat șir, în cazul în care se poate imprima care ca parola noastră și retur. Dar dacă ei nu au fost la fel, că înseamnă ghici nostru a fost incorectă. Și vrem să repeta la următoarea ghici valabil. Deci despre asta în timp ce bucla încearcă să facă. Se va repeta ghici noastre la următoarea ghici valabil. Observați că atunci când spunem că o Caracterul special în estimarea noastră are a ajuns la simbolul Max, care aici este definit ca o distribuire tilda, deoarece care este cel mai mare personaj valoarea ASCII pe care un utilizator poate introduce la tastatură, atunci când caracterul ajunge Max simbol, apoi vrem să trimiteți l înapoi la simbolul minim, care este un spațiu, din nou, mai mic ASCII simbol valoare pe care un utilizator poate introduce de la tastatura. Deci, vom stabili că la simbolul minim. Și apoi vom merge la următorul caracter. Deci, cum sunt presupuneri noastre va repeta? Ei bine, în cazul în care caracterele valide sunt A, B, și c, apoi, dacă am început cu o, se va repeta la b, acesta va repeta la C. C este simbolul nostru Max, deci vom stabili c înapoi la o, simbolul minim. Și apoi vom repeta index la caracterul următor. Deci, dacă ghici inițial a fost c, următorul Caracterul va fi nul terminator. Aici, observăm că în cazul în care personajul că acum doresc să creșterea a fost nul Terminator, apoi am de gând să-l setat la Simbolul minim. Deci, dacă ghici era c, atunci noastră noi ghici va fi aa. Și dacă ghici noastră inițială a fost CCCC, atunci noul nostru ghici va fi aaaaa. Deci, ori de câte ori ajungem șirul maxim de o anumită lungime, atunci suntem de gând să pună în aplicare în șir minim din lungimea următor, care va fie doar toate caracterele din simbolul minim. Acum, ceea ce face această verificare aici? Ei bine, în cazul în care indicele mutat de la a opta caracter de nouă caractere - așa că am adăuga opt c ca anterior nostru ghici - apoi indicele este de gând să se concentreze pe ultima null terminator de presupunere noastre matrice, care nu are menirea de a efectiv fi utilizat în parolă nostru. Deci, dacă ne concentram pe ultima nul terminator, atunci nu am gasit o parola care este valabil folosind doar opt caractere, ceea ce înseamnă nu există nici parolă validă care criptează la șir dat. Și ne-am pentru a imprima ca, spunând nu am putut găsi o valid parola, și retur. Deci, aceasta în timp ce bucla se va repeta peste toate sforile posibile. În cazul în care se constată că orice criptează a string criptat de asteptat, acesta va returna că parola. Și nu găsi nimic, atunci va reveni, de a imprima o nu a fost în stare să găsească nimic. Acum, observați că iterarea peste tot posibile siruri de caractere este, probabil, va ia ceva timp. Să vedem de fapt ce lung, care să ia. Să facem fisura. Ei bine, oops - se spune nedefinit trimitere la cripta. Deci, amintiți-vă, pentru p seturi de spec. și De asemenea, pagina de manual pentru cripta pe care le au nevoie pentru a lega în cripta. Acum, implicit face comanda nu știi că doriți să utilizați această funcție. Așa că haideți să copiați această comandă client și trebuie doar să adăugați pe la sfârșitul de ea, leagă cripta. Acum, se compilează. Deci, haideți să ruleze crăpătură pe o anumită string criptat - așa lui Cezar. Așa că a fost destul de repede. Observați că aceasta sa încheiat pe 13. Ei bine, parole criptate lui Cezar se întâmplă să fie 13. Deci, haideți să încercăm o altă parolă. Să luăm criptat Hirschhorn lui parola și încercați cracare asta. Deci observa deja am ajuns trei personaje. Și suntem iterarea peste tot posibil siruri de trei caractere. Asta înseamnă că deja am terminat iterarea peste tot una posibile și două șiruri de caractere. Acum, se pare ca acest lucru se va ia ceva timp înainte de a ajunge la siruri de patru caractere. Ar putea dura câteva minute. Ea nu a luat o pereche de minute. Suntem pe siruri de caractere de patru caractere. Dar acum, avem nevoie de a repeta peste tot posibile șiruri de patru caractere, care care ar putea dura poate 10 minute. Și atunci când vom ajunge la cinci caractere siruri de caractere, avem nevoie pentru a repeta peste tot celor, care ar putea dura câteva ore. Și avem nevoie pentru a repeta peste tot posibil șase caractere siruri de caractere, care ar putea dura câteva zile și așa mai departe. Deci, s-ar putea lua o potential foarte lung timp pentru a repeta peste tot posibil opt caractere și mai puține siruri de caractere. Astfel observa că acest lucru nu este neapărat un algoritm foarte eficient pentru găsirea o parolă. Ai putea crede că acolo sunt modalități mai bune. De exemplu, zyx parola! 32ab probabil nu este o parolă foarte frecvente, întrucât parola 12345 este probabil, mult mai frecvente. Deci, un mod de a încerca să găsească o parolă mai repede este să te uiți doar la parole care sunt mai frecvente. Deci, de exemplu, putem încerca să citească cuvinte de la un dicționar și încercați toate aceste cuvinte ca presupuneri noastre parolă. Acum, poate o parolă nu este atât de simplu. Poate că utilizatorul a fost destul de inteligent și încercați să adăugați un număr de sfârșitul unui cuvânt. Poate parola lor a fost password1. Astfel, puteți încerca iterarea peste toate cuvintele în dicționarul cu un singur anexat la sfârșitul anului acesta. Și poate, după ce face asta, veți adăugați un doi la sfârșitul anului acesta. Sau poate utilizatorul încearcă să fie chiar mai inteligent, și ei vor lor parola pentru a fi "hacker", dar sunt va înlocui toate instanțele de E-uri cu trei. Deci, ai putea face acest lucru prea. Repeta peste toate cuvintele din dicționar dar înlocuiți caractere care arata ca numere cu aceste numere. Deci, în acest fel, s-ar putea prinde chiar mai mult parole, care sunt destul de comune. Dar în cele din urmă, singura modalitate puteți captura toate parolele este de a brută forțeze itera peste tot posibile siruri de caractere. Deci, în final, aveți nevoie pentru a repeta peste toate siruri de caractere de la un personaj la opt caractere, care ar putea avea un foarte mult timp, dar trebuie să-l facă. Numele meu este Rob Bowden. Și acest lucru este Crack.