ROB BOWDEN: Ek is Rob, en Kom ons kry krake. So onthou van die pset spec wat ons gaan word benodig om die gebruik grafkelder funksie. Vir die man page, het ons twee hash definieer _xopensource. Moenie bekommerd wees oor hoekom ons nodig het om dit te doen. En ook hash sluit unistd.h. So een keer is dit uit die pad, laat kry om die werklike program. Eerste ding wat ons moet doen, is om seker te maak die gebruiker het 'n geldige geïnkripteer wagwoord op die command line. Onthou dat die program is veronderstel om te loop soos dot streep kraak, en dan geïnkripteer string. So hier is ons nagaan om seker te maak dat argc tot twee as ons wil voortgaan met die program. As argc is nie twee nie, wat beteken dat óf die gebruiker het nie 'n geïnkripteer wagwoord op die command line, of hulle het meer as net die geïnkripteer wagwoord op die command line, waarin geval ons weet nie wat om te doen met die command line argumente. So as argc was twee, kan ons voortgaan. En hier, ons gaan om te verklaar 'n veranderlike geïnkripteer. Dit is net gaan om te alias die oorspronklike argv1 sodat in hierdie program, het ons nie om te noem dit argv1, wat dan moet jy dink oor wat dit eintlik bedoel. So uiteindelik, ons wil hê dat te bekragtig die geënkripteerde wagwoord van die gebruiker het eintlik kon gewees het 'n geïnkripteer wagwoord. Per die man bladsy van die grafkelder, die geënkripteerde wagwoord moet wees 13 karakters lank wees. Hier, sien dat ons hash gedefinieer enkripteer lengte as 13. So ons is maar net om seker te maak dat die string lengte van die geïnkripteer wagwoord is 13. En as dit is nie, ons wil die program te verlaat. So een keer dit is uit die weg geruim is, kan ons nou eintlik probeer om uit te vind wat die wagwoord wat het die encrypted wagwoord was. Hier wil ons die sout te gryp van die geïnkripteer wagwoord. Onthou, volgens die man bladsy, dat die eerste twee karakters van 'n geïnkripteer string, soos hier - 50ZPJ en so aan - die eerste twee karakters gee ons die sout wat gebruik is om in die grafkelder funksie. En hier, sien ons dat die sout ha. So wil ons die eerste twee te kopieer karakters, sout lengte om hash gedefinieer as twee. Ons het die eerste twee karakters te kopieer in hierdie reeks, sout. Let daarop dat ons moet sout lengte plus een aangesien ons nog steeds 'n nul Terminator aan die einde van ons sout. Daarna het ons gaan hierdie skikking te verklaar, gas, die grootte maksimum lengte plus een, waar maksimum lengte is hash gedefinieer as agt, aangesien die maksimum wagwoord is agt karakters lank wees. En ons gaan om dit te gebruik om te Itereer oor alle moontlike snare wat kon geldig wees wagwoorde. So as die geldige karakters in 'n wagwoord was net 'n, b, en c, dan sou ons Itereer oor 'n, b, c, aa, ba, ca, en so aan, totdat ons kry om te sien cccccccc - agt c's. En as ons nie af van 'n geldige wagwoord, dan het ons nodig om te sê dat die geënkripteerde string was nie geldig te begin. So nou het ons bereik dit terwyl 1 lus. Let daarop dat beteken dit is 'n oneindige lus. Let daarop dat daar is geen pouse verklaring binnekant van hierdie oneindige lus. Daar terugkeer net state. So het ons nog nooit eintlik verwag die lus om af te sluit. Ons het net verwag dat die program te verlaat. Ek het bygevoeg die gedrukte verklaring aan die top van hierdie lus om net te druk wat ons huidige raaiskoot op wat die wagwoord is. Nou, is wat hierdie lus doen? Dit is herhaling oor alle moontlike snare wat geldig wagwoorde. Die eerste ding wat ons gaan doen, is om neem ons huidige raaiskoot vir wat die wagwoord is. Ons sal die sout wat ons gegryp uit die geënkripteerde string, en ons is gaan die raai te enkripteer. Dit gee ons 'n geïnkripteer raaiskoot, wat ons gaan om teen te vergelyk die geënkripteerde string wat die gebruiker wat by die command line. As hulle dieselfde is, in welke geval string vergelykbaar sal terugkeer nul, indien hulle is dieselfde, dan raai was die wagwoord wat gegenereer die geënkripteerde string, in welke geval ons kan druk dat as ons vergeet en terugkeer. Maar as hulle nie dieselfde nie, wat beteken dat ons raaiskoot was verkeerd. En ons wil Itereer te die volgende geldige raaiskoot. So dit is wat dit terwyl lus is probeer om te doen. Dit gaan ons raaiskoot te Itereer na die volgende geldige raaiskoot. Let daarop dat wanneer ons sê dat 'n spesifieke karakter in ons raaiskoot het bereik die maksimum simbool, wat hier is hash gedefinieer as 'n tilde, aangesien dit is die grootste ASCII waarde karakter dat 'n gebruiker kan inskryf by die klawerbord, wanneer die karakter bereik die Max simbool, dan wil ons te stuur dit terug na die minimum simbool, wat is 'n ruimte, weer die laagste ASCII waarde simbool wat 'n gebruiker kan tree op die sleutelbord. So ons gaan dit op te stel aan die minimum-simbool. En dan moet ons gaan om te gaan op na die volgende karakter. So, hoe is ons raai gaan Itereer? Wel, as die geldige karakters is 'n, b, en c, dan as ons begin met 'n, dit sal Itereer te b, dit sal Itereer tot c. c is ons Max simbool, so ons sal stel c terug na 'n, die minimum simbool. En dan sal ons Itereer indeks na die volgende karakter. So as die oorspronklike raaiskoot was c, is die volgende karakter gaan die nul wees Terminator. Hier, agterkom dat as die karakter dat ons nou wil verhoging was die nul terminator, dan moet ons gaan om dit in te stel na die minimum simbool. So as die raaiskoot was c, dan is ons nuwe raaiskoot gaan wees aa. En as ons oorspronklike raaiskoot was CCCC, dan is ons nuwe raaiskoot gaan wees aaaaa. So wanneer ons die maksimum string van 'n gegewe lengte, dan is ons gaan implementeer om die minimum string van die volgende lengte, wat sal net al die karakters van die minimum-simbool. Nou, is wat hierdie tjek hier? Wel, as indeks verskuif van die agtste karakter van die nege karakter - sodat ons voeg agt c se as ons vorige raai - dan indeks gaan om te fokus op die laaste nul terminator van ons raaiskoot skikking, wat nie bedoel is om werklik gebruik word in ons wagwoord. So as ons is gefokus op die laaste null Terminator, dan het ons nog nie gevind nie 'n wagwoord wat is geldig net agt gebruik karakters, wat beteken dat daar geen geldige wagwoord wat versleutelt die gegewe string. En ons het wat om te druk, sê Ons kan nie 'n geldige wagwoord en terugkeer. So dit terwyl lus gaan Itereer oor alle moontlike snare. As dit bevind dat enige versleutelt die verwag geënkripteerde string, dit sal terug te keer dat die wagwoord. En dit nie kry nie, dan dit sal terugkeer, druk dat dit was nie in staat om iets te vind. Nou, sien dat iterating oor die hele moontlik snare is waarskynlik gaan om te 'n rukkie neem. Kom ons eintlik sien hoe lank dat neem. Kom ons maak kraak. Wel, oops - dit sê undefined verwysing na grafkelder. So onthou, vir die p stel spec en ook die man-bladsy vir grafkelder dat ons nodig het om te skakel in grafkelder. Nou, is die verstek maak opdrag weet nie dat jy wil hê dat die funksie te gebruik. So laat kopieer hierdie kliënt opdrag en voeg net aan die einde daarvan, skakel grafkelder. Nou, dit stel. So laat loop crack op 'n gegewe geënkripteerde string - so keiser s'n. So dit was redelik vinnig. Let daarop dat hierdie geëindig op 13. Wel, Caesar se geënkripteerde wagwoord gebeur om te wees 13. So laat ons probeer om 'n ander wagwoord. Kom ons neem Hirschhorn se encrypted wagwoord en probeer kraak dit. So sien ons reeds bereik het drie karakters. En ons iterating oor alle moontlike drie-karakter snare. Dit beteken dat ons reeds voltooi iterating oor alle moontlike een-en- twee karakter snare. Nou, dit lyk asof dit gaan 'n rukkie neem voor ons by die Vier-karakter snare. Dit mag dalk 'n paar minute. Dit het nie 'n paar minute. Ons is op die vier-karakter snare. Maar nou het ons nodig het om te Itereer oor die hele moontlik vier-karakter snare, wat wat kan miskien neem 10 minute. En dan wanneer ons by vyf karakter snare, ons moet Itereer oor die hele van diegene wat moontlik neem 'n paar uur. En ons moet Itereer oor alle moontlike ses-karakter snare, wat kon neem 'n paar dae en so aan. So dit kan 'n potensieel baie lang tyd om te Itereer oor alle moontlike agt-karakter en minder snare. So sien dat dit nie noodwendig 'n baie doeltreffende algoritme vir die vind van 'n wagwoord. Jy mag dalk dink dat daar is beter maniere. Byvoorbeeld, die wagwoord zyx! 32AB is waarskynlik nie 'n baie algemene wagwoord terwyl die wagwoord 12345 waarskynlik 'n baie meer algemeen. So 'n manier om te probeer om 'n wagwoord te vind vinniger is om net te kyk by wagwoorde wat meer algemeen is. So byvoorbeeld, kan ons probeer om woorde te lees van 'n woordeboek en probeer al daardie woorde as ons wagwoord raai. Nou, miskien 'n wagwoord is nie so eenvoudig nie. Dalk is dit die gebruiker was ietwat slim en probeer om die aanbring van 'n aantal te die einde van 'n woord. So miskien is die wagwoord was password1. So jy kan probeer iterating oor al die woorde in die woordeboek met 'n een aangeheg aan die einde van dit. En dan miskien na te doen, sal jy voeg 'n twee tot die einde van dit. Of miskien die gebruiker probeer om selfs meer slim, en hulle wil hulle wagwoord te wees "hacker", maar hulle is gaan alle gevalle van e's te vervang met drieë. So jy kan doen dit ook. Itereer oor al die woorde in die woordeboek maar vervang karakters wat lyk soos getalle met dié nommers. So op hierdie manier, kan jy vang selfs meer wagwoorde wat redelik algemeen. Maar in die einde, die enigste manier wat jy kan vang al die wagwoorde is om brute dwing Itereer oor die hele moontlik snare. So op die ou end, het jy nodig om Itereer oor al die snare van die een karakter agt karakters, wat dalk 'n n baie lang tyd, maar jy moet om dit te doen. My naam is Rob Bowden. En dit is kraak.