1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Sunt Rob, și Să dăm bătaie. 3 00:00:15,890 --> 00:00:19,390 Deci, amintiți-vă de la spec. PSET care vom avea nevoie să utilizeze 4 00:00:19,390 --> 00:00:20,890 crypt funcția. 5 00:00:20,890 --> 00:00:26,330 Pentru pagina de om, avem doi hash defini _xopensource. 6 00:00:26,330 --> 00:00:28,290 Nu vă faceți griji cu privire la ce avem nevoie pentru a face acest lucru. 7 00:00:28,290 --> 00:00:31,550 Și, de asemenea hash includ unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Deci, odată ce a ieșit din drum, să ajunge la programul actual. 9 00:00:35,920 --> 00:00:39,570 Primul lucru pe care trebuie să faceți este să vă asigurați utilizatorul a introdus o criptat valabil 10 00:00:39,570 --> 00:00:41,520 parola de la linia de comandă. 11 00:00:41,520 --> 00:00:46,050 Amintiți-vă că programul este presupus pentru a fi rulat ca punct slash crack, și 12 00:00:46,050 --> 00:00:48,120 apoi string criptat. 13 00:00:48,120 --> 00:00:52,990 >> Deci, aici suntem de verificare pentru a se asigura care argc a doua, dacă vrem să 14 00:00:52,990 --> 00:00:54,380 continua cu programul. 15 00:00:54,380 --> 00:00:58,830 Dacă argc nu este de doi, care înseamnă fie utilizatorul nu a introduce o criptat 16 00:00:58,830 --> 00:01:02,560 parola de la linia de comanda, sau ei a intrat mai mult decât criptat 17 00:01:02,560 --> 00:01:05,379 parola de la linia de comandă, în care caz că nu știu ce să fac cu 18 00:01:05,379 --> 00:01:07,660 argumente în linia de comandă. 19 00:01:07,660 --> 00:01:11,390 >> Deci, dacă argc fost doi, putem continua. 20 00:01:11,390 --> 00:01:14,160 Și aici, vom declara o variabilă criptate. 21 00:01:14,160 --> 00:01:17,650 Care este doar de gând să alias originale argv1 astfel încât pe parcursul acestui 22 00:01:17,650 --> 00:01:20,690 Programul, nu trebuie să spunem argv1, care apoi va trebui să se gândească 23 00:01:20,690 --> 00:01:22,950 despre ceea ce înseamnă că, de fapt. 24 00:01:22,950 --> 00:01:27,180 >> Deci, în final, dorim să valideze că parola criptată utilizator 25 00:01:27,180 --> 00:01:30,840 a intrat ar fi fost de fapt o parolă criptată. 26 00:01:30,840 --> 00:01:35,120 Pe pagina de manual a cripta, parola criptată trebuie să fie 13 27 00:01:35,120 --> 00:01:36,440 caractere. 28 00:01:36,440 --> 00:01:41,500 Aici, observăm că noi hash definit cripta lungime de 13. 29 00:01:41,500 --> 00:01:46,140 Deci, suntem doar asigurându-vă că Lungimea șir de criptat 30 00:01:46,140 --> 00:01:49,090 parola este 13. 31 00:01:49,090 --> 00:01:52,280 >> Și dacă nu e, vrem pentru a ieși din program. 32 00:01:52,280 --> 00:01:56,470 Deci, odată ce a ieșit din drum, putem acum, de fapt încerca să găsească ceea ce 33 00:01:56,470 --> 00:02:00,410 parola pe care a dat criptate parola a fost. 34 00:02:00,410 --> 00:02:04,870 Aici, ne-o dorim pentru a apuca de sare de parola criptat. 35 00:02:04,870 --> 00:02:08,930 Amintiți-vă, pe pagina de om, care Primele două caractere ale unui criptat 36 00:02:08,930 --> 00:02:10,590 șir, ca aici - 37 00:02:10,590 --> 00:02:12,770 50ZPJ și așa mai departe - 38 00:02:12,770 --> 00:02:16,170 primele două caractere da ne sare, care a fost utilizat 39 00:02:16,170 --> 00:02:18,080 în funcția de cripta. 40 00:02:18,080 --> 00:02:21,740 >> Și aici, vedem că sarea a fost ha. 41 00:02:21,740 --> 00:02:27,610 Așa că vrem să copiați primele două caractere, lungimea sare fiind hash 42 00:02:27,610 --> 00:02:30,230 definite ca două. 43 00:02:30,230 --> 00:02:35,970 Avem de a copia primele două caractere în această matrice, sare. 44 00:02:35,970 --> 00:02:39,340 Observați că avem nevoie de lungime sare plus o, deoarece avem nevoie de încă un nul 45 00:02:39,340 --> 00:02:42,440 terminator la sfârșitul sare nostru. 46 00:02:42,440 --> 00:02:46,940 >> Apoi, vom declara această matrice, invitat, de dimensiune lungime max plus 47 00:02:46,940 --> 00:02:51,930 unul, în cazul în care lungimea maximă este hash definit ca opt, deoarece parola maximă 48 00:02:51,930 --> 00:02:55,090 este de opt caractere. 49 00:02:55,090 --> 00:02:59,860 Și vom folosi acest lucru pentru a repeta peste toate sforile posibile care ar putea 50 00:02:59,860 --> 00:03:01,430 fi parole valide. 51 00:03:01,430 --> 00:03:07,720 Deci, dacă caracterele valabil într-un parolă au fost doar a, b și c, apoi 52 00:03:07,720 --> 00:03:14,970 ne-ar repeta peste a, b, c, AA, BA, CA, și așa mai departe, până când 53 00:03:14,970 --> 00:03:16,690 vom ajunge pentru a vedea cccccccc - 54 00:03:16,690 --> 00:03:19,600 opt c lui. 55 00:03:19,600 --> 00:03:23,620 >> Și dacă nu avem în jos un pașaport valabil parola, atunci trebuie să spunem că 56 00:03:23,620 --> 00:03:26,590 string criptat nu a fost valabil pentru a începe cu. 57 00:03:26,590 --> 00:03:29,970 Deci, acum, vom ajunge la asta în timp ce 1 bucla. 58 00:03:29,970 --> 00:03:33,100 Observați că înseamnă că este o buclă infinită. 59 00:03:33,100 --> 00:03:36,430 >> Observați există nici o declarație pauză în interiorul acestui ciclu infinit. 60 00:03:36,430 --> 00:03:38,570 Nu se întoarce doar declarații. 61 00:03:38,570 --> 00:03:41,210 Deci, nu ne așteptăm de fapt pentru a ieși din bucla. 62 00:03:41,210 --> 00:03:44,750 Ne așteptăm doar pentru a ieși din program. 63 00:03:44,750 --> 00:03:48,220 Am adăugat această declarație de imprimare la partea de sus a acestei bucle doar pentru a imprima 64 00:03:48,220 --> 00:03:51,790 Ghici nostru actual de la ce parola este. 65 00:03:51,790 --> 00:03:53,630 >> Acum, ceea ce face această buclă? 66 00:03:53,630 --> 00:03:58,330 Este looping peste toate sforile posibile care ar putea fi parole valide. 67 00:03:58,330 --> 00:04:02,700 Primul lucru pe care am de gând să faceți este să ia ghici noastră actuală pentru ceea ce 68 00:04:02,700 --> 00:04:03,920 parola este. 69 00:04:03,920 --> 00:04:07,230 Vom lua sare pe care l-am prins de la string criptat, iar noi suntem 70 00:04:07,230 --> 00:04:09,850 merge pentru a cripta ghici. 71 00:04:09,850 --> 00:04:14,760 Acest lucru ne va oferi o presupunere criptat, care vom compara împotriva 72 00:04:14,760 --> 00:04:18,810 șir criptată ce utilizatorul a intrat la linia de comandă. 73 00:04:18,810 --> 00:04:23,030 >> Dacă acestea sunt identice, în care caz șir comparabil va reveni la zero, în cazul în care 74 00:04:23,030 --> 00:04:28,050 ei sunt la fel, atunci ghici fost parola care a generat criptat 75 00:04:28,050 --> 00:04:33,520 șir, în cazul în care se poate imprima care ca parola noastră și retur. 76 00:04:33,520 --> 00:04:37,520 Dar dacă ei nu au fost la fel, că înseamnă ghici nostru a fost incorectă. 77 00:04:37,520 --> 00:04:43,250 >> Și vrem să repeta la următoarea ghici valabil. 78 00:04:43,250 --> 00:04:46,410 Deci despre asta în timp ce bucla încearcă să facă. 79 00:04:46,410 --> 00:04:51,760 Se va repeta ghici noastre la următoarea ghici valabil. 80 00:04:51,760 --> 00:04:56,080 Observați că atunci când spunem că o Caracterul special în estimarea noastră are 81 00:04:56,080 --> 00:05:01,770 a ajuns la simbolul Max, care aici este definit ca o distribuire tilda, deoarece 82 00:05:01,770 --> 00:05:05,710 care este cel mai mare personaj valoarea ASCII pe care un utilizator poate introduce la 83 00:05:05,710 --> 00:05:11,210 tastatură, atunci când caracterul ajunge Max simbol, apoi vrem să trimiteți 84 00:05:11,210 --> 00:05:17,150 l înapoi la simbolul minim, care este un spațiu, din nou, mai mic ASCII 85 00:05:17,150 --> 00:05:20,800 simbol valoare pe care un utilizator poate introduce de la tastatura. 86 00:05:20,800 --> 00:05:22,940 >> Deci, vom stabili că la simbolul minim. 87 00:05:22,940 --> 00:05:25,720 Și apoi vom merge la următorul caracter. 88 00:05:25,720 --> 00:05:28,730 Deci, cum sunt presupuneri noastre va repeta? 89 00:05:28,730 --> 00:05:33,685 Ei bine, în cazul în care caracterele valide sunt A, B, și c, apoi, dacă am început cu o, 90 00:05:33,685 --> 00:05:36,630 se va repeta la b, acesta va repeta la C. 91 00:05:36,630 --> 00:05:44,360 C este simbolul nostru Max, deci vom stabili c înapoi la o, simbolul minim. 92 00:05:44,360 --> 00:05:48,100 Și apoi vom repeta index la caracterul următor. 93 00:05:48,100 --> 00:05:53,920 >> Deci, dacă ghici inițial a fost c, următorul Caracterul va fi nul 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Aici, observăm că în cazul în care personajul că acum doresc să 96 00:06:00,670 --> 00:06:04,690 creșterea a fost nul Terminator, apoi am de gând să-l setat la 97 00:06:04,690 --> 00:06:06,260 Simbolul minim. 98 00:06:06,260 --> 00:06:11,431 Deci, dacă ghici era c, atunci noastră noi ghici va fi aa. 99 00:06:11,431 --> 00:06:16,050 Și dacă ghici noastră inițială a fost CCCC, atunci noul nostru ghici 100 00:06:16,050 --> 00:06:18,380 va fi aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Deci, ori de câte ori ajungem șirul maxim de o anumită lungime, atunci suntem 102 00:06:24,430 --> 00:06:29,090 de gând să pună în aplicare în șir minim din lungimea următor, care va 103 00:06:29,090 --> 00:06:34,420 fie doar toate caracterele din simbolul minim. 104 00:06:34,420 --> 00:06:36,970 Acum, ceea ce face această verificare aici? 105 00:06:36,970 --> 00:06:42,780 Ei bine, în cazul în care indicele mutat de la a opta caracter de nouă caractere - 106 00:06:42,780 --> 00:06:46,460 așa că am adăuga opt c ca anterior nostru ghici - 107 00:06:46,460 --> 00:06:51,270 apoi indicele este de gând să se concentreze pe ultima null terminator de presupunere noastre 108 00:06:51,270 --> 00:06:57,990 matrice, care nu are menirea de a efectiv fi utilizat în parolă nostru. 109 00:06:57,990 --> 00:07:03,530 >> Deci, dacă ne concentram pe ultima nul terminator, atunci nu am gasit o 110 00:07:03,530 --> 00:07:07,750 parola care este valabil folosind doar opt caractere, ceea ce înseamnă nu există nici 111 00:07:07,750 --> 00:07:10,550 parolă validă care criptează la șir dat. 112 00:07:10,550 --> 00:07:13,520 Și ne-am pentru a imprima ca, spunând nu am putut găsi o valid 113 00:07:13,520 --> 00:07:16,100 parola, și retur. 114 00:07:16,100 --> 00:07:20,280 Deci, aceasta în timp ce bucla se va repeta peste toate sforile posibile. 115 00:07:20,280 --> 00:07:24,640 >> În cazul în care se constată că orice criptează a string criptat de asteptat, acesta va 116 00:07:24,640 --> 00:07:26,190 returna că parola. 117 00:07:26,190 --> 00:07:29,610 Și nu găsi nimic, atunci va reveni, de a imprima o 118 00:07:29,610 --> 00:07:31,910 nu a fost în stare să găsească nimic. 119 00:07:31,910 --> 00:07:39,220 Acum, observați că iterarea peste tot posibile siruri de caractere este, probabil, va 120 00:07:39,220 --> 00:07:40,420 ia ceva timp. 121 00:07:40,420 --> 00:07:43,590 Să vedem de fapt ce lung, care să ia. 122 00:07:43,590 --> 00:07:47,230 >> Să facem fisura. 123 00:07:47,230 --> 00:07:51,050 Ei bine, oops - se spune nedefinit trimitere la cripta. 124 00:07:51,050 --> 00:07:55,330 Deci, amintiți-vă, pentru p seturi de spec. și De asemenea, pagina de manual pentru cripta pe care le 125 00:07:55,330 --> 00:07:58,130 au nevoie pentru a lega în cripta. 126 00:07:58,130 --> 00:08:01,130 Acum, implicit face comanda nu știi că 127 00:08:01,130 --> 00:08:03,010 doriți să utilizați această funcție. 128 00:08:03,010 --> 00:08:09,680 >> Așa că haideți să copiați această comandă client și trebuie doar să adăugați pe la sfârșitul 129 00:08:09,680 --> 00:08:13,300 de ea, leagă cripta. 130 00:08:13,300 --> 00:08:14,820 Acum, se compilează. 131 00:08:14,820 --> 00:08:23,880 Deci, haideți să ruleze crăpătură pe o anumită string criptat - 132 00:08:23,880 --> 00:08:25,130 așa lui Cezar. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Așa că a fost destul de repede. 135 00:08:30,790 --> 00:08:33,230 >> Observați că aceasta sa încheiat pe 13. 136 00:08:33,230 --> 00:08:38,240 Ei bine, parole criptate lui Cezar se întâmplă să fie 13. 137 00:08:38,240 --> 00:08:41,650 Deci, haideți să încercăm o altă parolă. 138 00:08:41,650 --> 00:08:45,830 Să luăm criptat Hirschhorn lui parola și încercați cracare asta. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Deci observa deja am ajuns trei personaje. 141 00:08:55,110 --> 00:08:58,660 Și suntem iterarea peste tot posibil siruri de trei caractere. 142 00:08:58,660 --> 00:09:01,420 Asta înseamnă că deja am terminat iterarea peste tot una posibile și 143 00:09:01,420 --> 00:09:04,660 două șiruri de caractere. 144 00:09:04,660 --> 00:09:09,180 Acum, se pare ca acest lucru se va ia ceva timp înainte de a ajunge la 145 00:09:09,180 --> 00:09:10,580 siruri de patru caractere. 146 00:09:10,580 --> 00:09:14,680 Ar putea dura câteva minute. 147 00:09:14,680 --> 00:09:16,055 >> Ea nu a luat o pereche de minute. 148 00:09:16,055 --> 00:09:18,450 Suntem pe siruri de caractere de patru caractere. 149 00:09:18,450 --> 00:09:22,800 Dar acum, avem nevoie de a repeta peste tot posibile șiruri de patru caractere, care 150 00:09:22,800 --> 00:09:26,000 care ar putea dura poate 10 minute. 151 00:09:26,000 --> 00:09:28,720 Și atunci când vom ajunge la cinci caractere siruri de caractere, avem nevoie pentru a repeta peste tot 152 00:09:28,720 --> 00:09:31,450 celor, care ar putea dura câteva ore. 153 00:09:31,450 --> 00:09:34,080 Și avem nevoie pentru a repeta peste tot posibil șase caractere siruri de caractere, care 154 00:09:34,080 --> 00:09:36,560 ar putea dura câteva zile și așa mai departe. 155 00:09:36,560 --> 00:09:41,380 >> Deci, s-ar putea lua o potential foarte lung timp pentru a repeta peste tot posibil 156 00:09:41,380 --> 00:09:44,850 opt caractere și mai puține siruri de caractere. 157 00:09:44,850 --> 00:09:50,600 Astfel observa că acest lucru nu este neapărat un algoritm foarte eficient pentru găsirea 158 00:09:50,600 --> 00:09:51,860 o parolă. 159 00:09:51,860 --> 00:09:54,540 Ai putea crede că acolo sunt modalități mai bune. 160 00:09:54,540 --> 00:10:02,230 De exemplu, zyx parola! 32ab probabil nu este o parolă foarte frecvente, 161 00:10:02,230 --> 00:10:06,440 întrucât parola 12345 este probabil, mult mai frecvente. 162 00:10:06,440 --> 00:10:13,570 >> Deci, un mod de a încerca să găsească o parolă mai repede este să te uiți doar 163 00:10:13,570 --> 00:10:15,560 la parole care sunt mai frecvente. 164 00:10:15,560 --> 00:10:20,480 Deci, de exemplu, putem încerca să citească cuvinte de la un dicționar și încercați toate 165 00:10:20,480 --> 00:10:24,860 aceste cuvinte ca presupuneri noastre parolă. 166 00:10:24,860 --> 00:10:29,210 Acum, poate o parolă nu este atât de simplu. 167 00:10:29,210 --> 00:10:32,600 Poate că utilizatorul a fost destul de inteligent și încercați să adăugați un număr de 168 00:10:32,600 --> 00:10:34,220 sfârșitul unui cuvânt. 169 00:10:34,220 --> 00:10:37,000 >> Poate parola lor a fost password1. 170 00:10:37,000 --> 00:10:41,520 Astfel, puteți încerca iterarea peste toate cuvintele în dicționarul cu un singur 171 00:10:41,520 --> 00:10:43,210 anexat la sfârșitul anului acesta. 172 00:10:43,210 --> 00:10:47,360 Și poate, după ce face asta, veți adăugați un doi la sfârșitul anului acesta. 173 00:10:47,360 --> 00:10:50,240 >> Sau poate utilizatorul încearcă să fie chiar mai inteligent, și ei vor lor 174 00:10:50,240 --> 00:10:54,980 parola pentru a fi "hacker", dar sunt va înlocui toate instanțele de E-uri 175 00:10:54,980 --> 00:10:56,600 cu trei. 176 00:10:56,600 --> 00:10:58,440 Deci, ai putea face acest lucru prea. 177 00:10:58,440 --> 00:11:02,100 Repeta peste toate cuvintele din dicționar dar înlocuiți caractere care 178 00:11:02,100 --> 00:11:04,790 arata ca numere cu aceste numere. 179 00:11:04,790 --> 00:11:09,670 >> Deci, în acest fel, s-ar putea prinde chiar mai mult parole, care sunt destul de comune. 180 00:11:09,670 --> 00:11:14,690 Dar în cele din urmă, singura modalitate puteți captura toate parolele este de a brută 181 00:11:14,690 --> 00:11:17,340 forțeze itera peste tot posibile siruri de caractere. 182 00:11:17,340 --> 00:11:22,100 Deci, în final, aveți nevoie pentru a repeta peste toate siruri de caractere de la un personaj la 183 00:11:22,100 --> 00:11:28,110 opt caractere, care ar putea avea un foarte mult timp, dar trebuie să-l facă. 184 00:11:28,110 --> 00:11:30,024 >> Numele meu este Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 Și acest lucru este Crack. 186 00:11:31,425 --> 00:11:36,533