ROB BOWDEN: Je suis Rob, et Sortons fissuration. Alors, n'oubliez pas de le spec pset que nous allons avoir besoin d'utiliser le fonction crypt. Pour la page de manuel, nous avons deux hash définir _xopensource. Ne vous inquiétez pas pourquoi nous avons besoin de le faire. Et aussi de hachage comprennent unistd.h. Donc, une fois que c'est sur la route, nous allons obtenir le programme réel. La première chose que nous devons faire est de s'assurer l'utilisateur a entré une chiffré valide le mot de passe à la ligne de commande. Rappelez-vous que le programme est censé pour être exécuté comme point slash crack, et puis chaîne cryptée. Donc, ici nous vérification pour s'assurer que que argc à deux si nous voulons poursuivre le programme. Si argc n'est pas deux, cela signifie que soit l'utilisateur n'a pas une connexion cryptée le mot de passe à la ligne de commande, ou bien ils entré plus que la crypté le mot de passe à la ligne de commande, dans lequel cas, nous ne savons pas quoi faire avec le arguments de ligne de commande. Donc, si argc avait deux ans, nous pouvons continuer. Et ici, nous allons déclarer un crypté variable. Cela va juste alias l'original argv1 de telle sorte que tout au long de cette programme, nous n'avons pas l'appeler argv1, qui alors vous devez penser sur ce que signifiait réellement. Donc finalement, nous voulons valider que le mot de passe crypté de l'utilisateur entré auraient effectivement été un mot de passe crypté. Par la page de manuel de crypt, l' mot de passe crypté doit être de 13 caractères. Jusqu'à ici, remarquons que nous hachage défini crypter durée de 13 ans. Donc, nous sommes en train de faire en sorte que le longueur de la chaîne de l'crypté mot de passe est de 13. Et si c'est non, nous voulons pour quitter le programme. Donc, une fois que c'est sur le chemin, nous pouvons maintenant effectivement essayer de trouver ce que l' mot de passe qui a donné l'crypté mot de passe était. Ici, nous voulons récupérer le sel du mot de passe crypté. Rappelez-vous, par la page de manuel, que l' deux premiers caractères d'une chiffré chaîne, comme ici - 50ZPJ et ainsi de suite - les deux premiers caractères donnent nous le sel qui a été utilisé dans la fonction crypt. Et ici, nous voyons que le sel était ha. Donc, nous voulons copier les deux premiers caractères, la longueur du sel étant de hachage défini comme étant deux. Nous devons copier les deux premiers caractères dans ce tableau, le sel. Notez que nous devons longueur de sel, plus , puisque nous avons encore besoin d'un nul terminator à la fin de notre sel. Ensuite, nous allons déclarer ce tableau, invité, de taille longueur max plus un, où la longueur maximale est de hachage définie que huit, depuis le mot de passe maximale est de huit caractères. Et nous allons l'utiliser pour itérer sur toutes les chaînes possibles qui pourraient être des mots de passe valides. Donc, si les caractères valides dans un mot de passe étaient tout a, b, et c, puis nous itérer sur a, b, c, aa, Ba, Ca, et ainsi de suite, jusqu'à ce que nous arrivons à voir cccccccc - huit c de. Et si nous n'avons pas descendre valide mot de passe, alors nous devons dire que l' chaîne cryptée n'était pas valable pour commencer. Alors maintenant, nous arrivons à cela tout en 1 boucle. Notez cela signifie qu'il est une boucle infinie. Remarquez qu'il n'y a pas de déclaration de rupture à l'intérieur de cette boucle infinie. Il ya seulement revenir déclarations. Donc, nous n'attendons jamais réellement à sortir de la boucle. Nous ne prévoyons pour quitter le programme. J'ai ajouté cette déclaration d'impression à l' haut de cette boucle à juste imprimer ce que notre estimation actuelle à ce que le mot de passe. Maintenant, quelle est cette boucle fait? Il tourne en boucle sur toutes les chaînes possibles ce pourrait être les mots de passe valides. La première chose que nous allons faire est prendre notre estimation actuelle pour ce que l' mot de passe. Nous prendrons le sel que nous avons pris de la chaîne cryptée, et nous sommes aller à chiffrer le deviner. Cela nous donnera une estimation chiffrée, que nous allons à comparer la chaîne cryptée que l'utilisateur entré à la ligne de commande. Si elles sont identiques, auquel cas chaîne comparable retournera zéro, si ils sont les mêmes, alors deviner était le mot de passe qui a généré l'crypté chaîne, dans ce cas, nous pouvons imprimer que notre mot de passe et retour. Mais s'ils n'étaient pas les mêmes, que signifie que notre supposition était erronée. Et nous voulons réitérer à la conjecture valide prochaine. Donc, c'est ce que ce tout boucle essaie de faire. Il va parcourir notre conjecture à l'autre supposition valide. Notez que lorsque nous disons qu'un caractère particulier de notre conjecture a atteint le symbole max, qui ici hash est défini comme un tilde, depuis c'est le plus grand caractère de valeur ASCII qu'un utilisateur peut entrer à l' clavier, lorsque le personnage atteint le Symbole max, alors que nous voulons envoyer il sur le symbole minimum, qui est un espace, encore une fois le plus bas ASCII symbole de valeur qu'un utilisateur puisse Entrez au clavier. Donc, nous allons mettre cela le symbole minimum. Et puis nous allons aller sur le caractère suivant. Alors, comment sont nos suppositions aller à parcourir? Eh bien, si les caractères valides sont A, B, et c, alors si nous avons commencé avec un, il va itérer à b, il va itérer à c. c est notre symbole max, donc on va mettre c revenir à un, le symbole minimum. Et puis nous parcourons index au caractère suivant. Donc, si la conjecture initiale était c, la prochaine personnage va être le nul terminateur. Ici-bas, notez que si le caractère que nous voulons maintenant minimum a été le terminateur null, alors nous allons mettre à l' Symbole minimum. Donc, si la conjecture était c, alors notre nouvelle estimation va être aa. Et si notre hypothèse de départ était cccc, notre nouvelle conjecture va être AAAAA. Donc, chaque fois que nous arrivons à la chaîne maximale d'une longueur donnée, alors nous sommes va mettre en œuvre pour la chaîne minimum de la longueur suivante qui sera juste être tous les caractères d' le symbole minimum. Maintenant, quelle est cette vérification fais ici? Eh bien, si l'indice est passé de la huitième caractère à caractère neuf - si nous ajoutons huit c de l'AS notre précédente deviner - puis l'indice va se concentrer sur la dernière terminaison nulle de notre conjecture tableau, ce qui n'est pas destiné à réellement être utilisé dans notre mot de passe. Donc, si nous nous concentrons sur ce dernier null terminateur, alors nous n'avons pas trouvé un mot de passe qui est valide en utilisant seulement huit caractères, ce qui signifie qu'il n'ya pas mot de passe valides qui crypte de la chaîne donnée. Et nous avons l'impression que, en disant: nous n'avons pas pu trouver un valide mot de passe, et de retour. Donc, cette boucle while va itérer sur toutes les chaînes possibles. S'il en trouve qui crypte à l' chaîne cryptée prévu, il va retourner ce mot de passe. Et il ne trouve rien, alors il sera de retour, l'impression qu'il n'était pas en mesure de trouver quoi que ce soit. Maintenant, remarquez que l'itération sur tous chaînes possibles va probablement prendre un certain temps. Voyons voir réellement comment temps que cela prendra. Faisons fissure. Eh bien, oups - il dit undefined référence à la crypte. Donc n'oubliez pas, pour le p définit les spécifications et également la page de manuel de crypt que nous besoin d'un lien dans la crypte. Maintenant, la valeur par défaut la commande make ne sait pas que vous vouloir utiliser cette fonction. Donc, nous allons copier cette commande client et il suffit d'ajouter à la fin de celui-ci, de la crypte de liaison. Maintenant, il compile. Alors lançons fissure sur une donnée chaîne cryptée - si César. C'était donc assez vite. Notez que cela s'est terminé le 13. Eh bien, mot de passe crypté César se trouve être 13. Essayons donc un autre mot de passe. Prenons crypté Hirschhorn mot de passe et essayer de craquage qui. Donc remarquerez que nous avons déjà atteint trois personnages. Et nous itérer sur tous les possibles cordes à trois caractères. Cela signifie que nous avons déjà fini itération sur une possible et deux chaînes de caractères. Maintenant, il semble que cela va prendre un certain temps avant que nous atteignions l' chaînes de quatre caractères. Cela peut prendre quelques minutes. Il n'a pas fallu quelques minutes. Nous sommes sur les chaînes de quatre caractères. Mais maintenant, nous avons besoin d'itérer sur tous les chaînes de quatre caractères possibles, ce qui qui pourrait prendre peut-être 10 minutes. Et puis, quand nous arrivons à cinq caractères cordes, nous avons besoin d'itérer sur tous les de ceux qui pourraient prendre quelques heures. Et nous avons besoin d'itérer sur tous les possibles six chaînes de caractères, qui pourrait prendre quelques jours et ainsi de suite. Donc, il pourrait prendre un potentiellement très long temps pour parcourir tout possible huit caractères et moins de cordes. Donc, notez que ce n'est pas nécessairement une algorithme très efficace pour trouver un mot de passe. Vous pourriez penser qu'il ya ya de meilleures façons. Par exemple, le zyx mot de passe! 32AB n'est probablement pas un mot de passe très commun, alors que le mot de passe est 12345 probablement beaucoup plus commun. Donc, une façon d'essayer de trouver un mot de passe est plus rapide de simplement regarder à des mots de passe qui sont plus fréquentes. Ainsi, par exemple, nous pouvons essayer de lire des mots à partir d'un dictionnaire et d'essayer tous ces mots que nos suppositions de mot de passe. Maintenant, peut-être un mot de passe n'est pas si simple. Peut-être que l'utilisateur était un peu intelligent et essayer ajoutant un numéro la fin d'un mot. Alors peut-être leur mot de passe a été password1. Ainsi, vous pouvez essayer itérer sur tous les mots dans le dictionnaire avec l'un annexée à la fin de celui-ci. Et puis peut-être après avoir fait cela, vous aurez ajouter un deux à la fin de celui-ci. Ou peut-être que l'utilisateur essaie d'être encore plus intelligent, et ils veulent que leur mot de passe pour être "hacker", mais ils sont va remplacer toutes les occurrences d'e de avec trois. Ainsi, vous pouvez le faire aussi. Itérer sur tous les mots dans le dictionnaire mais remplacer des caractères ressembler à des nombres avec ces chiffres. Ainsi de cette façon, vous pourriez attraper encore plus les mots de passe qui sont assez communs. Mais en fin de compte, la seule façon que vous pouvez capturer les mots de passe est de brute forcer itérer sur tous les chaînes possibles. Donc à la fin, vous n'avez pas besoin d'itérer sur toutes les chaînes de caractères d'un personnage à huit caractères, ce qui pourrait prendre un très longtemps, mais vous devez le faire. Mon nom est Rob Bowden. Et c'est Crack.