ROB BOWDEN: Ik ben Rob, en laten we kraken. Dus onthoud uit de pset spec dat gaan we nodig hebben om het te gebruiken crypt functie. Voor de man-pagina, hebben we twee hash definiëren _xopensource. Maak je geen zorgen over waarom moeten we dat doen. En ook hash bevatten unistd.h. Dus zodra dat is uit de weg, laten we krijgen om het eigenlijke programma. Het eerste wat we moeten doen is ervoor zorgen dat de gebruiker ingevoerde een geldige versleutelde wachtwoord op de opdrachtregel. Vergeet niet dat het programma wordt verondersteld te lopen als dot slash crack, en vervolgens gecodeerd string. Dus hier zijn we controleren om ervoor te zorgen dat dat argc tot twee als we willen verder met het programma. Als argc is niet twee, die ofwel betekent de gebruiker niet invoeren van een gecodeerde wachtwoord op de opdrachtregel, of ze ingevoerd meer dan alleen de gecodeerde wachtwoord op de opdrachtregel, waarbij geval dat we niet weten wat te doen met de command line argumenten. Dus als argc was twee, kunnen we verder. En hier, we gaan verklaren een variabele versleuteld. Dat zal alleen maar alias de oorspronkelijke argv1 zodat gedurende deze programma, hoeven we niet te argv1 noemen, die dan moet je denken over wat dat eigenlijk betekende. Dus eindelijk, we willen valideren dat het gecodeerde wachtwoord van de gebruiker ingevoerd kon eigenlijk zijn geweest een versleuteld wachtwoord. Per de man pagina van crypte, de gecodeerd wachtwoord moet minimaal 13 tekens lang zijn. Hier, merken dat we hash gedefinieerd coderen lengte 13. Dus we zijn gewoon om ervoor te zorgen dat de koord lengte van de gecodeerde wachtwoord is 13. En als het niet, we willen om het programma af te sluiten. Dus zodra dat is uit de weg, we kunnen nu eigenlijk proberen uit te vinden wat de wachtwoord dat de versleutelde gaf wachtwoord was. Hier willen we het zout te grijpen uit het versleutelde wachtwoord. Vergeet niet, per de man page, dat de eerste twee letters van een versleutelde snaar, zoals hier - 50ZPJ en ga zo maar door - de eerste twee tekens geven ons het zout dat werd gebruikt in de crypte functie. En hier zien we dat het zout was ha. Dus we willen de eerste twee kopiëren karakters, zout lengte zijnde hash gedefinieerd als twee. We moeten de eerste twee tekens kopiëren in deze array, zout. Merk op dat we moeten zout lengte plus men, omdat we nog steeds een null nodig terminator aan het einde van onze zout. Dan gaan we deze array te verklaren, gast, van grootte max. lengte plus een, het max. lengte is hash gedefinieerd acht, aangezien de maximum wachtwoord is acht tekens lang zijn. En we gaan dit gebruiken om te schakelen over alle mogelijke strings die konden geldig wachtwoorden. Dus als de geldige tekens in een wachtwoord waren net a, b en c, wordt we itereren over a, b, c, aa, ba, ca, enzovoort, totdat we krijgen om cccccccc zien - acht c's. En als we niet naar beneden een geldige wachtwoord, dan moeten we zeggen dat de versleutelde tekenreeks niet geldig om mee te beginnen. Dus nu, dit bereiken we tijdens 1 lus. Merk op dat betekent dat het een oneindige lus. Merk op dat er geen break statement binnenkant van deze oneindige lus. Er zijn slechts uitspraken terug. Dus we eigenlijk nooit verwacht om de lus te verlaten. We verwachten alleen om het programma te verlaten. Ik heb deze print-statement om de toegevoegde bovenkant van deze lus om gewoon uit te printen wat onze huidige gok op wat het wachtwoord is. Nu, wat is deze lus aan het doen? Het is een lus over alle mogelijke strings dat zou geldig wachtwoorden. Het eerste wat we gaan doen, is nemen onze huidige schatting van wat de wachtwoord is. We zullen het zout dat we pakten uit te nemen de gecodeerde tekenreeks, en we zijn gaat de gok te versleutelen. Dit geeft ons een gecodeerde gok, die we gaan vergelijken de versleutelde tekenreeks die de gebruiker ingevoerd op de opdrachtregel. Als ze gelijk zijn, waarbij snaar vergelijkbaar zal nul terugkeren, indien ze zijn hetzelfde, dan denk was de wachtwoord dat de versleutelde gegenereerde tekenreeks, waarbij we afdrukken dat als onze paswoord en terugkeer. Maar als ze niet hetzelfde, dat betekent dat onze gok onjuist was. En we willen herhalen om de volgende geldige gok. Dus dat is wat dit terwijl lus probeert te doen. Het gaat om onze gok herhalen de volgende geldige gok. Merk op dat wanneer we zeggen dat een bijzonder karakter in onze gok heeft bereikte de max symbool, dat hier hash wordt gedefinieerd als een tilde, aangezien dat is de grootste ASCII-waarde karakter die een gebruiker kan invoeren op de toetsenbord, wanneer het teken bereikt het max symbool, dan willen we sturen het terug naar de minimum symbool, dat is een ruimte, opnieuw de laagste ASCII waarde symbool dat een gebruiker kan betreden op het toetsenbord. Dus we gaan naar die set de minimum symbool. En dan gaan we om te gaan Op naar het volgende teken. Dus hoe zijn onze gissingen gaat herhalen? Goed, als de geldige tekens a, b, en c, dan als we begonnen met een, het zal herhalen om b, het zal herhalen tot c. c is onze max symbool, dus we stellen c terug naar een, de minimum-symbool. En dan gaan we index herhalen naar het volgende teken. Als het oorspronkelijke gissing c, de volgende karakter gaat het null terminator. Hier beneden, merken dat indien het karakter dat we nu willen increment was de null-terminator, dan gaan we in te stellen op de minimum symbool. Dus als de gok was c, dan is onze nieuwe schatting gaat worden aa. En als onze oorspronkelijke gok was cccc, dan is onze nieuwe gok gaat worden aaaaa. Dus wanneer we het maximale reeks te komen van een bepaalde lengte, dan zijn we gaan voeren om de minimale snaar van de volgende baan, die zal gewoon alle tekens van de minimum symbool. Nu, wat is deze controle hier doen? Nou, als index verplaatst van de achtste karakter aan de negen karakter - dus voeg acht c's zoals we onze vorige raad - vervolgens index is gaan richten op de laatste null terminator van onze gok array, die niet feitelijk bedoeld worden gebruikt in onze wachtwoord. Dus als we zijn gericht op die laatste null terminator, dan hebben we niet gevonden een wachtwoord dat geldig is met slechts acht karakters, wat betekent dat er geen geldig wachtwoord dat codeert de gegeven string. En we hebben om af te drukken dat, zeggend We konden geen geldige vinden wachtwoord en rendement. Dus dit while loop gaat herhalen over alle mogelijke snaren. Mochten er vertragingen zijn, dat codeert voor de verwacht gecodeerde tekenreeks, het zal keren dat wachtwoord. En het maakt het niets vinden, dan het zal terugkeren, drukken dat het was niet in staat om iets te vinden. Nu, merken dat itereren over alle mogelijke strings gaat waarschijnlijk een tijdje duren. Laten we eens echt zien hoe lang dat duurt. Laten we crack. Nou, oeps - het zegt undefined verwijzing naar crypte. Dus onthoud, voor de p sets spec en Ook de man pagina voor crypte dat we moeten verbinden in crypte. Nu, de standaard te maken opdracht niet weet dat je wil die functie te gebruiken. Dus laten we kopieer deze client commando en gewoon toe te voegen aan het einde ervan, het koppelen crypte. Nu stelt zij. Dus laten we draaien barst op een gegeven gecodeerde tekenreeks - dus Caesar. Dus dat was vrij snel. Merk op dat deze eindigde op 13. Nou, gecodeerde wachtwoord van Caesar gebeurt te zijn 13. Dus laten we een ander wachtwoord proberen. Laten we eens Hirschhorns versleutelde wachtwoord en probeer het kraken dat. Zo merken we al bereikt drie tekens. En we itereren over alle mogelijke drie-tekenreeksen. Dat betekent dat we al klaar itereren over alle mogelijke een en twee tekenreeksen. Nu, het lijkt erop dat dit gaat om een tijdje duren voordat we bij de vier-tekenreeksen. Het kan een paar minuten duren. Het duurde niet een paar minuten. We zijn op de vier-tekenreeksen. Maar nu moeten we itereren over alle mogelijk vier-tekenreeksen, die dat misschien zou kunnen duren 10 minuten. En toen we vijf character bereiken strings, moeten we itereren over alle van die, welke zou kunnen neem een ​​paar uur. En we moeten dan herhalen alle mogelijke zes-tekenreeksen, die een paar dagen zou duren en zo verder. Dus kon het potentieel zeer lang een tijd om over te herhalen alle mogelijke acht-karakter en minder snaren. Dus merken dat dit niet noodzakelijk een zeer efficiënt algoritme voor het vinden een wachtwoord. Je zou kunnen denken dat er zijn betere manieren. Bijvoorbeeld, het wachtwoord zyx! 32AB Waarschijnlijk is niet een veel voorkomende wachtwoord, terwijl het wachtwoord 12345 is waarschijnlijk veel vaker voor. Dus een manier om te proberen om een ​​wachtwoord te vinden sneller is om gewoon te kijken bij wachtwoorden die komen vaker voor. Dus bijvoorbeeld, kunnen we proberen om woorden te lezen uit een woordenboek en probeer alles van die woorden als onze paswoord gissingen. Nu, misschien een wachtwoord is niet zo eenvoudig. Misschien dat de gebruiker was enigszins slim en probeer het toevoegen van een nummer aan het einde van een woord. Dus misschien zijn wachtwoord was wachtwoord1. Zodat u kunt proberen itereren over alle woorden in het woordenboek met een toegevoegd aan het einde van het. En dan misschien na dat te doen, zul je voegt twee aan het einde ervan. Of misschien de gebruiker probeert om zelfs slimmer, en ze willen dat hun vergeten te worden "hacker", maar ze zijn gaat om alle exemplaren van e's vervangen met drieën. Dus je kan dit ook doen. Itereren over alle woorden in het woordenboek maar vervang tekens die getallen lijken met die nummers. Dus op deze manier, zou je nog meer te vangen wachtwoorden die zijn vrij normaal. Maar op het einde, de enige manier waarop je kunt vangen alle wachtwoorden is te bruut dwingen itereren over alle mogelijk strings. Dus in het einde, heb je nodig om te herhalen over alle snaren van het ene personage naar acht tekens, die zou kunnen nemen een zeer lange tijd, maar je moet om het te doen. Mijn naam is Rob Bowden. En dit is Crack.