>> 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.