ROB BOWDEN: Eu son Rob, e imos comezar rachando. Entón lembre de que a especificación pset imos ter usar o crypt. Á páxina de inicio, temos dous hash de definir _xopensource. Non se preocupe sobre o por que necesitamos facelo. E tamén haxix inclúen unistd.h. Así, unha vez que está fóra do camiño, imos chegar ao programa real. O primeiro que temos que facer é asegurarse de o usuario inseriu un cifrado válido contrasinal na liña de comandos. Lembre que o programa se quere para ser executado como dot barra de crack, e entón cadea cifrada. Entón, aquí estamos comprobando para asegurarse se que argc a dous, se quere continuar co programa. Se argc non é dous, o que significa calquera o usuario non entrar un cifrado contrasinal na liña de comandos, ou entrou máis que o cifrado contrasinal na liña de ordes, en que se non sabe o que facer co argumentos de liña de comandos. Entón, se argc tiña dous anos, podemos continuar. E aquí, nós imos declarar unha variable cifrada. Isto só vai alias orixinais argv1 de xeito que ao longo desta programa, non debemos chamalo argv1, que, entón, ten que pensar sobre o que iso realmente significa. Entón, finalmente, queremos validar que o contrasinal cifrada do usuario entrou podería ser realmente un contrasinal cifrada. Por páxina man do cripta, a contrasinal cifrada debe ser 13 caracteres. Ata aquí, entender que Hash definido cifrar lonxitude 13. Entón, nós estamos só asegurarse de que o lonxitude da corda do cifrado contrasinal é 13. E se non é, queremos para saír do programa. Así, unha vez que está fóra de forma, podemos agora realmente tentar atopar o que o contrasinal que deu o cifrado contrasinal era. Aquí, queremos coller o sal contrasinal cifrada. Lembre-se de acordo coa páxina do home, que o os dous primeiros caracteres dun cifrado cadea, como aquí - 50ZPJ e así por diante - os dous primeiros caracteres dar nós o sal que se utilizou en función da cripta. E aquí vemos que o sal era ha. Entón, nós queremos copiar os dous primeiros caracteres, a lonxitude sal ser haxix definida como dous. Temos que copiar os dous primeiros caracteres nesa matriz, sal. Teña en conta que necesitamos lonxitude sal máis un, xa que aínda precisa dun nulo terminator ao final do noso sal. Entón imos declarar esa matriz, convidado, de gran dimensión max máis un, onde a lonxitude máxima é de hash definido como oito, xa que o máximo de contrasinal é de oito caracteres. E nós imos usar isto para repetir sobre as cordas posibles que poderían ser claves válidas. Entón, se os caracteres válidos nun contrasinal foron só a, b, c, entón queremos iterado a, b, c, aa, ba, ca, e así por diante, ata temos que ver cccccccc - oito c do. E se non temos por un válido contrasinal, entón debemos dicir que o cadea cifrada non era válido para comezar. Entón, agora, chegamos a este mentres un loop. Teña en conta que significa que é un loop infinito. Teña en conta que non hai instrución break dentro deste loop infinito. Hai só volver declaracións. Entón, nós nunca realmente esperar para saír do loop. Nós só esperar para saír do programa. Eu engade esta declaración de impresión para a Ademais loop para só imprimir que a nosa suposición corrente no cal é o contrasinal. Agora, o que é este ciclo facendo? É un loop sobre as cordas posibles que podería ser claves válidas. O primeiro que imos facer é tomar o noso palpite actual ao que o contrasinal. Imos levar o sal que nos agarramos desde a cadea cifrada, e estamos indo para cifrar o palpite. Isto daranos un palpite criptografía, que nós estamos indo a comparación a cadea cifrada que o usuario entrou na liña de comandos. Se son idénticos, caso en que corda comparable volverá cero, se son o mesmo, entón creo que foi o contrasinal que xerou o cifrado cadea, caso en que pode imprimir que, como o seu contrasinal e retorno. Pero se eles non eran os mesmos, que significa que o noso palpite estaba incorrecta. E nós queremos repetir a a seguinte suposición válida. Entón, iso é o que este tempo loop está intentando facer. Vai repetir o noso palpite á seguinte suposición válida. Teña en conta que cando dicimos que un carácter particular, na nosa suposición ten alcanzaron o símbolo máximo, que aquí defínese como unha mestura til, pois que é o maior personaxe valor ASCII que un usuario pode entrar no teclado, cando o personaxe alcanzar a max símbolo, así que queremos enviar ao seu símbolo mínimo, que é un espazo, unha vez máis o menor ASCII símbolo de valor que un usuario pode escribe no teclado. Entón, nós estamos indo a definir que símbolo mínimo. E entón nós estamos indo a ir ao seguinte carácter. Entón, como están os nosos historiadores vai repetir? Agora ben, se os caracteres válidos son a, b, e c, entón, se iniciou coa, vai repetir ab, que vai iteración para c. c é o noso símbolo máximo, entón imos establecer c volta a un, símbolo mínimo. E entón nós imos repetir índice ao seguinte carácter. Entón, se a estimación inicial foi c, o seguinte personaxe será o nulo Terminator. Aquí abaixo, teña en conta que se o personaxe que queremos agora incremento é o terminador nulo, entón imos configuralo para o símbolo mínimo. Polo tanto, se o palpite era c, entón a nosa novo palpite será aa. E se a nosa suposición orixinal cccc, entón o noso novo palpite será AAAAA. Así, sempre que chegamos a corda máxima dunha determinada lonxitude, entón estamos vai aplicar para a secuencia mínima da lonxitude seguinte, que pode pode ter todos os personaxes de símbolo mínimo. Agora, o que é esa verificación está facendo aquí? Ben, se o índice pasou de oitavo carácter ao carácter nove - entón engadimos oito c de como o noso anterior creo - a continuación, o contido vai concentrarse na última terminador nulo do noso palpite matriz, que non se destina a efectivamente pode usar no noso contrasinal. Entón, se estamos enfocados nesa última nulo terminator, entón nós non atopamos unha contrasinal que é válido utilizar só oito caracteres, o que significa que non hai contrasinal válida que criptografía a cadea dada. E nós temos que imprimir iso, dicindo que non conseguimos atopar un válido contrasinal, e retorno. Polo tanto, este loop while vai repetir sobre as cordas posibles. Se atopa calquera que criptografía a cadea cifrada esperar, que vai devolver o contrasinal. E non atopar nada, entón el pode voltar, a impresión que non foi capaz de atopar calquera cousa. Agora, teña en conta que a iteración sobre todos posibles secuencias probablemente vai tardar un pouco. Imos realmente ver como tempo que leva. Imos facer o crack. Ben, oops - di indefinido referencia a cripta. Entón lembre, ao p define especificación e a páxina de manual a cripta que necesidade de conectar na cripta. Agora, o patrón comando make non sabe que quero usar esta función. Entón, imos copiar esta orde cliente e só engadir ata o final do mesmo, conectando cripta. Agora, compila. Entón imos correr de crack nun determinado cadea cifrada - a César. Así, foi moi rápido. Nótese que esta terminou en 13. Ben, contrasinal cifrada de César pasa a ser 13. Entón, imos tratar con outro contrasinal. Imos dar cifrado de Hirschhorn contrasinal e tentar romper iso. Entón, teña en conta que xa chegou tres personaxes. E nós estamos interactuar sobre as posibles secuencias de tres caracteres. Isto significa que xa rematar iteración sobre todo un posible e dúas cadeas de caracteres. Agora, parece que isto vai tomar algún tempo antes de chegar ao secuencias de catro caracteres. Pode levar un par de minutos. Non pasou un par de minutos. Estamos nas cordas de catro caracteres. Pero agora, necesitamos iterado sobre todos posibles secuencias de caracteres de catro, que que pode levar quizais 10 minutos. E entón, cando chegamos a cinco carácter cordas, necesitamos iterado sobre todos dos, o que pode levar unhas horas. E necesitamos iterado sobre as posibles seis caracteres cordas, que Pode tardar varios días e así por diante. Así, podería ter un potencial moi longo tempo para repetir as posibles oito caracteres e menos cordas. Entón, entende que iso non é necesariamente unha algoritmo moi eficiente para atopar un contrasinal. Podes pensar que non son as mellores formas. Por exemplo, o contrasinal ZYX! 32ab probablemente non é un contrasinal moi común, mentres que o contrasinal é 12345 Probablemente moito máis comúns. Polo tanto, unha forma de tentar atopar un contrasinal máis rápido é só ollar en contrasinais que son máis comúns. Así, por exemplo, podemos tratar de ler as palabras dun dicionario e tratar todo esas palabras como os nosos historiadores contrasinal. Agora, quizais un contrasinal non é tan sinxelo. Talvez o usuario foi un pouco intelixente e probe engadir un número para ao final dunha palabra. Entón, talvez o seu contrasinal foi password1. Entón podes probar iteración sobre as palabras no dicionario cun anexada ao final da mesma. E entón, quizais, despois de facelo, vai achegar a dous para o fin de todo. Ou que o usuario está a tentar ser aínda máis intelixente, e queren que os seus contrasinal para ser "hacker", pero son vai substituír todas as instancias e de con tres. Entón, podería facelo tamén. Iterado sobre as palabras no dicionario pero substituír caracteres que parecen números con estes números. Así, deste xeito, pode incorporarse aínda máis contrasinais que son moi comúns. Pero ao final, o único xeito que pode capturar todos os contrasinais é bruta forzar iterado sobre todos secuencias de caracteres posibles. Entón, ao final, ten que repetir sobre as cordas dun personaxe para oito caracteres, o que pode levar a moito tempo, pero ten que facelo. O meu nome é Rob Bowden. E este é o crack.