ROB Bowden: Unë jam Rob, dhe le të ketë plasaritje. Pra mbani mend nga spec pset që ne jemi duke shkuar për të kanë nevojë të përdorin Funksioni Crypt. Për faqe njeriun, ne kemi dy hash përcaktojnë _xopensource. Mos u shqetësoni pse ne kemi nevojë për të bërë këtë. Dhe gjithashtu hash përfshijnë unistd.h. Pra, një herë kjo është nga rruga, le të merrni me programin aktual. Gjëja e parë që ne duhet të bëni është të siguroheni përdorues hyrë në një Encrypted vlefshme fjalëkalimi në vijën komanduese. Mos harroni se programi është menduar për t'u kandiduar si dot plas plagë, dhe pastaj string koduar. Pra, këtu ne jemi të kontrolluar për të siguruar argc që të dy në qoftë se ne duam të të vazhdojë me programin. Nëse argc nuk është dy, që do të thotë ose përdoruesi nuk ka hyrë në një Encrypted fjalëkalimi në vijën komanduese, ose ata hyrë më shumë se vetëm Encrypted fjalëkalimi me command line, në të cilën rast ne nuk e dimë se çfarë të bëjë me argumente command line. Pra, nëse argc ishte dy, ne mund të vazhdojë. Dhe këtu, ne jemi duke shkuar për të deklaruar a koduar ndryshueshme. Kjo është vetëm do të alias origjinale argv1 në mënyrë që gjatë kësaj Programi, ne nuk kemi për të thirrur atë argv1, të cilat atëherë ju duhet të mendoni në lidhje me atë që do të thoshte në të vërtetë. Pra, më në fund, ne duam që të vërtetoni se fjalëkalimi koduar përdorues hyri në fakt mund të ketë qenë Një fjalëkalim Encrypted. Per faqes njeri i crypt, të Encrypted fjalëkalimi duhet të jetë 13 karaktere. Deri këtu, vini re se ne hash definuar encrypt si gjatësi 13. Pra, ne jemi vetëm duke u siguruar që Gjatësia varg i koduar fjalëkalimi është 13. Dhe në qoftë se kjo nuk është, ne duam për të dalë nga programi. Pra, një herë kjo është nga rruga, ne mund të tani në fakt përpiqen për të gjetur se çfarë që i dha fjalëkalimi koduar fjalëkalimi ishte. Këtu, ne duam për të rrëmbyer kripë nga fjalëkalim Encrypted. Kujtohet, per-faqe njeri, që para dy karaktere të një Encrypted string, si këtu - 50ZPJ dhe kështu me radhë - para dy karaktere të japë na kripë që është përdorur në funksion crypt. Dhe këtu, shohim se kripa ishte e ha. Pra, ne duam të kopjoni dy të parat karaktere, gjatësia kripë qenë hash përcaktuar si dy. Ne duhet të kopjoni para dy karaktere në këtë koleksion, kripë. Vini re se ne kemi nevojë për gjatësinë kripë plus një, pasi ne ende nevojë për një nul Terminator në fund të kripës tonë. Pastaj ne jemi duke shkuar për të deklaruar këtë koleksion, mysafir, max gjatësi prej madhësisë plus njëri, ku gjatësia max eshte Hash përcaktohet si tetë, pasi fjalëkalimi maksimale është tetë karaktere të gjatë. Dhe ne jemi duke shkuar për të përdorur këtë për të iterate mbi të gjitha vargjet e mundshme që mund të fjalëkalime të jetë i vlefshëm. Pra, nëse personazhet vlefshme në një fjalëkalim ishin vetëm një, b, dhe c, atëherë ne do të iterate mbi a, b, c, aa, ba, ca, dhe kështu me radhë, derisa ne të merrni për të parë cccccccc - tetë të c. Dhe në qoftë se ne nuk kemi një të vlefshme poshtë password, atëherë ne duhet të themi se string Encrypted nuk ishte vlefshme për të filluar me. Deri tani, ne kemi arritur këtë, ndërsa 1 loop. Vini re që do të thotë se është një lak të pafund. Njoftim ka asnjë deklaratë pushim brenda këtij lak të pafund. Nuk janë vetëm deklarata të kthehen. Pra, ne asnjëherë nuk presim për të dalë nga lak. Ne vetëm të presin për të dalë nga programi. Unë kam shtuar këtë deklaratë të shtypura në krye të këtij lak për të vetëm të shtypura nga me mend se çfarë ynë aktual në çfarë është fjalëkalimi. Tani, çfarë është kjo loop duke bërë? Është looping mbi të gjitha vargjet e mundshme që mund të jenë të vlefshme fjalëkalimet. Gjëja e parë që ne jemi duke shkuar për të bëni është të marrë me mend tonë aktuale për atë është fjalëkalimi. Ne do të marrë kripë që kemi rrëmbyer nga string Encrypted, dhe ne jemi duke shkuar për të encrypt guess. Kjo do të na japë një mend të koduar, të cilat ne jemi duke shkuar për të krahasuar kundër string koduar që përdoruesi hyri në vijën komanduese. Nëse ato janë të njëjta, në të cilin rast string krahasueshme do të kthehet zero, në qoftë se ata janë të njëjtë, atëherë mendoj se ishte fjalëkalimi se gjenerohet koduar string, rast në të cilin ne mund të shtypura se si fjalëkalim tonë dhe kthimit. Por në qoftë se ata nuk ishin të njëjta, që do të thotë Mend ynë ishte i pasaktë. Dhe ne duam që të iterate guess ardhshëm të vlefshme. Pra, kjo është ajo që kjo, ndërsa loop është duke u përpjekur për të bërë. Ajo do të iterate guess tonë me mend tjeter vlefshme. Vini re se kur themi se një Karakteri i veçantë në mend sonë ka arriti në simbolin max, e cila deri këtu hash është përcaktuar si një tildë, pasi kjo është vlera më e madhe karakteri ASCII që një përdorues mund të hyjë në keyboard, kur karakteri arrin max simbol, atëherë ne duam të dërgojmë atë përsëri në simbolin minimale, e cila është një hapësirë, sërish ASCII ulët Simboli vlerë që një përdorues mund të të hyjë në tastierë. Pra, ne jemi duke shkuar për të vendosur se për simbolin minimale. Dhe atëherë ne jemi duke shkuar për të shkuar mbi te te karakter tjeter. Pra, si janë supozime tona do të iterate? E pra, nëse personazhet janë të vlefshme a, b, dhe c, atëherë në qoftë se kemi filluar me një, ajo do të b iterate, ajo do të iterate të c. c është simboli ynë max, kështu që ne do të caktuar c përsëri në një, simbol minimale. Dhe pastaj ne do të iterate indeksin me karakter tjeter. Pra, nëse supozimi fillestar ishte c, tjetër Karakteri do të jetë null Terminator. Këtu poshtë, vini re se në qoftë se karakteri se ne tani duam të Rritja ishte Terminator null, atëherë ne jemi duke shkuar për të vendosur atë në simbol minimale. Pra, nëse guess ishte c, atëherë tonë Mend i ri do të jetë aa. Dhe në qoftë se Mend ynë fillestar ishte cccc, atëherë guess tonë të re do të jetë aaaaa. Pra, sa herë që kemi arritur varg maksimale e një gjatësi të caktuar, atëherë ne jemi do të zbatojë për vargun minimale të gjatësisë tjeter, e cila do vetëm të jetë i të gjitha karaktere e simbol minimale. Tani, çfarë është kjo kontroll duke bërë këtu? E pra, në qoftë se indeksi u zhvendos nga teta karakter të karakterit nëntë - kështu që ne të shtoni tetë e C, si previous mendoj tonë - atëherë indeksi do të përqëndrohet në e fundit null terminator i guess tonë array, e cila nuk ka për qëllim që në fakt të përdoren në fjalëkalim tonë. Pra, nëse ne jemi të fokusuar në atë null fundit terminator, atëherë ne nuk kemi gjetur një fjalëkalim që është e vlefshme duke përdorur vetëm tetë karaktere, që do të thotë nuk ka asnjë fjalëkalim i vlefshëm që kodon te vargut të dhënë. Dhe ne kemi për të shtypur atë, duke thënë: ne nuk mund të gjeni një të vlefshme password, dhe kthimi. Pra, kjo loop, ndërsa do të iterate mbi të gjitha vargjet e mundshme. Nëse gjen ndonjë që kodon për string pritet koduar, ajo do të kthehen se fjalëkalimin. Dhe kjo nuk do të gjeni ndonjë gjë, atëherë ajo do të kthehet, shtypjen se ajo nuk ishte në gjendje për të gjetur ndonjë gjë. Tani, vini re se iterating mbi të gjitha vargjet e mundshme është ndoshta do të të marrë një kohë. Le të shohim se si në të vërtetë gjatë që merr. Le të bëjnë plas. E pra, oops - ai thotë se i papërcaktuar referenca për crypt. Pra mbani mend, për p përcakton dhe spekulim edhe faqja njeri për crypt se ne nevojë për të lidhur në dhomë e nëndheshme. Tani, parazgjedhur të bëjë komandë nuk e di se ju doni të përdorni këtë funksion. Pra, le të kopjoni këtë komandë klientit dhe vetëm të shtoni deri në fund e saj, Crypt lidh. Tani, ajo harton. Pra, le të kandidojë çarje në një të dhënë string i mbyllur - kështu që është e Cezarit. Kështu që ishte shumë shpejt. Vini re se kjo përfundoi më 13. E pra, fjalëkalimi koduar i Cezarit; ndodh të jetë 13. Pra, le të provoni një tjetër fjalëkalim. Le të marrin koduar Hirschhorn-së fjalekalimin dhe provoni plasaritje se. Pra, vini re se ne kemi arritur tashmë tre karaktere. Dhe ne jemi iterating mbi të gjitha të jetë e mundur tre-strings karakter. Kjo do të thotë që ne tashmë e kam përfunduar iterating mbi të gjitha një e mundshme dhe dy vargjet karakter. Tani, kjo duket si ky do të të marrë një kohë para se të arrijmë katër-karakter strings. Ajo mund të marrë disa minuta. Ajo nuk ka marrë një çift të minuta. Ne jemi në katër-karakter strings. Por tani, ne kemi nevojë për të iterate mbi të gjitha mundshme katër-karakter vargjet, të cilat që mund të marrë ndoshta 10 minuta. Dhe atëherë kur kemi arritur pesë karakterin vargjet, ne kemi nevojë për të iterate mbi të gjitha e atyre, të cilat mund të marrë një orë çift. Dhe ne kemi nevojë për të iterate mbi të gjitha të jetë e mundur Gjashtë-strings karakter, i cili mund të marrë disa ditë dhe kështu me radhë. Pra, ajo mund të marrë një kohë të gjatë potencialisht shumë koha për të iterate mbi të gjitha të jetë e mundur tetë-karakteri dhe vargjet më pak. Pra, vini re se kjo nuk është domosdoshmërisht një algorithm shumë efikas për gjetjen e një fjalëkalim. Ju mund të mendoni se nuk ka janë mënyra më të mira. Për shembull, ZYX fjalëkalimi! 32ab ndoshta nuk është një fjalëkalim shumë të zakonshme, ndërsa fjalëkalimi 12345 është ndoshta një shumë më të zakonshme. Pra, një mënyrë e duke u përpjekur për të gjetur një fjalëkalim më shpejt që është vetëm shikoni në fjalëkalimet që janë më të zakonshme. Kështu për shembull, ne mund të përpiqemi për të lexuar fjalët nga një fjalor dhe të përpiqemi të gjithë ato fjalë si hamendjeve tona fjalëkalim. Tani, ndoshta një fjalëkalim nuk është kaq e thjeshtë. Ndoshta përdorues ishte disi i zgjuar dhe të përpiqemi për të bashkëngjitur një numër fundi i nje fjale. Pra, ndoshta fjalëkalimi tyre ishte password1. Kështu që ju mund të përpiquni të iterating mbi të gjitha fjalët ne fjalor me nje njërit bashkangjitur në fund të tij. Dhe pastaj ndoshta pas duke bërë që, ju do të append a dy në fund të tij. Apo ndoshta përdoruesi është duke u përpjekur të jetë edhe më i mençur, dhe ata duan tyre fjalëkalim për jetë "hacker", por ata janë të do të zëvendësojë të gjitha instancat e e e me threes. Kështu që ju mund të bëni këtë shumë. Iterate mbi të gjitha fjalët në fjalor por të zëvendësojë karaktere që duken si numra me ato numra. Pra këtë mënyrë, ju mund të arrijë edhe më shumë fjalëkalimet që janë mjaft të zakonshme. Por në fund, mënyra e vetme që ju mund të kapur të gjitha fjalëkalimet është shtazë detyrojë iterate mbi të gjitha vargjet e mundshme. Pra, në fund, ju keni nevojë për të iterate mbi të gjitha vargjet nga një karakter në tetë karaktere, të cilat mund të marrin një kohë shumë të gjatë, por ju duhet të bëni atë. Emri im është Rob Bowden. Dhe kjo është Crack.