ROB BOWDEN: Ich bin Rob und lasst uns loslegen. So aus dem pset spec daran erinnern, dass werden wir mehr brauchen, um die Nutzung Krypta Funktion. Für den Mann, Seite, haben wir zwei Hash definieren _xopensource. Mach dir keine Sorgen, warum Sorgen wir brauchen, um das zu tun. Und auch Hash gehören unistd.h. Also noch einmal, das ist aus dem Weg, lasst bekommen, um das eigentliche Programm. Das erste, was wir tun müssen, ist sicherzustellen, dass vom Benutzer eingegebenen eine gültige verschlüsselt Kennwort in der Befehlszeile. Denken Sie daran, dass das Programm soll wie slash dot Riss ausgeführt werden, und dann verschlüsselten String. So, hier sind wir prüfen, um sicherzustellen, dass argc zu zwei, wenn wir wollen weiter mit dem Programm. Wenn argc ist nicht zwei, bedeutet, dass entweder der Benutzer nicht geben eine verschlüsselte Passwort auf der Kommandozeile, oder sie trat mehr als nur die verschlüsselten Passwort auf der Kommandozeile, in denen Fall, dass wir nicht wissen, was zu tun mit der Befehlszeilenargumente. Also, wenn argc war zwei, können wir weitermachen. Und hier werden wir zu erklären, eine Variable verschlüsselt. Das ist gerade dabei, alias das Original argv1 so dass im Laufe dieses Programm, haben wir nicht, nennen es argv1, welche dann müssen Sie denken über das, was das eigentlich bedeutete. So endlich, wir wollen, dass validieren das verschlüsselte Passwort der Benutzer eingegeben könnte tatsächlich gewesen ein verschlüsseltes Passwort. Per der Manpage von Krypta, der verschlüsselte Passwort muss 13 sein Zeichen lang sein. Hier oben, bemerken, dass wir Hash definiert verschlüsseln Länge 13. So sind wir nur darauf achten, dass die String-Länge des verschlüsselten Passwort ist 13. Und wenn es nicht ist, wollen wir , um das Programm zu beenden. Also noch einmal, das ist aus dem Weg, können wir jetzt tatsächlich versuchen zu finden, was die vergessen, die das verschlüsselte gab vergessen war. Hier wollen wir, um das Salz zu greifen aus dem verschlüsselten Passwort. Erinnern Sie sich, nach der man-Seite, dass die ersten beiden Zeichen eines verschlüsselten String, wie hier - 50ZPJ und so weiter - die ersten beiden Zeichen geben uns das Salz, das verwendet wurde, in der Krypta Funktion. Und hier sehen wir, dass das Salz ha war. So wollen wir die ersten beiden kopieren Zeichen, Salz Länge, die Hash- definiert als zwei. Wir müssen die ersten beiden Zeichen kopieren in dieser Anordnung Salz. Beachten Sie, dass wir Salz Länge benötigen zzgl. ein, da müssen wir noch eine Null Terminator am Ende unserer Salz. Dann werden wir dieses Array deklarieren, Gast, der Größe max Länge plus ein, wo max Länge Hash definiert acht, da die maximale vergessen ist acht Zeichen lang sein. Und wir werden diese nutzen, um durchlaufen über alle möglichen Zeichenfolgen, konnte gültig Passwörter. Also, wenn die gültigen Zeichen in einem Kennwort waren nur a, b, und c, dann wir würden über eine Iteration, b, c, aa, Ba, Ca, und so weiter, bis wir zu sehen bekommen, cccccccc - acht c ist. Und wenn wir nicht nach unten ein gültiges vergessen, dann müssen wir sagen, dass die verschlüsselten String war nicht gültig zu beginnen. So, jetzt erreichen wir dies, während 1-Schleife. Beachten Sie, dass bedeutet, es ist eine Endlosschleife. Hinweis Es sind keine break-Anweisung innerhalb dieser Endlosschleife. Es sind nur Aussagen zurück. Also haben wir eigentlich nie erwarten , um die Schleife zu schließen. Wir erwarten nur, um das Programm zu beenden. Ich habe diese print-Anweisung, um die hinzugefügten Anfang der Schleife nur ausdrucken was unsere aktuellen erraten was das Passwort ist. Nun, was ist diese Schleife zu tun? Es Schleife über alle möglichen Strings das könnte gültige Kennwörter sein. Das erste, was wir tun, ist nehmen unsere aktuelle Schätzung für das, was der vergessen ist. Wir nehmen das Salz, dass wir packte aus die verschlüsselte Zeichenfolge, und wir sind gehen, um die Vermutung zu verschlüsseln. Dies wird uns eine verschlüsselte Vermutung, was werden wir gegen vergleichen die verschlüsselte Zeichenfolge, die der Benutzer trat in der Befehlszeile. Wenn sie gleich sind, in welchem ​​Fall String vergleichbar wird null zurück, wenn sie sind die gleichen, dann denke war die vergessen, die das verschlüsselte erzeugt String, in diesem Fall können wir drucken , die uns als Passwort und zurück. Aber wenn sie nicht das gleiche, dass bedeutet, dass unsere Vermutung war falsch. Und wir wollen zu durchlaufen die nächste gültige Vermutung. Also das ist, was diese während Schleife zu tun versuchen. Es wird unsere Vermutung durchlaufen zum nächsten gültigen Vermutung. Beachten Sie, dass, wenn wir sagen, dass ein besonderen Charakter in unserer Vermutung hat erreicht die max Symbol, das hier Hash wird als Tilde definiert, da das ist der größte Wert ASCII Zeichen dass ein Benutzer bei der Eingabe Tastatur, wenn das Zeichen erreicht die max symbol, dann wollen wir senden es wieder auf das Minimum Symbol, das ist ein Raum, wieder die niedrigste ASCII Wertesymbol, dass ein Benutzer Geben Sie auf der Tastatur. So werden wir eingestellt, dass auf ein Minimum Symbol. Und dann werden wir gehen auf das nächste Zeichen. Also, wie sind unsere Vermutungen gehen zu durchlaufen? Nun, wenn die gültigen Zeichen sind a, b, und c, dann, wenn wir begannen mit a, es wird zu b durchlaufen, wird es durchlaufen, um c. c ist unser max Symbol, so dass wir gesetzt c zurück zu a, die minimale Symbol. Und dann werden wir durchlaufen Index zum nächsten Zeichen. Also, wenn die ursprüngliche Vermutung war, c, die nächste Charakter wird die null sein Terminator. Hier unten, feststellen, dass, wenn das Zeichen dass wollen wir nun Zuwachs war das Nullabschlusszeichen, dann werden wir es auf die eingestellte Minimum-Symbol. Also, wenn die Vermutung war, c, dann ist unser neue Schätzung wird aa sein. Und wenn unsere ursprüngliche Vermutung war, cccc, dann ist unsere neue Schätzung wird aaaaa sein. Also, wenn wir erreichen die maximale Zeichenfolge einer gegebenen Länge, dann sind wir gehen, um auf das Minimum String implementieren der nächsten Länge, die wird nur alle Zeichen sein die minimale Symbol. Nun, was ist diese Überprüfung denn hier? Nun, wenn Index bewegt sich von der achten Zeichen nach neun Zeichen - also fügen wir acht Jahren als c unsere bisherigen erraten - dann Index wird sich auf das konzentrieren, letzten Nullabschlusszeichen unserer Vermutung Array, das nicht eigentlich gemeint ist in unserem Passwort verwendet werden. Also, wenn wir an diesem letzten null konzentriert Terminator, dann haben wir keine gefunden Kennwort gültig ist mit nur acht Zeichen, das heißt, es gibt keinen gültiges Passwort, das verschlüsselt auf den angegebenen String. Und wir müssen das drucken, sagen konnten wir nicht finden, eine gültige vergessen, und zurück. Also das while-Schleife wird durchlaufen über alle möglichen Saiten. Findet er keine, die verschlüsselt an die erwartet verschlüsselten String, wird es Rückkehr dieses Passwort. Und es ist nichts findet, dann es wird zurückkehren, Druck, dass es war nicht in der Lage, etwas zu finden. Nun bemerken, dass Iteration über alle Saiten möglich ist wahrscheinlich zu eine Weile dauern. Lassen Sie tatsächlich sehen, wie lange das dauert. Lassen Sie uns zu knacken. Nun, oops - es sagt undefined Verweis auf Krypta. Also denken Sie daran, für die p setzt spec und auch die Manpage Krypta, dass wir müssen in Krypta verknüpfen. Nun, stellen Sie die Standard-Befehl nicht wissen, dass Sie wollen, um diese Funktion zu nutzen. Also lasst kopieren Sie diese Client-Kommando und fügen Sie einfach bis zum Ende es, die Verknüpfung Krypta. Nun kompiliert. Also lasst uns laufen Riss an einem bestimmten verschlüsselten String - so Cäsars. Das war also ziemlich schnell. Beachten Sie, dass diese am 13. beendet. Nun, Cäsars verschlüsselte Passwort geschieht 13 sein. Lassen Sie uns also versuchen Sie ein anderes Passwort. Werfen wir Hirschhorn verschlüsselt Passwort und versuchen, dass Rissbildung. So bemerken wir schon erreicht drei Zeichen. Und wir sind über alle möglichen Iteration drei-Zeichenketten. Das heißt, wir haben bereits fertig Iteration über alles Mögliche und zwei Zeichenketten. Jetzt sieht es aus wie das wird eine Weile dauern, bevor wir erreichen die Vier-Zeichenketten. Es kann ein paar Minuten. Es dauerte nicht ein paar Minuten. Wir sind auf den vier-Zeichenketten. Aber jetzt müssen wir durchlaufen alle möglich Vier-Zeichenketten, die das könnte vielleicht 10 Minuten dauern. Und dann, wenn wir erreichen fünf Zeichen Strings, müssen wir durchlaufen alle von denen, die Macht nehmen Sie sich ein paar Stunden. Und wir müssen durchlaufen alle möglichen Sechs-Zeichenketten, die kann ein paar Tage und so weiter. So könnte es eine potenziell sehr lange dauern Zeit zur Iteration über alle möglichen acht Zeichen und weniger Strings. So fest, dass dies nicht unbedingt ein sehr effizienten Algorithmus zum Auffinden ein Passwort. Man könnte denken, dass es gibt bessere Möglichkeiten. Zum Beispiel das Passwort zyx! 32ab ist wahrscheinlich nicht sehr häufig vergessen, wohingegen das Passwort 12345 ist wahrscheinlich viel häufiger. So eine Möglichkeit zu versuchen, ein Passwort zu finden schneller ist, einfach schauen an Passwörter, die häufiger sind. So zum Beispiel, können wir versuchen, Wörter zu lesen aus einem Wörterbuch und versuchen alle diese Worte als unser Passwort errät. Nun, vielleicht ein Passwort ist nicht so einfach. Vielleicht ist der Benutzer war etwas schlau und versuchen, eine Zahl angehängt, um das Ende eines Wortes. Also vielleicht war ihr Passwort password1. So können Sie versuchen Iteration über alle Wörter im Wörterbuch mit einem an das Ende davon. Und dann vielleicht nach tun, werden Sie Anhängen eines zwei am Ende davon. Oder vielleicht wird der Benutzer versucht, sogar klüger, und sie wollen, dass ihre vergessen zu sein "Hacker", aber sie sind gehen, um alle Instanzen der e ersetzen mit Dreien. Also könnte man dies auch tun. Iteration über alle Wörter im Wörterbuch aber ersetzen Zeichen, dass aussehen Zahlen mit diesen Zahlen. Also diese Weise könnten Sie fangen sogar mehr Passwörter, die sehr verbreitet sind. Aber am Ende, der einzige Weg, können Sie erfassen alle Passwörter zu Brute zwingen, durchlaufen alle möglich Saiten. Also am Ende, brauchen Sie durchlaufen über alle Saiten von einem Charakter auf acht Zeichen, die eine nehmen könnte sehr lange Zeit, aber Sie brauchen, um es zu tun. Mein Name ist Rob Bowden. Und das ist zu knacken.