ROB BOWDEN: Аз съм Роб, и нека да напукване. Така че не забравяйте от PSET спекулация, че ние ще се налага да използвате криптата функция. За човек страница, имаме две хеш определят _xopensource. Не се притеснявайте за това, защо ние трябва да го направя. И също така хеш включват unistd.h. Така че след като това е от пътя, нека да стигнем до реалната програма. Първото, което трябва да направите е да се уверите, потребителят е въвел валиден криптирана парола в командния ред. Не забравяйте, че програмата е трябвало да се управлява като точка пляскане наклонена черта, и след това криптирана низ. Така че тук ние сме проверка, за да се уверите, че argc до две, ако искаме да продължи с програмата. Ако argc не е два, това означава, че или ръководство не влезе криптиран парола в командния ред, или те вписват повече от кодираната парола в командния ред, в който случай ние не знаем какво да правим с аргументите на командния ред. Така че, ако argc е два, можем да продължим. И тук, ние ще се декларират променлива криптирани. Това просто ще псевдоним на оригинални argv1, така че в този програма, ние не трябва да го наричат ​​argv1, които след това трябва да мислиш за това, че всъщност означава. Така че в крайна сметка, ние искаме да потвърдиш, че криптирана парола на потребителя вписват може действително са били криптирана парола. Per човекът страница на криптата, на криптирана парола трябва да е 13 символа. До тук, забележите, че ние определено хеш криптиране дължина като 13. Така че ние просто като се уверите, че низ дължина на криптирани Паролата е 13. И ако това не е, което искаме за да излезете от програмата. Така че след като това е от пътя, ние можем да сега действително се опита да намери това, което парола, която дава криптирани парола беше. Ето, ние искаме да вземете сол от криптирана парола. Не забравяйте, че на човек страница, че Първите два знака на криптиран низ, харесва тук - 50ZPJ и така нататък - първите два знака даде ни на сол, която се използва в криптата функция. И ето, ние виждаме, че солта е хектара. Така че ние искаме да копирате първите две героите, сол дължина е хеш определя като две. Трябва да копирате първите два знака в този масив, сол. Забележете, че имаме нужда сол дължина плюс един, тъй като ние все още се нуждаят от нула терминатор в края на нашия сол. След това отиваме да декларират този масив, гост, на дължина с максимален размер плюс един, където максимална дължина е хеш определени като осем, тъй като максималната парола е осем знака. И ние ще използваме това, за да превъртите над всички възможни низове, които биха могли валидни пароли. Така че, ако валидните символи в паролата бяха само, Б и В, а след това бихме обхождане на A, B, C, аа, ба, СА, и така нататък, докато ще видим cccccccc - осем в е. И ако не са определени валиден парола, след това трябва да се каже, че криптиран низ не е валидно да се започне. Така че сега, стигаме до това, докато един цикъл. Забележете, че означава, че е безкраен цикъл. Забележете, не съществуват почивката изявление вътре в този безкраен цикъл. Там се върне само отчети. Така че ние никога не очакваш за да излезете от цикъла. Ние само очакват да излезете от програмата. Аз сте добавили този печат изявление пред началото на тази линия просто да отпечатате какво текущата ни предположение какво паролата е. Сега, това, което е този цикъл правиш? Това е цикъл с всички възможни низове които биха могли да бъдат валидни пароли. Първото нещо, което ще направим е вземе сегашната ни предположение за това, което Паролата е. Ние ще се солта, че ние грабна от криптиран низ, и ние сме ще се кодира предположение. Това ще ни даде криптирана предположение, които отиваме да сравнявате срещу криптиран низ, че потребителят влезе в командния ред. Ако те са еднакви, като в този случай низ сравнима ще се върне на нула, ако те са едно и също, тогава предполагам, че е парола, която генерира криптирана низ, като в този случай можем да отпечатате че като наш парола и връщане. Но ако те не са същите, които означава нашето предположение е било неправилно. И ние искаме да превъртите до следващата валидна предположение. Така че това е, което това, докато линия се опитва да направи. Това ще превъртите ни предположение към следващата валидна предположение. Забележете, че когато казваме, че особеният характер в нашата предположение има достигна символа макс, които тук хеш се дефинира като тилда, тъй като това е най-големият ASCII характер стойност , които потребителят може да влезе в клавиатурата, когато характер достигне макс символ, след това ние искаме да изпратим Върнете го на минималната символ, който е пространство, отново най-ниската ASCII стойност символ, който потребителят може да влиза в клавиатурата. Така че отиваме да зададете, че до минимум символ. И тогава ние ще тръгнем към следващия знак. И така, как са нашите предположения ще превъртите? Е, ако валидни знаци са A, B, и С, след това, ако ние започнахме с, това ще превъртите до б, ще превъртите до с. С нас е макс символ, така че ще настроите С обратно в, минималната символ. И тогава ние ще превъртите индекс към следващия знак. Така че, ако първоначалното предположение е С, следващата характер ще бъде на нула терминатор. Тук долу, ако забележите, че характерът че сега искаме да нарастване е нищожна терминатор, След това ние ще го настроите на минимална символ. Така че, ако Предполагах, С, след това ни ново предположение ще бъде аа. И ако нашите оригинални предположение е СССС, а след това новата ни предположение ще бъде AAAAA. Така че, когато ние достигне максималната низ на дадена дължина, след това сме ще приложи до минимум низ на следващата дължина, която ще просто бъдете всички символи на минималната символ. Сега, това, което е тази проверка правиш тук? Е, ако индексът преместен от осмия характер на характера девет - така че ние добавите в осем, както е предишната ни предполагам - След това индексът ще се съсредоточи върху последно нищожна терминатор на нашата предположение масив, който не е предназначен за действително да се използва в нашата парола. Така че, ако ние сме фокусирани върху това последно нула терминатор, тогава ние не са намерили парола, която е валидна само с осем символи, което означава, че няма валидна парола, която криптира към даден низ. И ние трябва да отпечатате това, заявявайки, ние не може да намери валиден парола, и обратно. Така че тази линия, докато няма да превъртите над всички възможни струни. Ако установи, че нито един криптира с Очаква криптиран низ, ще върнете тази парола. И той не намира нищо, а след това той ще се върне, за печат, които го но не можа да намери нищо. Сега забелязвам, че итерации над всички възможни низове вероятно ще отнеме известно време. Нека да видим как всъщност дълго, че отнема. Да направим пляскане. Е, Опа - казва неопределено препратка към криптата. Така че не забравяйте, за стр. определя спец. и и човекът, страница за крипта, че ние трябва да се свържат в криптата. Сега, по подразбиране се команда не знае, че сте искате да използвате тази функция. Така че нека да копирате този клиент команда и просто добавете към крайния от него, свързващ криптата. Сега, той съставя. Така че нека да тичам пукнатина върху даден криптиран низ - така Цезар. Така че това е доста бързо. Забележете, че това приключи на 13. Е, криптирана Цезар парола се случва да бъде 13. Така че нека да въведете друга парола. Нека да е криптирана Hirschhorn парола и опитайте напукване това. Така че забележите ние вече достигна три символа. И ние итерации над всичко възможно три-символни низове. Това означава, че ние вече приключи итерации над всичко възможно един и два символни низове. Сега, изглежда, че това ще отнеме известно време, преди да стигнат до четири символни низове. Може да отнеме няколко минути. Това не отнема няколко минути. Ние сме на четири символни низове. Но сега, ние трябва да обхождане на всички възможните четири символни низове, които , че може да отнеме може би 10 минути. И тогава, когато стигнем до пет знака низове, ние трябва да обхождане на всички на тези, които могат да отнеме няколко часа. И ние трябва да се обхождане на всички възможни шест символни низове, които може да отнеме няколко дни и така нататък. Така че това може да отнеме много дълго потенциално време за обхождане на всички възможни осем характер и по-малко струни. Така забележите, че това не е непременно много ефективен алгоритъм за намиране парола. Може би си мислите, че има са по-добри начини. Например, парола ZYX! 32ab вероятно не е много често срещана парола, като има предвид, паролата е 12345 вероятно много по-чести. Така че един от начините да се опитва да намери парола по-бързо е просто да изглежда на пароли, които са по-чести. Така например, можем да се опитаме да чете думи от речника и се опитват всички тези думи, тъй като нашата парола предположения. Сега, може би на парола не е толкова просто. Може би е малко по-умен потребителя и се опитват да положат редица на края на думата. Така че може би тяхната парола е password1. Така че можете да се опитате итерации над всички думи в речника с един приложена към края на това. И тогава може би след като направите това, ще прикрепите два до края на това. Или може би на потребителя се опитва да бъде още по- по-умен, и те искат техните парола, за да бъде "хакер", но те са ще замени всички случаи на електронната си с тройки. Така бихте могли да направите това също. Обхождане на всички думи в речника но мястото на символите, които изглежда като числа с тези числа. Така че по този начин, може да се хване още по- пароли, които са доста общи. Но в крайна сметка, единственият начин можете да улови всички пароли е да груба принуди обхождане на всички възможни струни. Така че в крайна сметка, можете лесно да превъртите върху всички струни от един знак осем символа, който може да отнеме много дълго време, но трябва да го направя. Моето име е Роб Боудън. И това е Crack.