ROB BOWDEN: Я Роб, і давайце парэпанне. Так што памятаеце з PSET спецыфікацыю, якая мы збіраемся быць неабходнасці выкарыстоўваць Склеп функцыі. Для чалавека, старонку, у нас ёсць два Хэш вызначыць _xopensource. Не турбуйцеся аб тым, чаму мы павінны зрабіць гэта. А таксама хэш ўключаюць unistd.h. Таму, як толькі гэта з шляху, давайце дабрацца да фактычнага праграмы. Першае, што нам трэба зрабіць, гэта пераканацца, што карыстач увёў сапраўдны зашыфраваны пароль у камандным радку. Памятаеце, што праграма павінна для выканання як расколіны кропка слэш, і Затым зашыфраваную радок. Дык вось мы правяраем, каб пераканацца, што ARGC да двух, калі мы хочам працягнуць праграму. Калі ARGC не два, гэта азначае, што альбо Карыстальнік не ўвёў зашыфраванае пароль у камандным радку, альбо яны ўведзена больш, чым проста зашыфраваных пароль у камандным радку, у якой выпадку мы не ведаем, што рабіць з аргументы каманднага радка. Так што калі ARGC было два гады, мы можам працягваць. І вось, мы збіраемся аб'явіць Невялікі зашыфраваныя. Гэта проста будзе арыгінальным псеўданімам argv1 так, што на працягу ўсяго гэтага праграмы, мы не павінны называць яго argv1, якія затым вы павінны думаць аб тым, што, што на самой справе меў на ўвазе. Такім чынам, нарэшце, мы хочам праверыць, што зашыфраваны пароль карыстальніка ўступіў маглі на самай справе было зашыфраваны пароль. На старонцы кіраўніцтва склеп, зашыфраваны пароль павінен быць 13 знакаў. Тут, наверсе, мы заўважылі, што хэш вызначаны шыфравання даўжынёй як 13. Так што мы толькі пераканаўшыся, што даўжыня радка зашыфраваных пароль 13. А калі гэта не так, мы хочам Для выхаду з праграмы. Таму, як толькі гэта з шляху, мы можам Зараз на самой справе спрабуюць знайсці тое, што пароль, які даў зашыфраваных пароль быў. Тут, мы хочам, каб захапіць солі з зашыфраванага пароля. Памятаеце, што за чалавек старонцы, што Першыя два знака зашыфраванай радком, як тут - 50ZPJ і гэтак далей - Першыя два знака даюць нам соль, які быў выкарыстаны у склепе функцыі. І вось, мы бачым, што соль была га. Таму мы хочам, каб скапіяваць першыя два знакаў, соль даўжыня складае хэш вызначаецца як два. Мы павінны скапіяваць першыя два знака У гэты масіў, соль. Звярніце ўвагу, што нам патрэбна соль даўжынёй плюс Адзін з іх, так як мы ўсё яшчэ спатрэбіцца нуль тэрмінатар у канцы нашай солі. Затым мы збіраемся аб'явіць гэты масіў, госць, памерам даўжынёй макс плюс Адзін з іх, дзе максімальная даўжыня хэш вызначаны да васьмі, так як максімальную пароль займае восем знакаў. І мы збіраемся выкарыстаць гэта, каб ітэрацыі па ўсіх магчымых радкі, якія маглі сапраўднымі паролямі. Так што, калі дапушчальныя сімвалы у паролі былі проста A, B, і C, то мы б перабраць, B, C, AA, BA, CA, і гэтак далей, да Мы ўбачым CCCCCCCC - восем Сі. І калі ў нас ёсць не ўніз сапраўднае пароль, то мы павінны сказаць, што зашыфраванай радкі не было сапраўдныя з самага пачатку. Так што цяпер, мы дасягнем гэтага ў той час як 1 пятлю. Звярніце ўвагу, што азначае, што гэта бясконцы цыкл. Звярніце ўвагу, няма перапынку заяву ўнутры гэтага бясконцага цыклу. Там толькі вярнуць справаздачнасці. Такім чынам, мы ніколі не чакалі выйсці з цыклу. Мы толькі чакаем выхаду праграмы. Я дадаў гэтую пячатку заяву верхняй часткі гэтага цыклу проста раздрукаваць тое, што нашы бягучыя здагадвацца што пароль. Цяпер, што гэтая пятля робіць? Гэта цыкл па ўсіх магчымых радкоў якія могуць быць сапраўдным паролі. Першае, што мы збіраемся зрабіць, гэта ўзяць нашы бягучыя здагадкі за тое, што пароль. Мы возьмем солі, што мы схапілі зашыфраваную радок, і мы збіраецца шыфраваць здагадку. Гэта дасць нам зашыфраванае Guess, якія мы збіраемся для параўнання зашыфраванай радкі, якія карыстальнік ўвесці ў камандную радок. Калі яны аднолькавыя, і ў гэтым выпадку Радок супастаўных верне нуль, калі яны тое ж самае, то думаю, было паролем, які генеруецца зашыфраваны Радок, у гэтым выпадку мы можам надрукаваць што наш пароль і вяртанне. Але калі б яны былі не тое ж самае, што азначае, што наша здагадка было няслушным. І мы хочам, каб ітэрацыі наступнага сапраўднага здагадку. Дык вось што гэта ў той час Цыкл спрабуе зрабіць. Гэта збіраецца пацвярджаем нашу здагадку да бліжэйшага дапушчальнага здагадку. Звярніце ўвагу, што, калі мы кажам, што асаблівы характар ​​у нашай здагадцы дасягнулі сімвалам Max, якая тут з'яўляецца хэш вызначаецца як тыльды, так як гэта самы буйны ASCII значэнне сімвала , Якія карыстальнік можа ўвесці ў клавіятура, калі персанаж дасягае макс сімвал, то мы хочам паслаць яго назад у сімвал мінімальнага, якое гэта прастора, зноў жа самы нізкі ASCII значэнне сімвала, які карыстальнік можа увядзіце з клавіятуры. Такім чынам, мы збіраемся ўсталяваць, што да мінімальнага знака. А потым мы збіраемся пайсці на наступны характар. Так як жа нашы здагадкі збіраецца ітэрацыі? Ну, калі дазваляецца выкарыстоўваць сімвалы A, B, і С, то, калі мы пачалі з, гэта будзе ітэрацыі б, гэта будзе ітэрацыі да с. З нашага макс сімвал, таму мы ўсталюем Вярнуцца да C, мінімальная сімвалам. І тады мы ітэрацыі індэкс да наступнага знаку. Такім чынам, калі зыходнае здагадка было с, наступнага характар ​​будзе нулявым тэрмінатара. Тут, унізе, заўважыў, што калі знак што мы зараз хочам прырост склаў нулявы тэрмінатар, Затым мы збіраемся ўсталяваць яго на сімвал мінімальнага. Такім чынам, калі здагадка было C, то наша новая здагадка будзе АА. І калі наша здагадка было арыгінальным КПКГ, то наша новая здагадка будзе ааааа. Таму, калі мы дасягаем максімальнай радкі зададзенай даўжыні, то мы мае намер рэалізаваць да мінімальнай радком чарговага даўжыню, якая будзе проста ўсе знакі мінімальны знак. Цяпер, што гэтая праверка тут робіш? Ну, калі індэкс пераехаў з восьмага характару да дзевяці характару - таму мы дадамо восем C як нашы папярэднія адгадаць - Затым індэкс збіраецца засяродзіцца на апошні нулявой сімвал нашага здагадкі масіва, які не прызначаны, каб фактычна выкарыстоўвацца ў нашай пароля. Так што, калі мы сканцэнтраваны на тым апошнім нулявым тэрмінатар, то мы не знайшлі пароль, сапраўдны выкарыстоўваючы толькі восем знакаў, што азначае няма правільны пароль, які шыфруе ў дадзенай радку. І ў нас ёсць для друку, што, кажучы мы не маглі знайсці сапраўдную пароль і вяртання. Так што гэта пакуль пятля збіраецца ітэрацыі па ўсіх магчымых радкоў. Калі яна знаходзіць любыя, які шыфруе да Чакаецца зашыфраваную радок, ён будзе вярнуць гэты пароль. І ён не знаходзіць нічога, то ён вернецца, друк, што яна не змог нічога знайсці. Зараз, звярніце ўвагу, што перабірае ўсе Магчымыя радкі, верагодна, будзе заняць некаторы час. Давайце паглядзім, як на самой справе доўга, што бярэ. Давайце зробім расколіну. Ну, ой - гэта кажа пра нявызначаных спасылка на склеп. Так што памятаеце, для р ўсталёўвае спецыфікацыі і Таксама ў даведачнай старонцы склепе, што мы трэба звязаць у склепе. Цяпер, выкарыстоўваецца па змаўчанні камандай не ведаю, што вы хочаце выкарыстоўваць гэтую функцыю. Так давайце скапіюем гэтую каманду кліента і проста дадаць да канца яго, звязваючы склеп. Зараз, ён кампілюе. Так што давайце працаваць расколіны на дадзеным зашыфраваную радок - так Цэзара. Так што было даволі хутка. Звярніце ўвагу, што гэта скончылася на 13. Ну, зашыфраваны пароль Цэзара здараецца, 13. Так давайце паспрабуем іншы пароль. Давайце зашыфраваных Hirschhorn аўтара пароль і паспрабуйце парэпання, што. Так, заўважце, мы ўжо дасягнулі тры знака. І мы перабірае ўсе магчымыя тры-знакавыя радка. Гэта азначае, што мы ўжо скончыць перабірае ўсе магчымыя і два радкі знакаў. Цяпер, падобна, што гэта будзе заняць некаторы час, перш чым мы дасягнем чатыры-знакавыя радка. Гэта можа заняць некалькі хвілін. Гэта не зойме пару хвілін. Мы на чатыры-знакавыя радка. Але цяпер, мы павінны перабрацца ўсе магчымыя чатыры радкі знакаў, якія , Што можа быць, можа заняць 10 хвілін. А потым, калі мы дасягаем пяці знакаў радкоў, мы павінны перабрацца ўсе з тых, якія маглі б заняць некалькі гадзін. І мы павінны перабраць усе магчымыя шасці знакаў радкі, якія можа заняць некалькі дзён, і гэтак далей. Так што гэта можа заняць патэнцыйна вельмі доўга Час для перабору ўсіх магчымых васьмі знакаў і менш радкоў. Так заўважыць, што гэта не абавязкова вельмі эфектыўны алгарытм для пошуку пароля. Можна падумаць, што там больш эфектыўныя спосабы. Напрыклад, пароль ZYX! 32ab , Верагодна, не вельмі распаўсюджанае пароль, у той час як пароль 12345 верагодна, нашмат больш агульнага. Так адзін з спосабаў спрабуе знайсці пароль хутчэй, каб проста глядзець на паролі, якія з'яўляюцца больш распаўсюджанымі. Так, напрыклад, мы можам паспрабаваць прачытаць словы з слоўніка і паспрабаваць усё гэтыя словы, як нашы здагадкі пароля. Зараз, магчыма пароль не ўсё так проста. Можа быць, карыстальніку было некалькі разумных і паспрабуйце дадаць нумар Да канца слове. Таму, магчыма, іх было password1 пароль. Такім чынам, вы можаце паспрабаваць перабірае ўсе словы ў слоўніку з адным дадаецца ў канцы. І тады, магчыма, пасля выканання гэтага, вы далучыць два канцы яго. Ці, можа быць карыстальнік спрабуе быць нават больш разумнымі, і яны хочуць, каб іх паролем, каб быць "хакерам", але яны збіраецца замяніць усе асобнікі Чысцільшчыкі з тройкамі. Так што вы можаце гэта рабіць. Перабору ўсіх слоў у слоўніку але замяніць сімвалы, якія падобныя на лічбы з гэтымі лічбамі. Так што такім чынам, вы маглі б злавіць яшчэ больш пароляў, якія сустракаюцца даволі часта. Але ў рэшце рэшт, толькі так вы можаце захапіць усе паролі грубай прымусіць перабору ўсіх Магчымыя радка. Такім чынам, у рэшце рэшт, вам трэба ітэрацыі над усімі радкамі ад аднаго персанажа да васьмі знакаў, якая можа заняць вельмі доўгі час, але вы павінны гэта зрабіць. Мяне клічуць Боб Боуден. І гэта расколіну.