1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Ek is Rob, en Kom ons kry krake. 3 00:00:15,890 --> 00:00:19,390 So onthou van die pset spec wat ons gaan word benodig om die gebruik 4 00:00:19,390 --> 00:00:20,890 grafkelder funksie. 5 00:00:20,890 --> 00:00:26,330 Vir die man page, het ons twee hash definieer _xopensource. 6 00:00:26,330 --> 00:00:28,290 Moenie bekommerd wees oor hoekom ons nodig het om dit te doen. 7 00:00:28,290 --> 00:00:31,550 En ook hash sluit unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> So een keer is dit uit die pad, laat kry om die werklike program. 9 00:00:35,920 --> 00:00:39,570 Eerste ding wat ons moet doen, is om seker te maak die gebruiker het 'n geldige geïnkripteer 10 00:00:39,570 --> 00:00:41,520 wagwoord op die command line. 11 00:00:41,520 --> 00:00:46,050 Onthou dat die program is veronderstel om te loop soos dot streep kraak, en 12 00:00:46,050 --> 00:00:48,120 dan geïnkripteer string. 13 00:00:48,120 --> 00:00:52,990 >> So hier is ons nagaan om seker te maak dat argc tot twee as ons wil 14 00:00:52,990 --> 00:00:54,380 voortgaan met die program. 15 00:00:54,380 --> 00:00:58,830 As argc is nie twee nie, wat beteken dat óf die gebruiker het nie 'n geïnkripteer 16 00:00:58,830 --> 00:01:02,560 wagwoord op die command line, of hulle het meer as net die geïnkripteer 17 00:01:02,560 --> 00:01:05,379 wagwoord op die command line, waarin geval ons weet nie wat om te doen met die 18 00:01:05,379 --> 00:01:07,660 command line argumente. 19 00:01:07,660 --> 00:01:11,390 >> So as argc was twee, kan ons voortgaan. 20 00:01:11,390 --> 00:01:14,160 En hier, ons gaan om te verklaar 'n veranderlike geïnkripteer. 21 00:01:14,160 --> 00:01:17,650 Dit is net gaan om te alias die oorspronklike argv1 sodat in hierdie 22 00:01:17,650 --> 00:01:20,690 program, het ons nie om te noem dit argv1, wat dan moet jy dink 23 00:01:20,690 --> 00:01:22,950 oor wat dit eintlik bedoel. 24 00:01:22,950 --> 00:01:27,180 >> So uiteindelik, ons wil hê dat te bekragtig die geënkripteerde wagwoord van die gebruiker 25 00:01:27,180 --> 00:01:30,840 het eintlik kon gewees het 'n geïnkripteer wagwoord. 26 00:01:30,840 --> 00:01:35,120 Per die man bladsy van die grafkelder, die geënkripteerde wagwoord moet wees 13 27 00:01:35,120 --> 00:01:36,440 karakters lank wees. 28 00:01:36,440 --> 00:01:41,500 Hier, sien dat ons hash gedefinieer enkripteer lengte as 13. 29 00:01:41,500 --> 00:01:46,140 So ons is maar net om seker te maak dat die string lengte van die geïnkripteer 30 00:01:46,140 --> 00:01:49,090 wagwoord is 13. 31 00:01:49,090 --> 00:01:52,280 >> En as dit is nie, ons wil die program te verlaat. 32 00:01:52,280 --> 00:01:56,470 So een keer dit is uit die weg geruim is, kan ons nou eintlik probeer om uit te vind wat die 33 00:01:56,470 --> 00:02:00,410 wagwoord wat het die encrypted wagwoord was. 34 00:02:00,410 --> 00:02:04,870 Hier wil ons die sout te gryp van die geïnkripteer wagwoord. 35 00:02:04,870 --> 00:02:08,930 Onthou, volgens die man bladsy, dat die eerste twee karakters van 'n geïnkripteer 36 00:02:08,930 --> 00:02:10,590 string, soos hier - 37 00:02:10,590 --> 00:02:12,770 50ZPJ en so aan - 38 00:02:12,770 --> 00:02:16,170 die eerste twee karakters gee ons die sout wat gebruik is om 39 00:02:16,170 --> 00:02:18,080 in die grafkelder funksie. 40 00:02:18,080 --> 00:02:21,740 >> En hier, sien ons dat die sout ha. 41 00:02:21,740 --> 00:02:27,610 So wil ons die eerste twee te kopieer karakters, sout lengte om hash 42 00:02:27,610 --> 00:02:30,230 gedefinieer as twee. 43 00:02:30,230 --> 00:02:35,970 Ons het die eerste twee karakters te kopieer in hierdie reeks, sout. 44 00:02:35,970 --> 00:02:39,340 Let daarop dat ons moet sout lengte plus een aangesien ons nog steeds 'n nul 45 00:02:39,340 --> 00:02:42,440 Terminator aan die einde van ons sout. 46 00:02:42,440 --> 00:02:46,940 >> Daarna het ons gaan hierdie skikking te verklaar, gas, die grootte maksimum lengte plus 47 00:02:46,940 --> 00:02:51,930 een, waar maksimum lengte is hash gedefinieer as agt, aangesien die maksimum wagwoord 48 00:02:51,930 --> 00:02:55,090 is agt karakters lank wees. 49 00:02:55,090 --> 00:02:59,860 En ons gaan om dit te gebruik om te Itereer oor alle moontlike snare wat kon 50 00:02:59,860 --> 00:03:01,430 geldig wees wagwoorde. 51 00:03:01,430 --> 00:03:07,720 So as die geldige karakters in 'n wagwoord was net 'n, b, en c, dan 52 00:03:07,720 --> 00:03:14,970 sou ons Itereer oor 'n, b, c, aa, ba, ca, en so aan, totdat 53 00:03:14,970 --> 00:03:16,690 ons kry om te sien cccccccc - 54 00:03:16,690 --> 00:03:19,600 agt c's. 55 00:03:19,600 --> 00:03:23,620 >> En as ons nie af van 'n geldige wagwoord, dan het ons nodig om te sê dat die 56 00:03:23,620 --> 00:03:26,590 geënkripteerde string was nie geldig te begin. 57 00:03:26,590 --> 00:03:29,970 So nou het ons bereik dit terwyl 1 lus. 58 00:03:29,970 --> 00:03:33,100 Let daarop dat beteken dit is 'n oneindige lus. 59 00:03:33,100 --> 00:03:36,430 >> Let daarop dat daar is geen pouse verklaring binnekant van hierdie oneindige lus. 60 00:03:36,430 --> 00:03:38,570 Daar terugkeer net state. 61 00:03:38,570 --> 00:03:41,210 So het ons nog nooit eintlik verwag die lus om af te sluit. 62 00:03:41,210 --> 00:03:44,750 Ons het net verwag dat die program te verlaat. 63 00:03:44,750 --> 00:03:48,220 Ek het bygevoeg die gedrukte verklaring aan die top van hierdie lus om net te druk 64 00:03:48,220 --> 00:03:51,790 wat ons huidige raaiskoot op wat die wagwoord is. 65 00:03:51,790 --> 00:03:53,630 >> Nou, is wat hierdie lus doen? 66 00:03:53,630 --> 00:03:58,330 Dit is herhaling oor alle moontlike snare wat geldig wagwoorde. 67 00:03:58,330 --> 00:04:02,700 Die eerste ding wat ons gaan doen, is om neem ons huidige raaiskoot vir wat die 68 00:04:02,700 --> 00:04:03,920 wagwoord is. 69 00:04:03,920 --> 00:04:07,230 Ons sal die sout wat ons gegryp uit die geënkripteerde string, en ons is 70 00:04:07,230 --> 00:04:09,850 gaan die raai te enkripteer. 71 00:04:09,850 --> 00:04:14,760 Dit gee ons 'n geïnkripteer raaiskoot, wat ons gaan om teen te vergelyk 72 00:04:14,760 --> 00:04:18,810 die geënkripteerde string wat die gebruiker wat by die command line. 73 00:04:18,810 --> 00:04:23,030 >> As hulle dieselfde is, in welke geval string vergelykbaar sal terugkeer nul, indien 74 00:04:23,030 --> 00:04:28,050 hulle is dieselfde, dan raai was die wagwoord wat gegenereer die geënkripteerde 75 00:04:28,050 --> 00:04:33,520 string, in welke geval ons kan druk dat as ons vergeet en terugkeer. 76 00:04:33,520 --> 00:04:37,520 Maar as hulle nie dieselfde nie, wat beteken dat ons raaiskoot was verkeerd. 77 00:04:37,520 --> 00:04:43,250 >> En ons wil Itereer te die volgende geldige raaiskoot. 78 00:04:43,250 --> 00:04:46,410 So dit is wat dit terwyl lus is probeer om te doen. 79 00:04:46,410 --> 00:04:51,760 Dit gaan ons raaiskoot te Itereer na die volgende geldige raaiskoot. 80 00:04:51,760 --> 00:04:56,080 Let daarop dat wanneer ons sê dat 'n spesifieke karakter in ons raaiskoot het 81 00:04:56,080 --> 00:05:01,770 bereik die maksimum simbool, wat hier is hash gedefinieer as 'n tilde, aangesien 82 00:05:01,770 --> 00:05:05,710 dit is die grootste ASCII waarde karakter dat 'n gebruiker kan inskryf by die 83 00:05:05,710 --> 00:05:11,210 klawerbord, wanneer die karakter bereik die Max simbool, dan wil ons te stuur 84 00:05:11,210 --> 00:05:17,150 dit terug na die minimum simbool, wat is 'n ruimte, weer die laagste ASCII 85 00:05:17,150 --> 00:05:20,800 waarde simbool wat 'n gebruiker kan tree op die sleutelbord. 86 00:05:20,800 --> 00:05:22,940 >> So ons gaan dit op te stel aan die minimum-simbool. 87 00:05:22,940 --> 00:05:25,720 En dan moet ons gaan om te gaan op na die volgende karakter. 88 00:05:25,720 --> 00:05:28,730 So, hoe is ons raai gaan Itereer? 89 00:05:28,730 --> 00:05:33,685 Wel, as die geldige karakters is 'n, b, en c, dan as ons begin met 'n, 90 00:05:33,685 --> 00:05:36,630 dit sal Itereer te b, dit sal Itereer tot c. 91 00:05:36,630 --> 00:05:44,360 c is ons Max simbool, so ons sal stel c terug na 'n, die minimum simbool. 92 00:05:44,360 --> 00:05:48,100 En dan sal ons Itereer indeks na die volgende karakter. 93 00:05:48,100 --> 00:05:53,920 >> So as die oorspronklike raaiskoot was c, is die volgende karakter gaan die nul wees 94 00:05:53,920 --> 00:05:55,560 Terminator. 95 00:05:55,560 --> 00:06:00,670 Hier, agterkom dat as die karakter dat ons nou wil 96 00:06:00,670 --> 00:06:04,690 verhoging was die nul terminator, dan moet ons gaan om dit in te stel na die 97 00:06:04,690 --> 00:06:06,260 minimum simbool. 98 00:06:06,260 --> 00:06:11,431 So as die raaiskoot was c, dan is ons nuwe raaiskoot gaan wees aa. 99 00:06:11,431 --> 00:06:16,050 En as ons oorspronklike raaiskoot was CCCC, dan is ons nuwe raaiskoot 100 00:06:16,050 --> 00:06:18,380 gaan wees aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> So wanneer ons die maksimum string van 'n gegewe lengte, dan is ons 102 00:06:24,430 --> 00:06:29,090 gaan implementeer om die minimum string van die volgende lengte, wat sal 103 00:06:29,090 --> 00:06:34,420 net al die karakters van die minimum-simbool. 104 00:06:34,420 --> 00:06:36,970 Nou, is wat hierdie tjek hier? 105 00:06:36,970 --> 00:06:42,780 Wel, as indeks verskuif van die agtste karakter van die nege karakter - 106 00:06:42,780 --> 00:06:46,460 sodat ons voeg agt c se as ons vorige raai - 107 00:06:46,460 --> 00:06:51,270 dan indeks gaan om te fokus op die laaste nul terminator van ons raaiskoot 108 00:06:51,270 --> 00:06:57,990 skikking, wat nie bedoel is om werklik gebruik word in ons wagwoord. 109 00:06:57,990 --> 00:07:03,530 >> So as ons is gefokus op die laaste null Terminator, dan het ons nog nie gevind nie 'n 110 00:07:03,530 --> 00:07:07,750 wagwoord wat is geldig net agt gebruik karakters, wat beteken dat daar geen 111 00:07:07,750 --> 00:07:10,550 geldige wagwoord wat versleutelt die gegewe string. 112 00:07:10,550 --> 00:07:13,520 En ons het wat om te druk, sê Ons kan nie 'n geldige 113 00:07:13,520 --> 00:07:16,100 wagwoord en terugkeer. 114 00:07:16,100 --> 00:07:20,280 So dit terwyl lus gaan Itereer oor alle moontlike snare. 115 00:07:20,280 --> 00:07:24,640 >> As dit bevind dat enige versleutelt die verwag geënkripteerde string, dit sal 116 00:07:24,640 --> 00:07:26,190 terug te keer dat die wagwoord. 117 00:07:26,190 --> 00:07:29,610 En dit nie kry nie, dan dit sal terugkeer, druk dat dit 118 00:07:29,610 --> 00:07:31,910 was nie in staat om iets te vind. 119 00:07:31,910 --> 00:07:39,220 Nou, sien dat iterating oor die hele moontlik snare is waarskynlik gaan om te 120 00:07:39,220 --> 00:07:40,420 'n rukkie neem. 121 00:07:40,420 --> 00:07:43,590 Kom ons eintlik sien hoe lank dat neem. 122 00:07:43,590 --> 00:07:47,230 >> Kom ons maak kraak. 123 00:07:47,230 --> 00:07:51,050 Wel, oops - dit sê undefined verwysing na grafkelder. 124 00:07:51,050 --> 00:07:55,330 So onthou, vir die p stel spec en ook die man-bladsy vir grafkelder dat ons 125 00:07:55,330 --> 00:07:58,130 nodig het om te skakel in grafkelder. 126 00:07:58,130 --> 00:08:01,130 Nou, is die verstek maak opdrag weet nie dat jy 127 00:08:01,130 --> 00:08:03,010 wil hê dat die funksie te gebruik. 128 00:08:03,010 --> 00:08:09,680 >> So laat kopieer hierdie kliënt opdrag en voeg net aan die einde 129 00:08:09,680 --> 00:08:13,300 daarvan, skakel grafkelder. 130 00:08:13,300 --> 00:08:14,820 Nou, dit stel. 131 00:08:14,820 --> 00:08:23,880 So laat loop crack op 'n gegewe geënkripteerde string - 132 00:08:23,880 --> 00:08:25,130 so keiser s'n. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 So dit was redelik vinnig. 135 00:08:30,790 --> 00:08:33,230 >> Let daarop dat hierdie geëindig op 13. 136 00:08:33,230 --> 00:08:38,240 Wel, Caesar se geënkripteerde wagwoord gebeur om te wees 13. 137 00:08:38,240 --> 00:08:41,650 So laat ons probeer om 'n ander wagwoord. 138 00:08:41,650 --> 00:08:45,830 Kom ons neem Hirschhorn se encrypted wagwoord en probeer kraak dit. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> So sien ons reeds bereik het drie karakters. 141 00:08:55,110 --> 00:08:58,660 En ons iterating oor alle moontlike drie-karakter snare. 142 00:08:58,660 --> 00:09:01,420 Dit beteken dat ons reeds voltooi iterating oor alle moontlike een-en- 143 00:09:01,420 --> 00:09:04,660 twee karakter snare. 144 00:09:04,660 --> 00:09:09,180 Nou, dit lyk asof dit gaan 'n rukkie neem voor ons by die 145 00:09:09,180 --> 00:09:10,580 Vier-karakter snare. 146 00:09:10,580 --> 00:09:14,680 Dit mag dalk 'n paar minute. 147 00:09:14,680 --> 00:09:16,055 >> Dit het nie 'n paar minute. 148 00:09:16,055 --> 00:09:18,450 Ons is op die vier-karakter snare. 149 00:09:18,450 --> 00:09:22,800 Maar nou het ons nodig het om te Itereer oor die hele moontlik vier-karakter snare, wat 150 00:09:22,800 --> 00:09:26,000 wat kan miskien neem 10 minute. 151 00:09:26,000 --> 00:09:28,720 En dan wanneer ons by vyf karakter snare, ons moet Itereer oor die hele 152 00:09:28,720 --> 00:09:31,450 van diegene wat moontlik neem 'n paar uur. 153 00:09:31,450 --> 00:09:34,080 En ons moet Itereer oor alle moontlike ses-karakter snare, wat 154 00:09:34,080 --> 00:09:36,560 kon neem 'n paar dae en so aan. 155 00:09:36,560 --> 00:09:41,380 >> So dit kan 'n potensieel baie lang tyd om te Itereer oor alle moontlike 156 00:09:41,380 --> 00:09:44,850 agt-karakter en minder snare. 157 00:09:44,850 --> 00:09:50,600 So sien dat dit nie noodwendig 'n baie doeltreffende algoritme vir die vind van 158 00:09:50,600 --> 00:09:51,860 'n wagwoord. 159 00:09:51,860 --> 00:09:54,540 Jy mag dalk dink dat daar is beter maniere. 160 00:09:54,540 --> 00:10:02,230 Byvoorbeeld, die wagwoord zyx! 32AB is waarskynlik nie 'n baie algemene wagwoord 161 00:10:02,230 --> 00:10:06,440 terwyl die wagwoord 12345 waarskynlik 'n baie meer algemeen. 162 00:10:06,440 --> 00:10:13,570 >> So 'n manier om te probeer om 'n wagwoord te vind vinniger is om net te kyk 163 00:10:13,570 --> 00:10:15,560 by wagwoorde wat meer algemeen is. 164 00:10:15,560 --> 00:10:20,480 So byvoorbeeld, kan ons probeer om woorde te lees van 'n woordeboek en probeer al 165 00:10:20,480 --> 00:10:24,860 daardie woorde as ons wagwoord raai. 166 00:10:24,860 --> 00:10:29,210 Nou, miskien 'n wagwoord is nie so eenvoudig nie. 167 00:10:29,210 --> 00:10:32,600 Dalk is dit die gebruiker was ietwat slim en probeer om die aanbring van 'n aantal te 168 00:10:32,600 --> 00:10:34,220 die einde van 'n woord. 169 00:10:34,220 --> 00:10:37,000 >> So miskien is die wagwoord was password1. 170 00:10:37,000 --> 00:10:41,520 So jy kan probeer iterating oor al die woorde in die woordeboek met 'n een 171 00:10:41,520 --> 00:10:43,210 aangeheg aan die einde van dit. 172 00:10:43,210 --> 00:10:47,360 En dan miskien na te doen, sal jy voeg 'n twee tot die einde van dit. 173 00:10:47,360 --> 00:10:50,240 >> Of miskien die gebruiker probeer om selfs meer slim, en hulle wil hulle 174 00:10:50,240 --> 00:10:54,980 wagwoord te wees "hacker", maar hulle is gaan alle gevalle van e's te vervang 175 00:10:54,980 --> 00:10:56,600 met drieë. 176 00:10:56,600 --> 00:10:58,440 So jy kan doen dit ook. 177 00:10:58,440 --> 00:11:02,100 Itereer oor al die woorde in die woordeboek maar vervang karakters wat 178 00:11:02,100 --> 00:11:04,790 lyk soos getalle met dié nommers. 179 00:11:04,790 --> 00:11:09,670 >> So op hierdie manier, kan jy vang selfs meer wagwoorde wat redelik algemeen. 180 00:11:09,670 --> 00:11:14,690 Maar in die einde, die enigste manier wat jy kan vang al die wagwoorde is om brute 181 00:11:14,690 --> 00:11:17,340 dwing Itereer oor die hele moontlik snare. 182 00:11:17,340 --> 00:11:22,100 So op die ou end, het jy nodig om Itereer oor al die snare van die een karakter 183 00:11:22,100 --> 00:11:28,110 agt karakters, wat dalk 'n n baie lang tyd, maar jy moet om dit te doen. 184 00:11:28,110 --> 00:11:30,024 >> My naam is Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 En dit is kraak. 186 00:11:31,425 --> 00:11:36,533