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 пароль. Таким чином, ви можете спробувати перебирає всі слова в словнику з одним додається в кінці. І тоді, можливо, після виконання цього, ви приєднати два кінці його. Або, може бути користувач намагається бути навіть більш розумними, і вони хочуть, щоб їх паролем, щоб бути "хакером", але вони збирається замінити всі примірники чистильників з трійками. Так що ви можете це робити. Перебору всіх слів у словнику але замінити символи, які схожі на цифри з цими цифрами. Так що таким чином, ви могли б зловити ще більше паролів, які зустрічаються досить часто. Але врешті-решт, тільки так ви можете захопити всі паролі грубої змусити перебору всіх Можливі рядка. Таким чином, в кінці кінців, вам потрібно ітерації над усіма рядками від одного персонажа до восьми символів, яка може зайняти дуже довгий час, але ви повинні це зробити. Мене звуть Боб Боуден. І це тріщину.