1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Ich bin Rob und lasst uns loslegen. 3 00:00:15,890 --> 00:00:19,390 So aus dem pset spec daran erinnern, dass werden wir mehr brauchen, um die Nutzung 4 00:00:19,390 --> 00:00:20,890 Krypta Funktion. 5 00:00:20,890 --> 00:00:26,330 Für den Mann, Seite, haben wir zwei Hash definieren _xopensource. 6 00:00:26,330 --> 00:00:28,290 Mach dir keine Sorgen, warum Sorgen wir brauchen, um das zu tun. 7 00:00:28,290 --> 00:00:31,550 Und auch Hash gehören unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Also noch einmal, das ist aus dem Weg, lasst bekommen, um das eigentliche Programm. 9 00:00:35,920 --> 00:00:39,570 Das erste, was wir tun müssen, ist sicherzustellen, dass vom Benutzer eingegebenen eine gültige verschlüsselt 10 00:00:39,570 --> 00:00:41,520 Kennwort in der Befehlszeile. 11 00:00:41,520 --> 00:00:46,050 Denken Sie daran, dass das Programm soll wie slash dot Riss ausgeführt werden, und 12 00:00:46,050 --> 00:00:48,120 dann verschlüsselten String. 13 00:00:48,120 --> 00:00:52,990 >> So, hier sind wir prüfen, um sicherzustellen, dass argc zu zwei, wenn wir wollen 14 00:00:52,990 --> 00:00:54,380 weiter mit dem Programm. 15 00:00:54,380 --> 00:00:58,830 Wenn argc ist nicht zwei, bedeutet, dass entweder der Benutzer nicht geben eine verschlüsselte 16 00:00:58,830 --> 00:01:02,560 Passwort auf der Kommandozeile, oder sie trat mehr als nur die verschlüsselten 17 00:01:02,560 --> 00:01:05,379 Passwort auf der Kommandozeile, in denen Fall, dass wir nicht wissen, was zu tun mit der 18 00:01:05,379 --> 00:01:07,660 Befehlszeilenargumente. 19 00:01:07,660 --> 00:01:11,390 >> Also, wenn argc war zwei, können wir weitermachen. 20 00:01:11,390 --> 00:01:14,160 Und hier werden wir zu erklären, eine Variable verschlüsselt. 21 00:01:14,160 --> 00:01:17,650 Das ist gerade dabei, alias das Original argv1 so dass im Laufe dieses 22 00:01:17,650 --> 00:01:20,690 Programm, haben wir nicht, nennen es argv1, welche dann müssen Sie denken 23 00:01:20,690 --> 00:01:22,950 über das, was das eigentlich bedeutete. 24 00:01:22,950 --> 00:01:27,180 >> So endlich, wir wollen, dass validieren das verschlüsselte Passwort der Benutzer 25 00:01:27,180 --> 00:01:30,840 eingegeben könnte tatsächlich gewesen ein verschlüsseltes Passwort. 26 00:01:30,840 --> 00:01:35,120 Per der Manpage von Krypta, der verschlüsselte Passwort muss 13 sein 27 00:01:35,120 --> 00:01:36,440 Zeichen lang sein. 28 00:01:36,440 --> 00:01:41,500 Hier oben, bemerken, dass wir Hash definiert verschlüsseln Länge 13. 29 00:01:41,500 --> 00:01:46,140 So sind wir nur darauf achten, dass die String-Länge des verschlüsselten 30 00:01:46,140 --> 00:01:49,090 Passwort ist 13. 31 00:01:49,090 --> 00:01:52,280 >> Und wenn es nicht ist, wollen wir , um das Programm zu beenden. 32 00:01:52,280 --> 00:01:56,470 Also noch einmal, das ist aus dem Weg, können wir jetzt tatsächlich versuchen zu finden, was die 33 00:01:56,470 --> 00:02:00,410 vergessen, die das verschlüsselte gab vergessen war. 34 00:02:00,410 --> 00:02:04,870 Hier wollen wir, um das Salz zu greifen aus dem verschlüsselten Passwort. 35 00:02:04,870 --> 00:02:08,930 Erinnern Sie sich, nach der man-Seite, dass die ersten beiden Zeichen eines verschlüsselten 36 00:02:08,930 --> 00:02:10,590 String, wie hier - 37 00:02:10,590 --> 00:02:12,770 50ZPJ und so weiter - 38 00:02:12,770 --> 00:02:16,170 die ersten beiden Zeichen geben uns das Salz, das verwendet wurde, 39 00:02:16,170 --> 00:02:18,080 in der Krypta Funktion. 40 00:02:18,080 --> 00:02:21,740 >> Und hier sehen wir, dass das Salz ha war. 41 00:02:21,740 --> 00:02:27,610 So wollen wir die ersten beiden kopieren Zeichen, Salz Länge, die Hash- 42 00:02:27,610 --> 00:02:30,230 definiert als zwei. 43 00:02:30,230 --> 00:02:35,970 Wir müssen die ersten beiden Zeichen kopieren in dieser Anordnung Salz. 44 00:02:35,970 --> 00:02:39,340 Beachten Sie, dass wir Salz Länge benötigen zzgl. ein, da müssen wir noch eine Null 45 00:02:39,340 --> 00:02:42,440 Terminator am Ende unserer Salz. 46 00:02:42,440 --> 00:02:46,940 >> Dann werden wir dieses Array deklarieren, Gast, der Größe max Länge plus 47 00:02:46,940 --> 00:02:51,930 ein, wo max Länge Hash definiert acht, da die maximale vergessen 48 00:02:51,930 --> 00:02:55,090 ist acht Zeichen lang sein. 49 00:02:55,090 --> 00:02:59,860 Und wir werden diese nutzen, um durchlaufen über alle möglichen Zeichenfolgen, konnte 50 00:02:59,860 --> 00:03:01,430 gültig Passwörter. 51 00:03:01,430 --> 00:03:07,720 Also, wenn die gültigen Zeichen in einem Kennwort waren nur a, b, und c, dann 52 00:03:07,720 --> 00:03:14,970 wir würden über eine Iteration, b, c, aa, Ba, Ca, und so weiter, bis 53 00:03:14,970 --> 00:03:16,690 wir zu sehen bekommen, cccccccc - 54 00:03:16,690 --> 00:03:19,600 acht c ist. 55 00:03:19,600 --> 00:03:23,620 >> Und wenn wir nicht nach unten ein gültiges vergessen, dann müssen wir sagen, dass die 56 00:03:23,620 --> 00:03:26,590 verschlüsselten String war nicht gültig zu beginnen. 57 00:03:26,590 --> 00:03:29,970 So, jetzt erreichen wir dies, während 1-Schleife. 58 00:03:29,970 --> 00:03:33,100 Beachten Sie, dass bedeutet, es ist eine Endlosschleife. 59 00:03:33,100 --> 00:03:36,430 >> Hinweis Es sind keine break-Anweisung innerhalb dieser Endlosschleife. 60 00:03:36,430 --> 00:03:38,570 Es sind nur Aussagen zurück. 61 00:03:38,570 --> 00:03:41,210 Also haben wir eigentlich nie erwarten , um die Schleife zu schließen. 62 00:03:41,210 --> 00:03:44,750 Wir erwarten nur, um das Programm zu beenden. 63 00:03:44,750 --> 00:03:48,220 Ich habe diese print-Anweisung, um die hinzugefügten Anfang der Schleife nur ausdrucken 64 00:03:48,220 --> 00:03:51,790 was unsere aktuellen erraten was das Passwort ist. 65 00:03:51,790 --> 00:03:53,630 >> Nun, was ist diese Schleife zu tun? 66 00:03:53,630 --> 00:03:58,330 Es Schleife über alle möglichen Strings das könnte gültige Kennwörter sein. 67 00:03:58,330 --> 00:04:02,700 Das erste, was wir tun, ist nehmen unsere aktuelle Schätzung für das, was der 68 00:04:02,700 --> 00:04:03,920 vergessen ist. 69 00:04:03,920 --> 00:04:07,230 Wir nehmen das Salz, dass wir packte aus die verschlüsselte Zeichenfolge, und wir sind 70 00:04:07,230 --> 00:04:09,850 gehen, um die Vermutung zu verschlüsseln. 71 00:04:09,850 --> 00:04:14,760 Dies wird uns eine verschlüsselte Vermutung, was werden wir gegen vergleichen 72 00:04:14,760 --> 00:04:18,810 die verschlüsselte Zeichenfolge, die der Benutzer trat in der Befehlszeile. 73 00:04:18,810 --> 00:04:23,030 >> Wenn sie gleich sind, in welchem ​​Fall String vergleichbar wird null zurück, wenn 74 00:04:23,030 --> 00:04:28,050 sie sind die gleichen, dann denke war die vergessen, die das verschlüsselte erzeugt 75 00:04:28,050 --> 00:04:33,520 String, in diesem Fall können wir drucken , die uns als Passwort und zurück. 76 00:04:33,520 --> 00:04:37,520 Aber wenn sie nicht das gleiche, dass bedeutet, dass unsere Vermutung war falsch. 77 00:04:37,520 --> 00:04:43,250 >> Und wir wollen zu durchlaufen die nächste gültige Vermutung. 78 00:04:43,250 --> 00:04:46,410 Also das ist, was diese während Schleife zu tun versuchen. 79 00:04:46,410 --> 00:04:51,760 Es wird unsere Vermutung durchlaufen zum nächsten gültigen Vermutung. 80 00:04:51,760 --> 00:04:56,080 Beachten Sie, dass, wenn wir sagen, dass ein besonderen Charakter in unserer Vermutung hat 81 00:04:56,080 --> 00:05:01,770 erreicht die max Symbol, das hier Hash wird als Tilde definiert, da 82 00:05:01,770 --> 00:05:05,710 das ist der größte Wert ASCII Zeichen dass ein Benutzer bei der Eingabe 83 00:05:05,710 --> 00:05:11,210 Tastatur, wenn das Zeichen erreicht die max symbol, dann wollen wir senden 84 00:05:11,210 --> 00:05:17,150 es wieder auf das Minimum Symbol, das ist ein Raum, wieder die niedrigste ASCII 85 00:05:17,150 --> 00:05:20,800 Wertesymbol, dass ein Benutzer Geben Sie auf der Tastatur. 86 00:05:20,800 --> 00:05:22,940 >> So werden wir eingestellt, dass auf ein Minimum Symbol. 87 00:05:22,940 --> 00:05:25,720 Und dann werden wir gehen auf das nächste Zeichen. 88 00:05:25,720 --> 00:05:28,730 Also, wie sind unsere Vermutungen gehen zu durchlaufen? 89 00:05:28,730 --> 00:05:33,685 Nun, wenn die gültigen Zeichen sind a, b, und c, dann, wenn wir begannen mit a, 90 00:05:33,685 --> 00:05:36,630 es wird zu b durchlaufen, wird es durchlaufen, um c. 91 00:05:36,630 --> 00:05:44,360 c ist unser max Symbol, so dass wir gesetzt c zurück zu a, die minimale Symbol. 92 00:05:44,360 --> 00:05:48,100 Und dann werden wir durchlaufen Index zum nächsten Zeichen. 93 00:05:48,100 --> 00:05:53,920 >> Also, wenn die ursprüngliche Vermutung war, c, die nächste Charakter wird die null sein 94 00:05:53,920 --> 00:05:55,560 Terminator. 95 00:05:55,560 --> 00:06:00,670 Hier unten, feststellen, dass, wenn das Zeichen dass wollen wir nun 96 00:06:00,670 --> 00:06:04,690 Zuwachs war das Nullabschlusszeichen, dann werden wir es auf die eingestellte 97 00:06:04,690 --> 00:06:06,260 Minimum-Symbol. 98 00:06:06,260 --> 00:06:11,431 Also, wenn die Vermutung war, c, dann ist unser neue Schätzung wird aa sein. 99 00:06:11,431 --> 00:06:16,050 Und wenn unsere ursprüngliche Vermutung war, cccc, dann ist unsere neue Schätzung 100 00:06:16,050 --> 00:06:18,380 wird aaaaa sein. 101 00:06:18,380 --> 00:06:24,430 >> Also, wenn wir erreichen die maximale Zeichenfolge einer gegebenen Länge, dann sind wir 102 00:06:24,430 --> 00:06:29,090 gehen, um auf das Minimum String implementieren der nächsten Länge, die wird 103 00:06:29,090 --> 00:06:34,420 nur alle Zeichen sein die minimale Symbol. 104 00:06:34,420 --> 00:06:36,970 Nun, was ist diese Überprüfung denn hier? 105 00:06:36,970 --> 00:06:42,780 Nun, wenn Index bewegt sich von der achten Zeichen nach neun Zeichen - 106 00:06:42,780 --> 00:06:46,460 also fügen wir acht Jahren als c unsere bisherigen erraten - 107 00:06:46,460 --> 00:06:51,270 dann Index wird sich auf das konzentrieren, letzten Nullabschlusszeichen unserer Vermutung 108 00:06:51,270 --> 00:06:57,990 Array, das nicht eigentlich gemeint ist in unserem Passwort verwendet werden. 109 00:06:57,990 --> 00:07:03,530 >> Also, wenn wir an diesem letzten null konzentriert Terminator, dann haben wir keine gefunden 110 00:07:03,530 --> 00:07:07,750 Kennwort gültig ist mit nur acht Zeichen, das heißt, es gibt keinen 111 00:07:07,750 --> 00:07:10,550 gültiges Passwort, das verschlüsselt auf den angegebenen String. 112 00:07:10,550 --> 00:07:13,520 Und wir müssen das drucken, sagen konnten wir nicht finden, eine gültige 113 00:07:13,520 --> 00:07:16,100 vergessen, und zurück. 114 00:07:16,100 --> 00:07:20,280 Also das while-Schleife wird durchlaufen über alle möglichen Saiten. 115 00:07:20,280 --> 00:07:24,640 >> Findet er keine, die verschlüsselt an die erwartet verschlüsselten String, wird es 116 00:07:24,640 --> 00:07:26,190 Rückkehr dieses Passwort. 117 00:07:26,190 --> 00:07:29,610 Und es ist nichts findet, dann es wird zurückkehren, Druck, dass es 118 00:07:29,610 --> 00:07:31,910 war nicht in der Lage, etwas zu finden. 119 00:07:31,910 --> 00:07:39,220 Nun bemerken, dass Iteration über alle Saiten möglich ist wahrscheinlich zu 120 00:07:39,220 --> 00:07:40,420 eine Weile dauern. 121 00:07:40,420 --> 00:07:43,590 Lassen Sie tatsächlich sehen, wie lange das dauert. 122 00:07:43,590 --> 00:07:47,230 >> Lassen Sie uns zu knacken. 123 00:07:47,230 --> 00:07:51,050 Nun, oops - es sagt undefined Verweis auf Krypta. 124 00:07:51,050 --> 00:07:55,330 Also denken Sie daran, für die p setzt spec und auch die Manpage Krypta, dass wir 125 00:07:55,330 --> 00:07:58,130 müssen in Krypta verknüpfen. 126 00:07:58,130 --> 00:08:01,130 Nun, stellen Sie die Standard-Befehl nicht wissen, dass Sie 127 00:08:01,130 --> 00:08:03,010 wollen, um diese Funktion zu nutzen. 128 00:08:03,010 --> 00:08:09,680 >> Also lasst kopieren Sie diese Client-Kommando und fügen Sie einfach bis zum Ende 129 00:08:09,680 --> 00:08:13,300 es, die Verknüpfung Krypta. 130 00:08:13,300 --> 00:08:14,820 Nun kompiliert. 131 00:08:14,820 --> 00:08:23,880 Also lasst uns laufen Riss an einem bestimmten verschlüsselten String - 132 00:08:23,880 --> 00:08:25,130 so Cäsars. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Das war also ziemlich schnell. 135 00:08:30,790 --> 00:08:33,230 >> Beachten Sie, dass diese am 13. beendet. 136 00:08:33,230 --> 00:08:38,240 Nun, Cäsars verschlüsselte Passwort geschieht 13 sein. 137 00:08:38,240 --> 00:08:41,650 Lassen Sie uns also versuchen Sie ein anderes Passwort. 138 00:08:41,650 --> 00:08:45,830 Werfen wir Hirschhorn verschlüsselt Passwort und versuchen, dass Rissbildung. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> So bemerken wir schon erreicht drei Zeichen. 141 00:08:55,110 --> 00:08:58,660 Und wir sind über alle möglichen Iteration drei-Zeichenketten. 142 00:08:58,660 --> 00:09:01,420 Das heißt, wir haben bereits fertig Iteration über alles Mögliche und 143 00:09:01,420 --> 00:09:04,660 zwei Zeichenketten. 144 00:09:04,660 --> 00:09:09,180 Jetzt sieht es aus wie das wird eine Weile dauern, bevor wir erreichen die 145 00:09:09,180 --> 00:09:10,580 Vier-Zeichenketten. 146 00:09:10,580 --> 00:09:14,680 Es kann ein paar Minuten. 147 00:09:14,680 --> 00:09:16,055 >> Es dauerte nicht ein paar Minuten. 148 00:09:16,055 --> 00:09:18,450 Wir sind auf den vier-Zeichenketten. 149 00:09:18,450 --> 00:09:22,800 Aber jetzt müssen wir durchlaufen alle möglich Vier-Zeichenketten, die 150 00:09:22,800 --> 00:09:26,000 das könnte vielleicht 10 Minuten dauern. 151 00:09:26,000 --> 00:09:28,720 Und dann, wenn wir erreichen fünf Zeichen Strings, müssen wir durchlaufen alle 152 00:09:28,720 --> 00:09:31,450 von denen, die Macht nehmen Sie sich ein paar Stunden. 153 00:09:31,450 --> 00:09:34,080 Und wir müssen durchlaufen alle möglichen Sechs-Zeichenketten, die 154 00:09:34,080 --> 00:09:36,560 kann ein paar Tage und so weiter. 155 00:09:36,560 --> 00:09:41,380 >> So könnte es eine potenziell sehr lange dauern Zeit zur Iteration über alle möglichen 156 00:09:41,380 --> 00:09:44,850 acht Zeichen und weniger Strings. 157 00:09:44,850 --> 00:09:50,600 So fest, dass dies nicht unbedingt ein sehr effizienten Algorithmus zum Auffinden 158 00:09:50,600 --> 00:09:51,860 ein Passwort. 159 00:09:51,860 --> 00:09:54,540 Man könnte denken, dass es gibt bessere Möglichkeiten. 160 00:09:54,540 --> 00:10:02,230 Zum Beispiel das Passwort zyx! 32ab ist wahrscheinlich nicht sehr häufig vergessen, 161 00:10:02,230 --> 00:10:06,440 wohingegen das Passwort 12345 ist wahrscheinlich viel häufiger. 162 00:10:06,440 --> 00:10:13,570 >> So eine Möglichkeit zu versuchen, ein Passwort zu finden schneller ist, einfach schauen 163 00:10:13,570 --> 00:10:15,560 an Passwörter, die häufiger sind. 164 00:10:15,560 --> 00:10:20,480 So zum Beispiel, können wir versuchen, Wörter zu lesen aus einem Wörterbuch und versuchen alle 165 00:10:20,480 --> 00:10:24,860 diese Worte als unser Passwort errät. 166 00:10:24,860 --> 00:10:29,210 Nun, vielleicht ein Passwort ist nicht so einfach. 167 00:10:29,210 --> 00:10:32,600 Vielleicht ist der Benutzer war etwas schlau und versuchen, eine Zahl angehängt, um 168 00:10:32,600 --> 00:10:34,220 das Ende eines Wortes. 169 00:10:34,220 --> 00:10:37,000 >> Also vielleicht war ihr Passwort password1. 170 00:10:37,000 --> 00:10:41,520 So können Sie versuchen Iteration über alle Wörter im Wörterbuch mit einem 171 00:10:41,520 --> 00:10:43,210 an das Ende davon. 172 00:10:43,210 --> 00:10:47,360 Und dann vielleicht nach tun, werden Sie Anhängen eines zwei am Ende davon. 173 00:10:47,360 --> 00:10:50,240 >> Oder vielleicht wird der Benutzer versucht, sogar klüger, und sie wollen, dass ihre 174 00:10:50,240 --> 00:10:54,980 vergessen zu sein "Hacker", aber sie sind gehen, um alle Instanzen der e ersetzen 175 00:10:54,980 --> 00:10:56,600 mit Dreien. 176 00:10:56,600 --> 00:10:58,440 Also könnte man dies auch tun. 177 00:10:58,440 --> 00:11:02,100 Iteration über alle Wörter im Wörterbuch aber ersetzen Zeichen, dass 178 00:11:02,100 --> 00:11:04,790 aussehen Zahlen mit diesen Zahlen. 179 00:11:04,790 --> 00:11:09,670 >> Also diese Weise könnten Sie fangen sogar mehr Passwörter, die sehr verbreitet sind. 180 00:11:09,670 --> 00:11:14,690 Aber am Ende, der einzige Weg, können Sie erfassen alle Passwörter zu Brute 181 00:11:14,690 --> 00:11:17,340 zwingen, durchlaufen alle möglich Saiten. 182 00:11:17,340 --> 00:11:22,100 Also am Ende, brauchen Sie durchlaufen über alle Saiten von einem Charakter auf 183 00:11:22,100 --> 00:11:28,110 acht Zeichen, die eine nehmen könnte sehr lange Zeit, aber Sie brauchen, um es zu tun. 184 00:11:28,110 --> 00:11:30,024 >> Mein Name ist Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 Und das ist zu knacken. 186 00:11:31,425 --> 00:11:36,533