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