ROB BOWDEN: Soy Rob, y vamos a agrietarse. Así que recuerde de la especificación pset que vamos a necesitar utilizar el función cripta. Para la página del manual, tenemos dos hash de definir _xopensource. No te preocupes por eso tenemos que hacer eso. Y también incluyen hachís unistd.h. Así que una vez que está fuera del camino, vamos a llegar al programa real. Lo primero que tenemos que hacer es asegurarse de el usuario ha introducido un cifrado válida contraseña en la línea de comandos. Recuerde que el programa se supone para ejecutarse como el crack slash dot, y a continuación, cifrada cadena. Así que aquí estamos vigilando para asegurarse que argc a dos si queremos continuar con el programa. Si argc no son dos, eso significa que ya sea el usuario no se ha introducido un cifrado contraseña en la línea de comandos, o bien entró algo más que el cifrado contraseña en la línea de comandos, en la que caso no sabemos qué hacer con el argumentos de la línea de comandos. Así que si argc tenía dos años, podemos continuar. Y aquí, vamos a declarar una variable codificada. Eso sólo va a crear un alias en el original argv1 de manera que a través de este programa, que no tenemos que llamarlo argv1, que luego hay que pensar acerca de lo que realmente significaba. Así que, finalmente, queremos validar que la contraseña cifrada del usuario ingresó podría haber sido en realidad una contraseña cifrada. Por la página del manual de la cripta, la contraseña cifrada debe ser 13 caracteres de longitud. Aquí arriba, notamos que nos definimos hash cifrar longitud que 13. Así que estamos asegurando que el Longitud de serie del cifrado contraseña es 13. Y si no es así, queremos para salir del programa. Así que una vez que está fuera del camino, podemos ahora en realidad tratar de encontrar lo que el contraseña que dio el cifrado contraseña era. Aquí, queremos agarrar la sal a partir de la contraseña encriptada. Recuerde, por la página de manual, que el los dos primeros caracteres de un cifrado cuerda, como aquí - 50ZPJ y así sucesivamente - los dos primeros caracteres dan nosotros la sal que se utilizó en la función de la cripta. Y aquí, vemos que la sal era ha. Así que queremos copiar los dos primeros caracteres, longitud sal bienestar de hash define como dos. Tenemos que copiar los dos primeros caracteres en esta matriz, la sal. Nótese que necesitamos longitud sal más uno, ya que todavía tenemos un nulo terminación al final de nuestra sal. Entonces vamos a declarar esta matriz, invitado, del tamaño de la longitud max plus uno, donde se define la longitud máxima de hash de hasta ocho años, ya que la contraseña máxima es de ocho caracteres de longitud. Y vamos a usar esto para iterar sobre todas las cadenas posibles que podrían ser contraseñas válidas. Así que si los caracteres válidos en una contraseña eran simplemente a, b, y c, entonces podríamos iterar sobre a, b, c, aa, BA, CA, y así sucesivamente, hasta que vamos a ver cccccccc - de ocho c. Y si no lo hemos hecho por una válida contraseña, entonces tenemos que decir que el cadena cifrada no era válida para empezar. Así que ahora llegamos a esto mientras que 1 de bucle. Observe que significa que es un bucle infinito. Observe que no hay sentencia break dentro de este bucle infinito. Hay declaraciones de retorno solamente. Así que en realidad nunca esperamos para salir del bucle. Nosotros sólo esperamos para salir del programa. He añadido esta declaración de impresión a la la parte superior de este bucle de sólo imprimir lo que nuestra suposición corriente en cuál es la contraseña. Ahora, ¿qué está haciendo este bucle? Es un bucle sobre todas las cuerdas posibles que podría ser contraseñas válidas. Lo primero que vamos a hacer es tomar nuestra suposición actual de lo que el contraseña. Vamos a tomar la sal que nos agarramos de la cadena cifrada, y estamos va a cifrar la conjetura. Esto nos dará una estimación cifrada, que vamos a comparar contra la cadena cifrada que el usuario ingresó en la línea de comandos. Si son el mismo, en cuyo caso cadena comparable volverá a cero, si que son las mismas, entonces supongo era el contraseña que ha generado el cifrado cadena, en cuyo caso podemos imprimir que a medida que nuestra contraseña y retorno. Pero si ellos no eran los mismos, que significa nuestra suposición era incorrecta. Y queremos reiterar a la siguiente suposición válida. Así que eso es lo que este tiempo bucle está tratando de hacer. Se va a repetir nuestra suposición a la siguiente suposición válida. Tenga en cuenta que cuando decimos que un carácter particular en nuestra conjetura tiene alcanzado el símbolo máximo, que hasta aquí se define como un hash de tilde, ya que ese es el personaje más grande valor ASCII que un usuario puede introducir en el teclado, cuando el personaje alcanza el max símbolo, entonces queremos enviar de nuevo a el símbolo mínimo, que es un espacio, de nuevo el más bajo ASCII símbolo de valor que un usuario puede introducir en el teclado. Así que vamos a establecer que para el símbolo mínimo. Y luego vamos a ir en el siguiente carácter. Entonces, ¿cómo son nuestras conjeturas va a repetir? Bueno, si los caracteres válidos son a, b, y c, entonces si empezamos con una, que va a iterar a b, que va a iterar a c. c es nuestro símbolo máximo, así que vamos a establecer c de nuevo a una, el símbolo mínimo. Y luego vamos a iterar índice al siguiente carácter. Así que si la conjetura original c, el siguiente personaje va a ser la nula terminador. Aquí abajo, observe que si el personaje que ahora queremos incremento fue el terminador nulo, entonces vamos a ponerlo a la símbolo mínimo. Así que si la suposición era c, entonces nuestro nuevo valor estimado va a ser aa. Y si nuestra suposición original cccc, entonces nuestra nueva conjetura va a ser aaaaa. Así que cuando llegamos a la cadena máxima de una longitud dada, entonces estamos va a aplicar a la cadena mínima de la siguiente longitud, que se apenas ser todos los personajes de el símbolo mínimo. Ahora, ¿qué está haciendo este cheque aquí? Bueno, si el índice pasó de la octava carácter a carácter y nueve - así que agregamos ocho c de como nuestra suposición anterior - entonces el índice se va a centrar en la última nulo terminador de nuestra conjetura matriz, que no está destinado a realidad ser utilizado en nuestra contraseña. Así que si nos centramos en ese último nula terminador, entonces no hemos encontrado una contraseña que sea válida utilizando sólo ocho caracteres, lo que significa que hay no es contraseña válida que encripta con la cadena dada. Y tenemos que imprimir eso, diciendo no pudimos encontrar una válida la contraseña y el retorno. Así que este bucle while se va a repetir sobre todas las cuerdas posibles. Si encuentra alguno que cifra a la cadena cifrada espera, que va a devolver esa contraseña. Y es que no encuentra nada, entonces le proporcione, impresión que no fue capaz de encontrar nada. Ahora, observe que la iteración en todos posibles cadenas va probablemente a tomar un tiempo. Vamos a ver realmente cómo hace tiempo que toma. Vamos a hacer el crack. Bueno, perdón - dice indefinido referencia a la cripta. Así que recuerde, para los conjuntos de p Spec y también la página del manual de la cripta que la necesidad de vincular en la cripta. Ahora, el valor predeterminado comando make no sabe que que desee utilizar esa función. Así que vamos a copiar este comando de cliente y acaba de añadir a la final de la misma, vinculando cripta. Ahora, compila. Así que vamos a correr el crack en un determinado cadena cifrada - por lo del César. Así que fue bastante rápido. Observe que esto terminó el 13. Bueno, contraseña encriptada de César pasa a ser 13. Así que vamos a intentarlo otra contraseña. Echemos Hirschhorn de cifrado contraseña, e inténtelo de craqueo eso. Así notamos que ya hemos llegado tres personajes. Y estamos interactuando sobre todo posible cuerdas de tres caracteres. Eso quiere decir que ya hemos terminamos iterar sobre todos los posibles uno y dos cadenas de caracteres. Ahora, parece que esto va a tomar un tiempo antes de llegar a la cuerdas de cuatro caracteres. Puede ser que tome un par de minutos. No pasó un par de minutos. Estamos en las cadenas de cuatro caracteres. Pero ahora, tenemos que iterar sobre todos posibles cadenas de cuatro caracteres, que lo que puede durar unos 10 minutos. Y luego, cuando llegamos a cinco caracteres cadenas, necesitamos iterar sobre todos de ellos, lo que podría tomar un par de horas. Y tenemos que iterar sobre todos los posibles cuerdas de seis caracteres, que podría tomar un par de días y así sucesivamente. Por lo que podría tomar un potencialmente muy larga tiempo para iterar sobre todos los posibles de ocho caracteres y un menor número de cuerdas. Así cuenta de que esto no es necesariamente una algoritmo muy eficiente para encontrar una contraseña. Se podría pensar que hay mejores maneras. Por ejemplo, el ZYX contraseña! 32AB probablemente no es una contraseña muy común, mientras que la contraseña es 12345 probablemente mucho más común. Así que una manera de tratar de encontrar una contraseña más rápidamente es sólo mirar en contraseñas que son más comunes. Así por ejemplo, podemos tratar de leer palabras de un diccionario y tratar todos esas palabras como nuestras conjeturas contraseña. Ahora, tal vez una contraseña No es tan simple. Tal vez el usuario fue algo inteligente y tratar añadiendo un número al el final de una palabra. Así que tal vez su contraseña ha sido Contraseña1. Así que usted puede probar la iteración en todas las palabras en el diccionario con una adjunta al final de la misma. Y entonces tal vez después de hacer eso, usted anexar una de dos hasta el final de la misma. O tal vez el usuario está tratando de ser aún más inteligente, y que quieren que su contraseña que ser "hacker", pero son va a reemplazar todas las instancias de correos de con tres. Así que usted puede hacer esto también. Iterar sobre todas las palabras en el diccionario pero reemplazar caracteres que parecerse a los números con los números. Así de esta manera, es posible coger aún más contraseñas que son bastante comunes. Pero al final, la única manera que usted puede coger las contraseñas es bruta fuerza iterar sobre todos posibles cadenas. Así que al final, usted tiene que repetir sobre todas las cuerdas de un personaje a ocho caracteres, que puede tardar mucho tiempo, pero hay que hacerlo. Mi nombre es Rob Bowden. Y esta es la grieta.