ROB BOWDEN: Jeg er Rob, og lad os komme revner. Så husker fra Pset spec at vi kommer til at blive nødt til at bruge krypt funktion. For manden siden har vi to hash definere _xopensource. Må ikke bekymre dig om, hvorfor vi nødt til at gøre det. Og også hash nævnes unistd.h. Så når det er af vejen, lad os kommer til de egentlige program. Første ting vi skal gøre, er at sørge brugeren indtastet et gyldigt krypteret adgangskode på kommandolinjen. Husk, at det er meningen programmet skal køres ligesom dot slash crack, og derefter krypteret streng. Så her er vi kontrol for at sikre at argc til to, hvis vi ønsker at fortsætte med programmet. Hvis argc ikke er to, der betyder enten brugeren ikke indtaster en krypteret adgangskode på kommandolinjen, eller de indtastet mere end blot den krypterede adgangskode på kommandolinjen, hvor hvis vi ikke ved, hvad de skal gøre med det kommandolinjeargumenter. Så hvis argc var to, kan vi fortsætte med. Og her, vi kommer til at erklære en variabel krypteret. Det er bare at alias oprindelige argv1 således at hele denne program, behøver vi ikke at kalde det argv1, som derefter er du nødt til at tænke om, hvad der egentlig menes. Så til sidst, vi ønsker at validere, at den krypterede password brugeren opføres, har faktisk været en krypteret adgangskode. Per manden side i krypten, den krypterede password skal være 13 tegn. Heroppe bemærke, at vi hash definerede kryptere længde som 13.. Så vi blot at sikre, at de snorlængde af krypterede password er 13.. Og hvis det ikke er, vil vi at afslutte programmet. Så når det er af vejen, kan vi nu faktisk forsøger at finde, hvad de adgangskode, der gav den krypterede password var. Her ønsker vi at få fat i saltet fra den krypterede password. Husk, per manden siden, at de to første tegn i en krypteret streng, som her - 50ZPJ og så videre - de første to tegn giver os det salt, der blev anvendt i krypten funktion. Og her ser vi, at saltet var ha. Så vi ønsker at kopiere de to første tegn, salt længde er hash defineret som to. Vi er nødt til at kopiere de første to bogstaver i dette array, salt. Bemærk, at vi har brug for salt længde plus en, da vi stadig har brug for en null terminator i slutningen af ​​vores salt. Så vi kommer til at erklære dette array, gæst, størrelse maks. længde plus en, hvor max længde er hash defineret som otte, da den maksimale password er otte tegn. Og vi kommer til at bruge denne til at gentage over alle mulige strenge, der kunne være gyldige adgangskoder. Så hvis de er gyldige tegn i en adgangskode var blot a, b, og c, vi ville gentage over a, b, c, aa, BA, CA, og så videre, indtil vi får at se cccccccc - otte C'er. Og hvis vi ikke har ned et gyldigt adgangskode, så er vi nødt til at sige, at krypteret streng var ikke gyldigt at begynde med. Så nu kommer vi til dette, mens 1 løkke. Bemærk, at betyder, at det er en uendelig løkke. Læg mærke til at der er ingen pause erklæring indersiden af ​​denne uendelig løkke. Der er kun returnere udsagn. Så vi faktisk aldrig forvente at afslutte løkken. Vi venter kun at afslutte programmet. Jeg har tilføjet denne print erklæring til toppen af ​​denne løkke til bare udskrive , hvad vores nuværende gæt på hvad adgangskoden er. Nu er hvad denne løkke laver? Det looping over alle mulige strenge der kunne være gyldige passwords. Den første ting, vi vil gøre, er tage vores nuværende gæt for hvad password er. Vi tager det salt, vi greb fra den krypterede streng, og vi er kommer til at kryptere gæt. Dette vil give os en krypteret gæt, som vi kommer til at sammenligne med den krypterede streng at brugeren indtastes på kommandolinjen. Hvis de er det samme, i hvilket tilfælde streng sammenlignelig vil returnere nul, hvis det er den samme, så gæt var adgangskode, der genererede den krypterede streng, i hvilket tilfælde vi kan printe der som vores kodeord og tilbagevenden. Men hvis de ikke var det samme, som betyder, at vores gæt var forkert. Og vi ønsker at gentage at den næste gyldige gæt. Så det er, hvad dette, mens loop forsøger at gøre. Det kommer til at gentage vores gæt til den næste gyldige gæt. Bemærk, at når vi siger, at en særlige karakter i vores gæt har nåede max symbol, som heroppe er hash defineres som en tilde, eftersom det er den største ASCII værdien karakter at en bruger kan komme på tastatur, når tegnet når max symbol, så vi ønsker at sende det tilbage til et minimum symbol, som er et rum, igen den laveste ASCII værdi symbol at en bruger kan indtaster på tastaturet. Så vi kommer til at sætte det til et minimum symbol. Og så vi kommer til at gå videre til næste tegn. Så hvordan er vores gæt vil gentage? Tja, hvis de gyldige karakterer er a, b, og c, hvis vi startede med en, det vil gentage til B, det vil gentage til ca. c er vores max symbol, så vi sætte c tilbage til en, minimum symbol. Og så vil vi gentage index til næste tegn. Så hvis den oprindelige gæt var C, den næste karakter vil være nul terminator. Hernede, bemærke, at hvis tegnet at vi nu ønsker at tilvækst var null terminatoren så vi kommer til at sætte det til minimum symbol. Så hvis gæt var c, så er vores nyt gæt vil være aa. Og hvis vores oprindelige gæt var cccc, så vores nye gæt bliver aaaaa. Så når vi nå den maksimale strengen af en given længde, vi derefter er vil gennemføre den mindste streng Den næste længde, hvilket vil bare være alle tegn i minimum symbol. Nu er det, denne kontrol laver her? Tja, hvis indekset flyttet fra den ottende tegn til ni karakter - så tilføjer vi otte C'er som vores tidligere gæt - derefter indeks kommer til at fokusere på sidste null terminator i vores gæt matrix, som ikke er beregnet til faktisk anvendes i vores kodeord. Så hvis vi fokuserer på at sidste null terminator, så har vi ikke fundet en password, der er gyldige ved hjælp af kun otte tegn, hvilket betyder, at der ikke er nogen gyldig adgangskode, der krypterer til den givne streng. Og vi er nødt til at udskrive det, siger vi kunne ikke finde et gyldigt adgangskode, og vende tilbage. Så dette, mens løkken kommer til at gentage over alle mulige strenge. Hvis den finder nogen, som krypterer til forventede krypteret streng, det vil returnere adgangskode. Og det er det ikke finder noget, så det vil vende tilbage, trykning, at det var ikke i stand til at finde noget. Nu bemærke, at iteration over alle mulige strenge er sandsynligvis vil tage et stykke tid. Lad os rent faktisk se, hvordan lang, der tager. Lad os lave crack. Nå, ups - det siger udefineret henvisning til krypt. Så husk, for p sætter spec og også manden siden for krypt, som vi nødt til at linke i krypten. Nu, standard gør kommandoen ikke ved, at du ønsker at bruge denne funktion. Så lad os kopiere denne klient kommando og blot tilføje til enden af det, krypt forbinder. Nu er det kompilerer. Så lad os køre crack på en given krypterede streng - så Cæsars. Så det var temmelig hurtigt. Bemærk, at dette endte den 13. Nå, Cæsars krypterede password sker for at være 13.. Så lad os prøve en anden adgangskode. Lad os tage Hirschhorn krypterede kodeord og prøv revner det. Så opdager vi har allerede nået tre tegn. Og vi iteration over alle mulige tre-tegnstrenge. Det betyder, at vi allerede har færdig iteration over alle mulige og to tegnstrenge. Nu ser det ud dette kommer til at tage et stykke tid, før vi når fire-tegnstrenge. Det kan tage et par minutter. Det tog ikke tage et par minutter. Vi er på de fire-tegnstrenge. Men nu er vi nødt til at gentage over alle mulige fire-tegnstrenge, som der kan tage måske 10 minutter. Og så når vi når fem tegn strygere, er vi nødt til at gentage over alle af dem, som vil kunne tage et par timer. Og vi er nødt til at gentage over alle mulige seks-tegnstrenge, som kan tage et par dage, og så videre. Så det kunne tage en potentielt meget lang tid til at gentage over alle mulige otte tegn og færre strenge. Så bemærke, at dette ikke nødvendigvis er en meget effektiv algoritme til at finde en adgangskode. Du tror måske, at der er bedre måder. For eksempel password zyx! 32ab sandsynligvis ikke er en meget almindelig adgangskode, mens password 12345 er sandsynligvis meget mere almindelige. Så en måde at forsøge at finde en adgangskode hurtigere er at bare kigge på passwords, der er mere almindelige. Så for eksempel, kan vi prøve at læse ord fra en ordbog og prøve alle disse ord som vores password gæt. Nu, måske en adgangskode er ikke så simpelt. Måske brugeren var noget smart og prøv at tilføje et nummer til slutningen af ​​et ord. Så måske deres password var password1. Så du kan prøve iteration i alle ord i ordbogen med en én tilføjet i slutningen af ​​det. Og så måske efter at gøre dette, vil du tilføje en to til enden på det. Eller måske bruger forsøger at være endnu klogere, og de vil have deres adgangskode for at være "hacker", men de er kommer til at erstatte alle forekomster af e s med treere. Så du kunne gøre det også. Gentage over alle ord i ordbogen men udskift figurer, som ligne numre med disse numre. Så på denne måde, kan du fange endnu mere passwords, der er temmelig udbredt. Men i sidste ende, er den eneste måde du kan indfange alle passwords er at brute tvinge gentage over alle mulige strenge. Så i sidste ende, har du brug for at skifte for alle strengene fra et tegn til otte tegn, hvilket kan tage et meget lang tid, men du behøver at gøre det. Mit navn er Rob Bowden. Og det er Crack.