1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Soy Rob, y vamos a agrietarse. 3 00:00:15,890 --> 00:00:19,390 Así que recuerde de la especificación pset que vamos a necesitar utilizar el 4 00:00:19,390 --> 00:00:20,890 función cripta. 5 00:00:20,890 --> 00:00:26,330 Para la página del manual, tenemos dos hash de definir _xopensource. 6 00:00:26,330 --> 00:00:28,290 No te preocupes por eso tenemos que hacer eso. 7 00:00:28,290 --> 00:00:31,550 Y también incluyen hachís unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Así que una vez que está fuera del camino, vamos a llegar al programa real. 9 00:00:35,920 --> 00:00:39,570 Lo primero que tenemos que hacer es asegurarse de el usuario ha introducido un cifrado válida 10 00:00:39,570 --> 00:00:41,520 contraseña en la línea de comandos. 11 00:00:41,520 --> 00:00:46,050 Recuerde que el programa se supone para ejecutarse como el crack slash dot, y 12 00:00:46,050 --> 00:00:48,120 a continuación, cifrada cadena. 13 00:00:48,120 --> 00:00:52,990 >> Así que aquí estamos vigilando para asegurarse que argc a dos si queremos 14 00:00:52,990 --> 00:00:54,380 continuar con el programa. 15 00:00:54,380 --> 00:00:58,830 Si argc no son dos, eso significa que ya sea el usuario no se ha introducido un cifrado 16 00:00:58,830 --> 00:01:02,560 contraseña en la línea de comandos, o bien entró algo más que el cifrado 17 00:01:02,560 --> 00:01:05,379 contraseña en la línea de comandos, en la que caso no sabemos qué hacer con el 18 00:01:05,379 --> 00:01:07,660 argumentos de la línea de comandos. 19 00:01:07,660 --> 00:01:11,390 >> Así que si argc tenía dos años, podemos continuar. 20 00:01:11,390 --> 00:01:14,160 Y aquí, vamos a declarar una variable codificada. 21 00:01:14,160 --> 00:01:17,650 Eso sólo va a crear un alias en el original argv1 de manera que a través de este 22 00:01:17,650 --> 00:01:20,690 programa, que no tenemos que llamarlo argv1, que luego hay que pensar 23 00:01:20,690 --> 00:01:22,950 acerca de lo que realmente significaba. 24 00:01:22,950 --> 00:01:27,180 >> Así que, finalmente, queremos validar que la contraseña cifrada del usuario 25 00:01:27,180 --> 00:01:30,840 ingresó podría haber sido en realidad una contraseña cifrada. 26 00:01:30,840 --> 00:01:35,120 Por la página del manual de la cripta, la contraseña cifrada debe ser 13 27 00:01:35,120 --> 00:01:36,440 caracteres de longitud. 28 00:01:36,440 --> 00:01:41,500 Aquí arriba, notamos que nos definimos hash cifrar longitud que 13. 29 00:01:41,500 --> 00:01:46,140 Así que estamos asegurando que el Longitud de serie del cifrado 30 00:01:46,140 --> 00:01:49,090 contraseña es 13. 31 00:01:49,090 --> 00:01:52,280 >> Y si no es así, queremos para salir del programa. 32 00:01:52,280 --> 00:01:56,470 Así que una vez que está fuera del camino, podemos ahora en realidad tratar de encontrar lo que el 33 00:01:56,470 --> 00:02:00,410 contraseña que dio el cifrado contraseña era. 34 00:02:00,410 --> 00:02:04,870 Aquí, queremos agarrar la sal a partir de la contraseña encriptada. 35 00:02:04,870 --> 00:02:08,930 Recuerde, por la página de manual, que el los dos primeros caracteres de un cifrado 36 00:02:08,930 --> 00:02:10,590 cuerda, como aquí - 37 00:02:10,590 --> 00:02:12,770 50ZPJ y así sucesivamente - 38 00:02:12,770 --> 00:02:16,170 los dos primeros caracteres dan nosotros la sal que se utilizó 39 00:02:16,170 --> 00:02:18,080 en la función de la cripta. 40 00:02:18,080 --> 00:02:21,740 >> Y aquí, vemos que la sal era ha. 41 00:02:21,740 --> 00:02:27,610 Así que queremos copiar los dos primeros caracteres, longitud sal bienestar de hash 42 00:02:27,610 --> 00:02:30,230 define como dos. 43 00:02:30,230 --> 00:02:35,970 Tenemos que copiar los dos primeros caracteres en esta matriz, la sal. 44 00:02:35,970 --> 00:02:39,340 Nótese que necesitamos longitud sal más uno, ya que todavía tenemos un nulo 45 00:02:39,340 --> 00:02:42,440 terminación al final de nuestra sal. 46 00:02:42,440 --> 00:02:46,940 >> Entonces vamos a declarar esta matriz, invitado, del tamaño de la longitud max plus 47 00:02:46,940 --> 00:02:51,930 uno, donde se define la longitud máxima de hash de hasta ocho años, ya que la contraseña máxima 48 00:02:51,930 --> 00:02:55,090 es de ocho caracteres de longitud. 49 00:02:55,090 --> 00:02:59,860 Y vamos a usar esto para iterar sobre todas las cadenas posibles que podrían 50 00:02:59,860 --> 00:03:01,430 ser contraseñas válidas. 51 00:03:01,430 --> 00:03:07,720 Así que si los caracteres válidos en una contraseña eran simplemente a, b, y c, entonces 52 00:03:07,720 --> 00:03:14,970 podríamos iterar sobre a, b, c, aa, BA, CA, y así sucesivamente, hasta que 53 00:03:14,970 --> 00:03:16,690 vamos a ver cccccccc - 54 00:03:16,690 --> 00:03:19,600 de ocho c. 55 00:03:19,600 --> 00:03:23,620 >> Y si no lo hemos hecho por una válida contraseña, entonces tenemos que decir que el 56 00:03:23,620 --> 00:03:26,590 cadena cifrada no era válida para empezar. 57 00:03:26,590 --> 00:03:29,970 Así que ahora llegamos a esto mientras que 1 de bucle. 58 00:03:29,970 --> 00:03:33,100 Observe que significa que es un bucle infinito. 59 00:03:33,100 --> 00:03:36,430 >> Observe que no hay sentencia break dentro de este bucle infinito. 60 00:03:36,430 --> 00:03:38,570 Hay declaraciones de retorno solamente. 61 00:03:38,570 --> 00:03:41,210 Así que en realidad nunca esperamos para salir del bucle. 62 00:03:41,210 --> 00:03:44,750 Nosotros sólo esperamos para salir del programa. 63 00:03:44,750 --> 00:03:48,220 He añadido esta declaración de impresión a la la parte superior de este bucle de sólo imprimir 64 00:03:48,220 --> 00:03:51,790 lo que nuestra suposición corriente en cuál es la contraseña. 65 00:03:51,790 --> 00:03:53,630 >> Ahora, ¿qué está haciendo este bucle? 66 00:03:53,630 --> 00:03:58,330 Es un bucle sobre todas las cuerdas posibles que podría ser contraseñas válidas. 67 00:03:58,330 --> 00:04:02,700 Lo primero que vamos a hacer es tomar nuestra suposición actual de lo que el 68 00:04:02,700 --> 00:04:03,920 contraseña. 69 00:04:03,920 --> 00:04:07,230 Vamos a tomar la sal que nos agarramos de la cadena cifrada, y estamos 70 00:04:07,230 --> 00:04:09,850 va a cifrar la conjetura. 71 00:04:09,850 --> 00:04:14,760 Esto nos dará una estimación cifrada, que vamos a comparar contra 72 00:04:14,760 --> 00:04:18,810 la cadena cifrada que el usuario ingresó en la línea de comandos. 73 00:04:18,810 --> 00:04:23,030 >> Si son el mismo, en cuyo caso cadena comparable volverá a cero, si 74 00:04:23,030 --> 00:04:28,050 que son las mismas, entonces supongo era el contraseña que ha generado el cifrado 75 00:04:28,050 --> 00:04:33,520 cadena, en cuyo caso podemos imprimir que a medida que nuestra contraseña y retorno. 76 00:04:33,520 --> 00:04:37,520 Pero si ellos no eran los mismos, que significa nuestra suposición era incorrecta. 77 00:04:37,520 --> 00:04:43,250 >> Y queremos reiterar a la siguiente suposición válida. 78 00:04:43,250 --> 00:04:46,410 Así que eso es lo que este tiempo bucle está tratando de hacer. 79 00:04:46,410 --> 00:04:51,760 Se va a repetir nuestra suposición a la siguiente suposición válida. 80 00:04:51,760 --> 00:04:56,080 Tenga en cuenta que cuando decimos que un carácter particular en nuestra conjetura tiene 81 00:04:56,080 --> 00:05:01,770 alcanzado el símbolo máximo, que hasta aquí se define como un hash de tilde, ya que 82 00:05:01,770 --> 00:05:05,710 ese es el personaje más grande valor ASCII que un usuario puede introducir en el 83 00:05:05,710 --> 00:05:11,210 teclado, cuando el personaje alcanza el max símbolo, entonces queremos enviar 84 00:05:11,210 --> 00:05:17,150 de nuevo a el símbolo mínimo, que es un espacio, de nuevo el más bajo ASCII 85 00:05:17,150 --> 00:05:20,800 símbolo de valor que un usuario puede introducir en el teclado. 86 00:05:20,800 --> 00:05:22,940 >> Así que vamos a establecer que para el símbolo mínimo. 87 00:05:22,940 --> 00:05:25,720 Y luego vamos a ir en el siguiente carácter. 88 00:05:25,720 --> 00:05:28,730 Entonces, ¿cómo son nuestras conjeturas va a repetir? 89 00:05:28,730 --> 00:05:33,685 Bueno, si los caracteres válidos son a, b, y c, entonces si empezamos con una, 90 00:05:33,685 --> 00:05:36,630 que va a iterar a b, que va a iterar a c. 91 00:05:36,630 --> 00:05:44,360 c es nuestro símbolo máximo, así que vamos a establecer c de nuevo a una, el símbolo mínimo. 92 00:05:44,360 --> 00:05:48,100 Y luego vamos a iterar índice al siguiente carácter. 93 00:05:48,100 --> 00:05:53,920 >> Así que si la conjetura original c, el siguiente personaje va a ser la nula 94 00:05:53,920 --> 00:05:55,560 terminador. 95 00:05:55,560 --> 00:06:00,670 Aquí abajo, observe que si el personaje que ahora queremos 96 00:06:00,670 --> 00:06:04,690 incremento fue el terminador nulo, entonces vamos a ponerlo a la 97 00:06:04,690 --> 00:06:06,260 símbolo mínimo. 98 00:06:06,260 --> 00:06:11,431 Así que si la suposición era c, entonces nuestro nuevo valor estimado va a ser aa. 99 00:06:11,431 --> 00:06:16,050 Y si nuestra suposición original cccc, entonces nuestra nueva conjetura 100 00:06:16,050 --> 00:06:18,380 va a ser aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Así que cuando llegamos a la cadena máxima de una longitud dada, entonces estamos 102 00:06:24,430 --> 00:06:29,090 va a aplicar a la cadena mínima de la siguiente longitud, que se 103 00:06:29,090 --> 00:06:34,420 apenas ser todos los personajes de el símbolo mínimo. 104 00:06:34,420 --> 00:06:36,970 Ahora, ¿qué está haciendo este cheque aquí? 105 00:06:36,970 --> 00:06:42,780 Bueno, si el índice pasó de la octava carácter a carácter y nueve - 106 00:06:42,780 --> 00:06:46,460 así que agregamos ocho c de como nuestra suposición anterior - 107 00:06:46,460 --> 00:06:51,270 entonces el índice se va a centrar en la última nulo terminador de nuestra conjetura 108 00:06:51,270 --> 00:06:57,990 matriz, que no está destinado a realidad ser utilizado en nuestra contraseña. 109 00:06:57,990 --> 00:07:03,530 >> Así que si nos centramos en ese último nula terminador, entonces no hemos encontrado una 110 00:07:03,530 --> 00:07:07,750 contraseña que sea válida utilizando sólo ocho caracteres, lo que significa que hay no es 111 00:07:07,750 --> 00:07:10,550 contraseña válida que encripta con la cadena dada. 112 00:07:10,550 --> 00:07:13,520 Y tenemos que imprimir eso, diciendo no pudimos encontrar una válida 113 00:07:13,520 --> 00:07:16,100 la contraseña y el retorno. 114 00:07:16,100 --> 00:07:20,280 Así que este bucle while se va a repetir sobre todas las cuerdas posibles. 115 00:07:20,280 --> 00:07:24,640 >> Si encuentra alguno que cifra a la cadena cifrada espera, que va a 116 00:07:24,640 --> 00:07:26,190 devolver esa contraseña. 117 00:07:26,190 --> 00:07:29,610 Y es que no encuentra nada, entonces le proporcione, impresión que 118 00:07:29,610 --> 00:07:31,910 no fue capaz de encontrar nada. 119 00:07:31,910 --> 00:07:39,220 Ahora, observe que la iteración en todos posibles cadenas va probablemente a 120 00:07:39,220 --> 00:07:40,420 tomar un tiempo. 121 00:07:40,420 --> 00:07:43,590 Vamos a ver realmente cómo hace tiempo que toma. 122 00:07:43,590 --> 00:07:47,230 >> Vamos a hacer el crack. 123 00:07:47,230 --> 00:07:51,050 Bueno, perdón - dice indefinido referencia a la cripta. 124 00:07:51,050 --> 00:07:55,330 Así que recuerde, para los conjuntos de p Spec y también la página del manual de la cripta que 125 00:07:55,330 --> 00:07:58,130 la necesidad de vincular en la cripta. 126 00:07:58,130 --> 00:08:01,130 Ahora, el valor predeterminado comando make no sabe que 127 00:08:01,130 --> 00:08:03,010 que desee utilizar esa función. 128 00:08:03,010 --> 00:08:09,680 >> Así que vamos a copiar este comando de cliente y acaba de añadir a la final 129 00:08:09,680 --> 00:08:13,300 de la misma, vinculando cripta. 130 00:08:13,300 --> 00:08:14,820 Ahora, compila. 131 00:08:14,820 --> 00:08:23,880 Así que vamos a correr el crack en un determinado cadena cifrada - 132 00:08:23,880 --> 00:08:25,130 por lo del César. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Así que fue bastante rápido. 135 00:08:30,790 --> 00:08:33,230 >> Observe que esto terminó el 13. 136 00:08:33,230 --> 00:08:38,240 Bueno, contraseña encriptada de César pasa a ser 13. 137 00:08:38,240 --> 00:08:41,650 Así que vamos a intentarlo otra contraseña. 138 00:08:41,650 --> 00:08:45,830 Echemos Hirschhorn de cifrado contraseña, e inténtelo de craqueo eso. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Así notamos que ya hemos llegado tres personajes. 141 00:08:55,110 --> 00:08:58,660 Y estamos interactuando sobre todo posible cuerdas de tres caracteres. 142 00:08:58,660 --> 00:09:01,420 Eso quiere decir que ya hemos terminamos iterar sobre todos los posibles uno y 143 00:09:01,420 --> 00:09:04,660 dos cadenas de caracteres. 144 00:09:04,660 --> 00:09:09,180 Ahora, parece que esto va a tomar un tiempo antes de llegar a la 145 00:09:09,180 --> 00:09:10,580 cuerdas de cuatro caracteres. 146 00:09:10,580 --> 00:09:14,680 Puede ser que tome un par de minutos. 147 00:09:14,680 --> 00:09:16,055 >> No pasó un par de minutos. 148 00:09:16,055 --> 00:09:18,450 Estamos en las cadenas de cuatro caracteres. 149 00:09:18,450 --> 00:09:22,800 Pero ahora, tenemos que iterar sobre todos posibles cadenas de cuatro caracteres, que 150 00:09:22,800 --> 00:09:26,000 lo que puede durar unos 10 minutos. 151 00:09:26,000 --> 00:09:28,720 Y luego, cuando llegamos a cinco caracteres cadenas, necesitamos iterar sobre todos 152 00:09:28,720 --> 00:09:31,450 de ellos, lo que podría tomar un par de horas. 153 00:09:31,450 --> 00:09:34,080 Y tenemos que iterar sobre todos los posibles cuerdas de seis caracteres, que 154 00:09:34,080 --> 00:09:36,560 podría tomar un par de días y así sucesivamente. 155 00:09:36,560 --> 00:09:41,380 >> Por lo que podría tomar un potencialmente muy larga tiempo para iterar sobre todos los posibles 156 00:09:41,380 --> 00:09:44,850 de ocho caracteres y un menor número de cuerdas. 157 00:09:44,850 --> 00:09:50,600 Así cuenta de que esto no es necesariamente una algoritmo muy eficiente para encontrar 158 00:09:50,600 --> 00:09:51,860 una contraseña. 159 00:09:51,860 --> 00:09:54,540 Se podría pensar que hay mejores maneras. 160 00:09:54,540 --> 00:10:02,230 Por ejemplo, el ZYX contraseña! 32AB probablemente no es una contraseña muy común, 161 00:10:02,230 --> 00:10:06,440 mientras que la contraseña es 12345 probablemente mucho más común. 162 00:10:06,440 --> 00:10:13,570 >> Así que una manera de tratar de encontrar una contraseña más rápidamente es sólo mirar 163 00:10:13,570 --> 00:10:15,560 en contraseñas que son más comunes. 164 00:10:15,560 --> 00:10:20,480 Así por ejemplo, podemos tratar de leer palabras de un diccionario y tratar todos 165 00:10:20,480 --> 00:10:24,860 esas palabras como nuestras conjeturas contraseña. 166 00:10:24,860 --> 00:10:29,210 Ahora, tal vez una contraseña No es tan simple. 167 00:10:29,210 --> 00:10:32,600 Tal vez el usuario fue algo inteligente y tratar añadiendo un número al 168 00:10:32,600 --> 00:10:34,220 el final de una palabra. 169 00:10:34,220 --> 00:10:37,000 >> Así que tal vez su contraseña ha sido Contraseña1. 170 00:10:37,000 --> 00:10:41,520 Así que usted puede probar la iteración en todas las palabras en el diccionario con una 171 00:10:41,520 --> 00:10:43,210 adjunta al final de la misma. 172 00:10:43,210 --> 00:10:47,360 Y entonces tal vez después de hacer eso, usted anexar una de dos hasta el final de la misma. 173 00:10:47,360 --> 00:10:50,240 >> O tal vez el usuario está tratando de ser aún más inteligente, y que quieren que su 174 00:10:50,240 --> 00:10:54,980 contraseña que ser "hacker", pero son va a reemplazar todas las instancias de correos de 175 00:10:54,980 --> 00:10:56,600 con tres. 176 00:10:56,600 --> 00:10:58,440 Así que usted puede hacer esto también. 177 00:10:58,440 --> 00:11:02,100 Iterar sobre todas las palabras en el diccionario pero reemplazar caracteres que 178 00:11:02,100 --> 00:11:04,790 parecerse a los números con los números. 179 00:11:04,790 --> 00:11:09,670 >> Así de esta manera, es posible coger aún más contraseñas que son bastante comunes. 180 00:11:09,670 --> 00:11:14,690 Pero al final, la única manera que usted puede coger las contraseñas es bruta 181 00:11:14,690 --> 00:11:17,340 fuerza iterar sobre todos posibles cadenas. 182 00:11:17,340 --> 00:11:22,100 Así que al final, usted tiene que repetir sobre todas las cuerdas de un personaje a 183 00:11:22,100 --> 00:11:28,110 ocho caracteres, que puede tardar mucho tiempo, pero hay que hacerlo. 184 00:11:28,110 --> 00:11:30,024 >> Mi nombre es Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 Y esta es la grieta. 186 00:11:31,425 --> 00:11:36,533