1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Я Роб, і давайте розтріскування. 3 00:00:15,890 --> 00:00:19,390 Так що пам'ятаєте з PSET специфікацію, яка ми збираємося бути необхідності використовувати 4 00:00:19,390 --> 00:00:20,890 Склеп функції. 5 00:00:20,890 --> 00:00:26,330 Для людини, сторінку, у нас є два Хеш визначити _xopensource. 6 00:00:26,330 --> 00:00:28,290 Не турбуйтеся про те, чому ми повинні зробити це. 7 00:00:28,290 --> 00:00:31,550 А також хеш включають unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Тому, як тільки це з шляху, давайте дістатися до фактичного програми. 9 00:00:35,920 --> 00:00:39,570 Перше, що нам потрібно зробити, це переконатися, що користувач ввів дійсний зашифрований 10 00:00:39,570 --> 00:00:41,520 пароль у командному рядку. 11 00:00:41,520 --> 00:00:46,050 Пам'ятайте, що програма повинна для виконання як тріщини точка слеш, і 12 00:00:46,050 --> 00:00:48,120 Потім зашифровану рядок. 13 00:00:48,120 --> 00:00:52,990 >> Так от ми перевіряємо, щоб переконатися, що ARGC до двох, якщо ми хочемо 14 00:00:52,990 --> 00:00:54,380 продовжити програму. 15 00:00:54,380 --> 00:00:58,830 Якщо ARGC не два, це означає, що або Користувач не ввів зашифроване 16 00:00:58,830 --> 00:01:02,560 пароль у командному рядку, або вони введено більше, ніж просто зашифрованих 17 00:01:02,560 --> 00:01:05,379 пароль у командному рядку, в якій випадку ми не знаємо, що робити з 18 00:01:05,379 --> 00:01:07,660 аргументи командного рядка. 19 00:01:07,660 --> 00:01:11,390 >> Так що якщо ARGC було два роки, ми можемо продовжувати. 20 00:01:11,390 --> 00:01:14,160 І ось, ми збираємося оголосити Мінлива зашифровані. 21 00:01:14,160 --> 00:01:17,650 Це просто буде оригінальним псевдонімом argv1 так, що протягом усього цього 22 00:01:17,650 --> 00:01:20,690 програми, ми не повинні називати його argv1, які потім ви повинні думати 23 00:01:20,690 --> 00:01:22,950 про те, що, що насправді мав на увазі. 24 00:01:22,950 --> 00:01:27,180 >> Таким чином, нарешті, ми хочемо перевірити, що зашифрований пароль користувача 25 00:01:27,180 --> 00:01:30,840 вступив могли насправді було зашифрований пароль. 26 00:01:30,840 --> 00:01:35,120 На сторінці керівництва склеп, зашифрований пароль повинен бути 13 27 00:01:35,120 --> 00:01:36,440 символів. 28 00:01:36,440 --> 00:01:41,500 Тут, нагорі, ми помітили, що хеш визначений шифрування довжиною як 13. 29 00:01:41,500 --> 00:01:46,140 Так що ми тільки переконавшись, що довжина рядка зашифрованих 30 00:01:46,140 --> 00:01:49,090 пароль 13. 31 00:01:49,090 --> 00:01:52,280 >> А якщо це не так, ми хочемо Для виходу з програми. 32 00:01:52,280 --> 00:01:56,470 Тому, як тільки це з шляху, ми можемо Зараз насправді намагаються знайти те, що 33 00:01:56,470 --> 00:02:00,410 пароль, який дав зашифрованих пароль був. 34 00:02:00,410 --> 00:02:04,870 Тут, ми хочемо, щоб захопити солі з зашифрованого пароля. 35 00:02:04,870 --> 00:02:08,930 Пам'ятайте, що за людина сторінці, що Перші два символи зашифрованою 36 00:02:08,930 --> 00:02:10,590 рядком, як тут - 37 00:02:10,590 --> 00:02:12,770 50ZPJ і так далі - 38 00:02:12,770 --> 00:02:16,170 Перші два символи дають нам сіль, який був використаний 39 00:02:16,170 --> 00:02:18,080 в склепі функції. 40 00:02:18,080 --> 00:02:21,740 >> І ось, ми бачимо, що сіль була га. 41 00:02:21,740 --> 00:02:27,610 Тому ми хочемо, щоб скопіювати перші два символів, сіль довжина становить хеш 42 00:02:27,610 --> 00:02:30,230 визначається як два. 43 00:02:30,230 --> 00:02:35,970 Ми повинні скопіювати перші два символи У цей масив, сіль. 44 00:02:35,970 --> 00:02:39,340 Зверніть увагу, що нам потрібна сіль довжиною плюс Один з них, так як ми все ще буде потрібно нуль 45 00:02:39,340 --> 00:02:42,440 термінатор наприкінці нашої солі. 46 00:02:42,440 --> 00:02:46,940 >> Потім ми збираємося оголосити цей масив, гість, розміром довжиною макс плюс 47 00:02:46,940 --> 00:02:51,930 Один з них, де максимальна довжина хеш визначений до восьми, так як максимальне пароль 48 00:02:51,930 --> 00:02:55,090 займає вісім символів. 49 00:02:55,090 --> 00:02:59,860 І ми збираємося використовувати це, щоб ітерації по всіх можливих рядки, які могли 50 00:02:59,860 --> 00:03:01,430 дійсними паролями. 51 00:03:01,430 --> 00:03:07,720 Так що, якщо допустимі символи в паролі були просто A, B, і C, то 52 00:03:07,720 --> 00:03:14,970 ми б перебрати, B, C, AA, BA, CA, і так далі, до 53 00:03:14,970 --> 00:03:16,690 Ми побачимо CCCCCCCC - 54 00:03:16,690 --> 00:03:19,600 вісім Сі. 55 00:03:19,600 --> 00:03:23,620 >> І якщо у нас є не вниз дійсне пароль, то ми повинні сказати, що 56 00:03:23,620 --> 00:03:26,590 зашифрованою рядки не було дійсні з самого початку. 57 00:03:26,590 --> 00:03:29,970 Так що тепер, ми досягнемо цього в той час як 1 петлю. 58 00:03:29,970 --> 00:03:33,100 Зверніть увагу, що означає, що це нескінченний цикл. 59 00:03:33,100 --> 00:03:36,430 >> Зверніть увагу, немає перерви заяву всередині цього нескінченного циклу. 60 00:03:36,430 --> 00:03:38,570 Там тільки повернути звітності. 61 00:03:38,570 --> 00:03:41,210 Таким чином, ми ніколи не очікували вийти з циклу. 62 00:03:41,210 --> 00:03:44,750 Ми тільки чекаємо виходу програми. 63 00:03:44,750 --> 00:03:48,220 Я додав цю печатку заяву верхній частині цього циклу просто роздрукувати 64 00:03:48,220 --> 00:03:51,790 те, що наші поточні здогадуватися що пароль. 65 00:03:51,790 --> 00:03:53,630 >> Тепер, що ця петля робить? 66 00:03:53,630 --> 00:03:58,330 Це цикл по всіх можливих рядків які можуть бути дійсним паролі. 67 00:03:58,330 --> 00:04:02,700 Перше, що ми збираємося зробити, це взяти наші поточні припущення за те, що 68 00:04:02,700 --> 00:04:03,920 пароль. 69 00:04:03,920 --> 00:04:07,230 Ми візьмемо солі, що ми схопили зашифровану рядок, і ми 70 00:04:07,230 --> 00:04:09,850 збирається шифрувати припущення. 71 00:04:09,850 --> 00:04:14,760 Це дасть нам зашифроване Guess, які ми збираємося для порівняння 72 00:04:14,760 --> 00:04:18,810 зашифрованою рядки, які користувач ввести в командний рядок. 73 00:04:18,810 --> 00:04:23,030 >> Якщо вони однакові, і в цьому випадку Рядок порівнянних поверне нуль, якщо 74 00:04:23,030 --> 00:04:28,050 вони те ж саме, то думаю, було паролем, який генерується зашифрований 75 00:04:28,050 --> 00:04:33,520 Рядок, в цьому випадку ми можемо надрукувати що наш пароль і повернення. 76 00:04:33,520 --> 00:04:37,520 Але якби вони були не те ж саме, що означає, що наше припущення було невірним. 77 00:04:37,520 --> 00:04:43,250 >> І ми хочемо, щоб ітерації наступного дійсного припущення. 78 00:04:43,250 --> 00:04:46,410 Так ось що це в той час Цикл намагається зробити. 79 00:04:46,410 --> 00:04:51,760 Це збирається підтверджуємо нашу здогадку до найближчого допустимого припущення. 80 00:04:51,760 --> 00:04:56,080 Зверніть увагу, що, коли ми говоримо, що особливий характер в нашій здогаду 81 00:04:56,080 --> 00:05:01,770 досягли символом Max, яка тут є хеш визначається як тільди, так як 82 00:05:01,770 --> 00:05:05,710 це найбільший ASCII значення символу , Які користувач може ввести в 83 00:05:05,710 --> 00:05:11,210 клавіатура, коли персонаж досягає макс символ, то ми хочемо послати 84 00:05:11,210 --> 00:05:17,150 його назад в символ мінімального, яке це простір, знову ж найнижчий ASCII 85 00:05:17,150 --> 00:05:20,800 значення символу, який користувач може введіть з клавіатури. 86 00:05:20,800 --> 00:05:22,940 >> Таким чином, ми збираємося встановити, що до мінімального символу. 87 00:05:22,940 --> 00:05:25,720 А потім ми збираємося піти на наступний характер. 88 00:05:25,720 --> 00:05:28,730 Так як же наші здогадки збирається ітерації? 89 00:05:28,730 --> 00:05:33,685 Ну, якщо дозволяється використовувати символи A, B, і С, то, якщо ми почали з, 90 00:05:33,685 --> 00:05:36,630 це буде ітерації б, це буде ітерації до с. 91 00:05:36,630 --> 00:05:44,360 З нашої макс символ, тому ми встановимо Повернутися до C, мінімальна символом. 92 00:05:44,360 --> 00:05:48,100 І тоді ми ітерації індекс до наступного символу. 93 00:05:48,100 --> 00:05:53,920 >> Таким чином, якщо вихідне припущення було з, наступного характер буде нульовим 94 00:05:53,920 --> 00:05:55,560 термінатора. 95 00:05:55,560 --> 00:06:00,670 Тут, внизу, зауважив, що якщо символ що ми тепер хочемо 96 00:06:00,670 --> 00:06:04,690 приріст склав нульової термінатор, Потім ми збираємося встановити його на 97 00:06:04,690 --> 00:06:06,260 символ мінімального. 98 00:06:06,260 --> 00:06:11,431 Таким чином, якщо припущення було C, то наша нова здогадка буде АА. 99 00:06:11,431 --> 00:06:16,050 І якщо наше припущення було оригінальним КПКГ, то наша нова здогадка 100 00:06:16,050 --> 00:06:18,380 буде ааааа. 101 00:06:18,380 --> 00:06:24,430 >> Тому, коли ми досягаємо максимальної рядка заданої довжини, то ми 102 00:06:24,430 --> 00:06:29,090 має намір реалізувати до мінімальної рядком чергового довжину, яка буде 103 00:06:29,090 --> 00:06:34,420 просто всі символи мінімальний символ. 104 00:06:34,420 --> 00:06:36,970 Тепер, що ця перевірка тут робиш? 105 00:06:36,970 --> 00:06:42,780 Ну, якщо індекс переїхав з восьмого характеру до дев'яти характеру - 106 00:06:42,780 --> 00:06:46,460 тому ми додамо вісім C як наші попередні вгадати - 107 00:06:46,460 --> 00:06:51,270 Потім індекс збирається зосередитися на останній нульовий символ нашого припущення 108 00:06:51,270 --> 00:06:57,990 масиву, який не призначений, щоб фактично використовуватися в нашій пароля. 109 00:06:57,990 --> 00:07:03,530 >> Так що, якщо ми зосереджені на тому останньому нульовим термінатор, то ми не знайшли 110 00:07:03,530 --> 00:07:07,750 пароль, дійсний використовуючи тільки вісім символів, що означає немає 111 00:07:07,750 --> 00:07:10,550 правильний пароль, який шифрує в цьому рядку. 112 00:07:10,550 --> 00:07:13,520 І у нас є для друку, що, кажучи ми не могли знайти дійсну 113 00:07:13,520 --> 00:07:16,100 пароль і повернення. 114 00:07:16,100 --> 00:07:20,280 Так що це поки петля збирається ітерації по всіх можливих рядків. 115 00:07:20,280 --> 00:07:24,640 >> Якщо вона знаходить будь-які, який шифрує до Очікується зашифровану рядок, він буде 116 00:07:24,640 --> 00:07:26,190 повернути цей пароль. 117 00:07:26,190 --> 00:07:29,610 І він не знаходить нічого, то він повернеться, друк, що вона 118 00:07:29,610 --> 00:07:31,910 не зміг нічого знайти. 119 00:07:31,910 --> 00:07:39,220 Тепер, зверніть увагу, що перебирає всі Можливі рядки, ймовірно, буде 120 00:07:39,220 --> 00:07:40,420 зайняти деякий час. 121 00:07:40,420 --> 00:07:43,590 Давайте подивимося, як насправді довго, що бере. 122 00:07:43,590 --> 00:07:47,230 >> Давайте зробимо тріщину. 123 00:07:47,230 --> 00:07:51,050 Ну, ой - це говорить про невизначених посилання на склеп. 124 00:07:51,050 --> 00:07:55,330 Так що пам'ятайте, для р встановлює специфікації і Також в довідковій сторінці склепі, що ми 125 00:07:55,330 --> 00:07:58,130 потрібно зв'язати в склепі. 126 00:07:58,130 --> 00:08:01,130 Тепер, використовується за умовчанням командою не знаю, що ви 127 00:08:01,130 --> 00:08:03,010 хочете використовувати цю функцію. 128 00:08:03,010 --> 00:08:09,680 >> Так давайте скопіюємо цю команду клієнта і просто додати до кінця 129 00:08:09,680 --> 00:08:13,300 його, пов'язуючи склеп. 130 00:08:13,300 --> 00:08:14,820 Тепер, він компілює. 131 00:08:14,820 --> 00:08:23,880 Так що давайте працювати тріщини на даному зашифровану рядок - 132 00:08:23,880 --> 00:08:25,130 так Цезаря. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Так що було досить швидко. 135 00:08:30,790 --> 00:08:33,230 >> Зверніть увагу, що це закінчилося на 13. 136 00:08:33,230 --> 00:08:38,240 Ну, зашифрований пароль Цезаря трапляється, 13. 137 00:08:38,240 --> 00:08:41,650 Так давайте спробуємо інший пароль. 138 00:08:41,650 --> 00:08:45,830 Давайте зашифрованих Hirschhorn учасника пароль і спробуйте розтріскування, що. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Так, зауважте, ми вже досягли три символи. 141 00:08:55,110 --> 00:08:58,660 І ми перебирає всі можливі три-символьні рядки. 142 00:08:58,660 --> 00:09:01,420 Це означає, що ми вже закінчити перебирає всі можливі і 143 00:09:01,420 --> 00:09:04,660 два рядки символів. 144 00:09:04,660 --> 00:09:09,180 Тепер, схоже, що це буде зайняти деякий час, перш ніж ми досягнемо 145 00:09:09,180 --> 00:09:10,580 чотири-символьні рядки. 146 00:09:10,580 --> 00:09:14,680 Це може зайняти кілька хвилин. 147 00:09:14,680 --> 00:09:16,055 >> Це не займе пару хвилин. 148 00:09:16,055 --> 00:09:18,450 Ми на чотири-символьні рядки. 149 00:09:18,450 --> 00:09:22,800 Але тепер, ми повинні перебрати всі можливі чотири рядки символів, які 150 00:09:22,800 --> 00:09:26,000 , Що може бути, може зайняти 10 хвилин. 151 00:09:26,000 --> 00:09:28,720 А потім, коли ми досягаємо п'яти символів рядків, ми повинні перебрати всі 152 00:09:28,720 --> 00:09:31,450 з тих, які могли б зайняти кілька годин. 153 00:09:31,450 --> 00:09:34,080 І ми повинні перебрати всі можливі шести символів рядка, які 154 00:09:34,080 --> 00:09:36,560 може зайняти кілька днів, і так далі. 155 00:09:36,560 --> 00:09:41,380 >> Так що це може зайняти потенційно дуже довго Час для перебору всіх можливих 156 00:09:41,380 --> 00:09:44,850 восьми символів і менше рядків. 157 00:09:44,850 --> 00:09:50,600 Так зауважити, що це не обов'язково дуже ефективний алгоритм для пошуку 158 00:09:50,600 --> 00:09:51,860 пароля. 159 00:09:51,860 --> 00:09:54,540 Можна подумати, що там більш ефективні способи. 160 00:09:54,540 --> 00:10:02,230 Наприклад, пароль ZYX! 32ab , Ймовірно, не дуже поширене пароль, 161 00:10:02,230 --> 00:10:06,440 в той час як пароль 12345 ймовірно, набагато більше спільного. 162 00:10:06,440 --> 00:10:13,570 >> Так один із способів намагається знайти пароль швидше, щоб просто дивитися 163 00:10:13,570 --> 00:10:15,560 на паролі, які є більш поширеними. 164 00:10:15,560 --> 00:10:20,480 Так, наприклад, ми можемо спробувати прочитати слова зі словника і спробувати все 165 00:10:20,480 --> 00:10:24,860 ці слова, як наші здогадки пароля. 166 00:10:24,860 --> 00:10:29,210 Тепер, можливо пароль не все так просто. 167 00:10:29,210 --> 00:10:32,600 Може бути, користувачеві було кілька розумних і спробуйте додати номер 168 00:10:32,600 --> 00:10:34,220 До кінця слові. 169 00:10:34,220 --> 00:10:37,000 >> Тому, можливо, їх було password1 пароль. 170 00:10:37,000 --> 00:10:41,520 Таким чином, ви можете спробувати перебирає всі слова в словнику з одним 171 00:10:41,520 --> 00:10:43,210 додається в кінці. 172 00:10:43,210 --> 00:10:47,360 І тоді, можливо, після виконання цього, ви приєднати два кінці його. 173 00:10:47,360 --> 00:10:50,240 >> Або, може бути користувач намагається бути навіть більш розумними, і вони хочуть, щоб їх 174 00:10:50,240 --> 00:10:54,980 паролем, щоб бути "хакером", але вони збирається замінити всі примірники чистильників 175 00:10:54,980 --> 00:10:56,600 з трійками. 176 00:10:56,600 --> 00:10:58,440 Так що ви можете це робити. 177 00:10:58,440 --> 00:11:02,100 Перебору всіх слів у словнику але замінити символи, які 178 00:11:02,100 --> 00:11:04,790 схожі на цифри з цими цифрами. 179 00:11:04,790 --> 00:11:09,670 >> Так що таким чином, ви могли б зловити ще більше паролів, які зустрічаються досить часто. 180 00:11:09,670 --> 00:11:14,690 Але врешті-решт, тільки так ви можете захопити всі паролі грубої 181 00:11:14,690 --> 00:11:17,340 змусити перебору всіх Можливі рядка. 182 00:11:17,340 --> 00:11:22,100 Таким чином, в кінці кінців, вам потрібно ітерації над усіма рядками від одного персонажа до 183 00:11:22,100 --> 00:11:28,110 восьми символів, яка може зайняти дуже довгий час, але ви повинні це зробити. 184 00:11:28,110 --> 00:11:30,024 >> Мене звуть Боб Боуден. 185 00:11:30,024 --> 00:11:31,425 І це тріщину. 186 00:11:31,425 --> 00:11:36,533