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 пароль. Таким образом, вы можете попробовать перебирает все слова в словаре с одним добавляется в конце. И тогда, возможно, после выполнения этого, вы присоединить два конца его. Или, может быть пользователь пытается быть даже более умными, и они хотят, чтобы их паролем, чтобы быть "хакером", но они собирается заменить все экземпляры ЧистильщиК с тройками. Так что вы можете это делать. Перебора всех слов в словаре но заменить символы, которые похожи на цифры с этими цифрами. Так что таким образом, вы могли бы поймать еще больше паролей, которые встречаются довольно часто. Но в конце концов, только так вы можете захватить все пароли грубой заставить перебора всех Возможные строки. Таким образом, в конце концов, вам нужно итерации над всеми строками от одного персонажа к восьми символов, которая может занять очень долгое время, но вы должны это сделать. Меня зовут Боб Боуден. И это трещину.