>> 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.