ROB BOWDEN: Jeg er Rob, og la oss komme i sprekker. Så husker fra PSett spec som vi kommer til å være behov for å bruke krypten funksjon. For mannen siden, har vi to hash definere _xopensource. Ikke bekymre deg om hvorfor vi trenger å gjøre det. Og også hash inkluderer unistd.h. Så når det er ute av veien, la oss komme til selve programmet. Første vi må gjøre er å sørge brukeren inn en gyldig kryptert passord på kommandolinjen. Husk at programmet er ment å kjøres som dot slash sprekk, og deretter kryptert streng. Så her er vi kontrollerer at at argc til to hvis vi ønsker å fortsette med programmet. Hvis argc er ikke to, betyr at enten brukeren har ikke skrevet inn en kryptert passord på kommandolinjen, eller de skrives mer enn bare det krypterte passord på kommandolinjen, der Hvis vi ikke vet hva de skal gjøre med den kommandolinje argumenter. Så hvis argc var to, kan vi fortsette. Og her kommer vi til å erklære en variabel kryptert. Det er bare å gå til alias den opprinnelige argv1 slik at hele denne program, trenger vi ikke å kalle det argv1, som da du må tenke om hva som faktisk betydde. Så til slutt, ønsker vi å validere at den krypterte passord brukeren skrev inn kunne faktisk har vært et kryptert passord. Per mannen til krypten, den kryptert passord må være 13 tegn. Opp her, merker at vi hash definert kryptere lengde som 13. Så vi bare å sørge for at strenglengde av den krypterte Passordet er 13.. Og hvis det ikke er det, vil vi for å avslutte programmet. Så når det er ute av veien, kan vi nå faktisk prøve å finne hva passord som ga den krypterte passordet var. Her ønsker vi å ta tak i salt fra den krypterte passord. Husk, per mannen siden, at to første tegnene i en kryptert strengen, slik som her - 50ZPJ og så videre - de to første tegnene gi oss saltet som ble brukt i krypten funksjonen. Og her ser vi at saltet var ha. Så vi ønsker å kopiere de to første tegn, salt lengde være hash definert som to. Vi må kopiere de to første tegnene i denne matrisen, salt. Legg merke til at vi trenger salt lengde pluss en, siden vi fortsatt trenger en null terminator ved enden av salt vår. Så vi kommer til å erklære denne tabellen, gjest, av størrelse maks lengde pluss en, hvor maks lengde er hash definert åtte som, ettersom den maksimale passord er åtte tegn. Og vi kommer til å bruke dette til å iterere fremfor alle mulige strenger som kunne være gyldige passordene. Så hvis de er gyldige tegn i et passord var bare a, b og c, og deretter vi vil iterere over a, b, c, aa, ba, ca, og så videre, helt til vi får se cccccccc - åtte c-tallet. Og hvis vi har ikke ned en gyldig passord, så må vi si at krypterte strengen var ikke gyldig til å begynne med. Så nå kommer vi dette mens en loop. Legg merke til at betyr at det er en uendelig loop. Merke det er ingen pause uttalelse innsiden av denne uendelig loop. Det er bare returnere uttalelser. Slik at vi aldri egentlig forvente å avslutte loopen. Vi bare forventer å avslutte programmet. Jeg har lagt denne print uttalelse til toppen av denne sløyfen å bare skrive ut hva vår nåværende gjette på hva passordet er. Nå er det denne sløyfen gjør? Det er looping fremfor alle mulige strenger som kan være gyldige passordene. Det første vi skal gjøre er ta vårt nåværende anslag for hva passordet er. Vi tar salt at vi grep fra den krypterte strengen, og vi er kommer til å kryptere gjetning. Dette vil gi oss en kryptert gjetning, som vi kommer til å sammenligne mot den krypterte snor som brukeren angitt på kommandolinjen. Hvis de er det samme, i hvilket tilfelle string sammenlignbare vil returnere null, hvis de er det samme, så antar var passord som genererte den krypterte streng, og da vi kan skrive det som vår passord og retur. Men hvis de ikke var det, at betyr vår gjetning var feil. Og vi ønsker å iterere til neste gyldig gjetning. Så det er hva denne stund løkke prøver å gjøre. Det kommer til å iterere vår gjetning til neste gyldig gjetning. Legg merke til at når vi sier at en spesiell karakter i gjetning vår har nådd maks symbol, som her oppe hash er definert som et tilde, ettersom som er den største ASCII verdi karakter at en bruker kan gå inn på tastatur, når tegnet nådd max symbol, så vi ønsker å sende den tilbake til minimum symbol, noe er et mellomrom, igjen den laveste ASCII verdi symbol at en bruker kan gå inn på tastaturet. Så vi kommer til å sette at til minimum symbol. Og så skal vi gå videre til neste tegn. Så hvordan er våre gjetninger kommer til å iterere? Vel, hvis de gyldige tegn er a, b, og c, så hvis vi startet med en, det vil iterere til B, vil det iterere til ca. c er vår max symbol, så vi får satt c tilbake til et, minimum symbol. Og så får vi iterere index til neste tegn. Så hvis det opprinnelige gjetning var c, den neste tegnet kommer til å være null terminator. Her nede, merker at hvis karakter at vi nå ønsker å tilveksten var null terminator, så vi kommer til å sette den til minimum symbol. Så hvis gjetning var c, da vår ny gjetning kommer til å bli aa. Og hvis vår opprinnelige gjetning var cccc, da vår nye gjetning kommer til å være aaaaa. Så når vi nå den maksimale streng av en gitt lengde, så vi er kommer til å iverksette til minimum string av den neste lengde, som skal bare være alle tegnene den minimums-symbol. Nå, hva er denne kontrollen gjør her? Vel, flyttet hvis indeksen fra den åttende tegn til ni karakter - så vi legger åtte c-tallet som vår forrige gjette - deretter indeks kommer til å fokusere på siste null terminator av gjetning vår array, som ikke er ment å faktisk brukes i passord vår. Så hvis vi er fokusert på at siste null terminator, da vi ikke har funnet en passord som er gyldig ved hjelp av bare åtte tegn, som betyr at det ikke er noen gyldig passord som krypterer til den gitte strengen. Og vi må skrive det, sier Vi kunne ikke finne et gyldig passord, og retur. Så dette mens loop kommer til å iterere fremfor alle mulige strenger. Hvis den finner noen som krypterer til forventet kryptert streng, vil det returnere som passord. Og det den ikke finner noe, så det vil returnere, skriver at det var ikke i stand til å finne noe. Legg nå merke til at iterating over alt mulige strenger er trolig kommer til ta en stund. La oss faktisk se hvordan lang tid det tar. La oss lage sprekk. Vel, oops - det står udefinert referere til krypten. Så husk, for p setter spec og også mannen siden for krypten at vi trenger for å koble i krypten. Nå standard gjør kommandoen ikke vet at du ønsker å bruke den aktuelle funksjonen. Så la oss kopiere denne klienten kommandoen og bare legge på til slutten av det, linking krypten. Nå, sammenstiller det. Så la oss kjøre sprekk på en gitt kryptert string - så Keiserens. Så det var ganske fort. Legg merke til at dette endte på 13.. Vel, Cæsars kryptert passord skjer for å være 13. Så la oss prøve en annen passord. La oss ta Hirschhorn krypterte passord og prøve sprengning det. Så merker vi allerede har nådd tre tegn. Og vi gjentar over alt mulig tre-tegns strenger. Det betyr at vi allerede ferdig iterating over alt mulig en og to tegnstrenger. Nå ser det ut som dette kommer til å ta en stund før vi når fire-tegns strenger. Det kan ta et par minutter. Det tok ikke et par minutter. Vi er på fire-tegnstrengene. Men nå trenger vi å iterere over alle mulige fire-tegns strenger, som som kan ta kanskje 10 minutter. Og så når vi nå fem tegn strenger, trenger vi å iterere over alle av dem, som kan ta et par timer. Og vi trenger å iterere over alle mulige seks-tegnstrenger, som kan ta et par dager og så videre. Så det kan ta en potensielt svært lang tid til å iterere over alle mulige åtte tegn og færre strenger. Så merker at dette ikke nødvendigvis er en svært effektiv algoritme for å finne et passord. Du tenker kanskje at det finnes bedre måter. For eksempel passord zyx! 32ab sannsynligvis ikke er en veldig vanlig passord, mens passordet 12345 er sannsynligvis mye mer vanlig. Så en måte å prøve å finne et passord raskere er å bare se på passord som er mer vanlig. Så for eksempel, kan vi forsøke å lese ord fra en ordbok og prøve alle de ordene som våre passord gjetninger. Nå, kanskje et passord er ikke så enkelt. Kanskje brukeren var noe smart og prøv lagt til et tall slutten av et ord. Så kanskje deres passord var password1. Så du kan prøve iterating enn alle ord i ordboken med ett lagt til på slutten av den. Og så kanskje når du gjør det, vil du tilføye en to til slutten av det. Eller kanskje brukeren prøver å være enda mer flink, og de ønsker at deres passord for å være "hacker", men de er kommer til å erstatte alle forekomster av e sin med treere. Så du kan gjøre dette også. Iterere over alle ord i ordlisten men erstatte tegn som ser ut som tall med disse tallene. Så denne måten, kan du få enda mer passord som er ganske vanlig. Men til slutt, den eneste måten du kan fange opp alle passordene er å brute tvinge iterere over alle mulige strenger. Så til slutt, trenger du å iterere fremfor alle strenger fra ett tegn til åtte tegn, som kan ta en veldig lang tid, men du trenger å gjøre det. Mitt navn er Rob Bowden. Og dette er Crack.