1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Eu son Rob, e imos comezar rachando. 3 00:00:15,890 --> 00:00:19,390 Entón lembre de que a especificación pset imos ter usar o 4 00:00:19,390 --> 00:00:20,890 crypt. 5 00:00:20,890 --> 00:00:26,330 Á páxina de inicio, temos dous hash de definir _xopensource. 6 00:00:26,330 --> 00:00:28,290 Non se preocupe sobre o por que necesitamos facelo. 7 00:00:28,290 --> 00:00:31,550 E tamén haxix inclúen unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Así, unha vez que está fóra do camiño, imos chegar ao programa real. 9 00:00:35,920 --> 00:00:39,570 O primeiro que temos que facer é asegurarse de o usuario inseriu un cifrado válido 10 00:00:39,570 --> 00:00:41,520 contrasinal na liña de comandos. 11 00:00:41,520 --> 00:00:46,050 Lembre que o programa se quere para ser executado como dot barra de crack, e 12 00:00:46,050 --> 00:00:48,120 entón cadea cifrada. 13 00:00:48,120 --> 00:00:52,990 >> Entón, aquí estamos comprobando para asegurarse se que argc a dous, se quere 14 00:00:52,990 --> 00:00:54,380 continuar co programa. 15 00:00:54,380 --> 00:00:58,830 Se argc non é dous, o que significa calquera o usuario non entrar un cifrado 16 00:00:58,830 --> 00:01:02,560 contrasinal na liña de comandos, ou entrou máis que o cifrado 17 00:01:02,560 --> 00:01:05,379 contrasinal na liña de ordes, en que se non sabe o que facer co 18 00:01:05,379 --> 00:01:07,660 argumentos de liña de comandos. 19 00:01:07,660 --> 00:01:11,390 >> Entón, se argc tiña dous anos, podemos continuar. 20 00:01:11,390 --> 00:01:14,160 E aquí, nós imos declarar unha variable cifrada. 21 00:01:14,160 --> 00:01:17,650 Isto só vai alias orixinais argv1 de xeito que ao longo desta 22 00:01:17,650 --> 00:01:20,690 programa, non debemos chamalo argv1, que, entón, ten que pensar 23 00:01:20,690 --> 00:01:22,950 sobre o que iso realmente significa. 24 00:01:22,950 --> 00:01:27,180 >> Entón, finalmente, queremos validar que o contrasinal cifrada do usuario 25 00:01:27,180 --> 00:01:30,840 entrou podería ser realmente un contrasinal cifrada. 26 00:01:30,840 --> 00:01:35,120 Por páxina man do cripta, a contrasinal cifrada debe ser 13 27 00:01:35,120 --> 00:01:36,440 caracteres. 28 00:01:36,440 --> 00:01:41,500 Ata aquí, entender que Hash definido cifrar lonxitude 13. 29 00:01:41,500 --> 00:01:46,140 Entón, nós estamos só asegurarse de que o lonxitude da corda do cifrado 30 00:01:46,140 --> 00:01:49,090 contrasinal é 13. 31 00:01:49,090 --> 00:01:52,280 >> E se non é, queremos para saír do programa. 32 00:01:52,280 --> 00:01:56,470 Así, unha vez que está fóra de forma, podemos agora realmente tentar atopar o que o 33 00:01:56,470 --> 00:02:00,410 contrasinal que deu o cifrado contrasinal era. 34 00:02:00,410 --> 00:02:04,870 Aquí, queremos coller o sal contrasinal cifrada. 35 00:02:04,870 --> 00:02:08,930 Lembre-se de acordo coa páxina do home, que o os dous primeiros caracteres dun cifrado 36 00:02:08,930 --> 00:02:10,590 cadea, como aquí - 37 00:02:10,590 --> 00:02:12,770 50ZPJ e así por diante - 38 00:02:12,770 --> 00:02:16,170 os dous primeiros caracteres dar nós o sal que se utilizou 39 00:02:16,170 --> 00:02:18,080 en función da cripta. 40 00:02:18,080 --> 00:02:21,740 >> E aquí vemos que o sal era ha. 41 00:02:21,740 --> 00:02:27,610 Entón, nós queremos copiar os dous primeiros caracteres, a lonxitude sal ser haxix 42 00:02:27,610 --> 00:02:30,230 definida como dous. 43 00:02:30,230 --> 00:02:35,970 Temos que copiar os dous primeiros caracteres nesa matriz, sal. 44 00:02:35,970 --> 00:02:39,340 Teña en conta que necesitamos lonxitude sal máis un, xa que aínda precisa dun nulo 45 00:02:39,340 --> 00:02:42,440 terminator ao final do noso sal. 46 00:02:42,440 --> 00:02:46,940 >> Entón imos declarar esa matriz, convidado, de gran dimensión max máis 47 00:02:46,940 --> 00:02:51,930 un, onde a lonxitude máxima é de hash definido como oito, xa que o máximo de contrasinal 48 00:02:51,930 --> 00:02:55,090 é de oito caracteres. 49 00:02:55,090 --> 00:02:59,860 E nós imos usar isto para repetir sobre as cordas posibles que poderían 50 00:02:59,860 --> 00:03:01,430 ser claves válidas. 51 00:03:01,430 --> 00:03:07,720 Entón, se os caracteres válidos nun contrasinal foron só a, b, c, entón 52 00:03:07,720 --> 00:03:14,970 queremos iterado a, b, c, aa, ba, ca, e así por diante, ata 53 00:03:14,970 --> 00:03:16,690 temos que ver cccccccc - 54 00:03:16,690 --> 00:03:19,600 oito c do. 55 00:03:19,600 --> 00:03:23,620 >> E se non temos por un válido contrasinal, entón debemos dicir que o 56 00:03:23,620 --> 00:03:26,590 cadea cifrada non era válido para comezar. 57 00:03:26,590 --> 00:03:29,970 Entón, agora, chegamos a este mentres un loop. 58 00:03:29,970 --> 00:03:33,100 Teña en conta que significa que é un loop infinito. 59 00:03:33,100 --> 00:03:36,430 >> Teña en conta que non hai instrución break dentro deste loop infinito. 60 00:03:36,430 --> 00:03:38,570 Hai só volver declaracións. 61 00:03:38,570 --> 00:03:41,210 Entón, nós nunca realmente esperar para saír do loop. 62 00:03:41,210 --> 00:03:44,750 Nós só esperar para saír do programa. 63 00:03:44,750 --> 00:03:48,220 Eu engade esta declaración de impresión para a Ademais loop para só imprimir 64 00:03:48,220 --> 00:03:51,790 que a nosa suposición corrente no cal é o contrasinal. 65 00:03:51,790 --> 00:03:53,630 >> Agora, o que é este ciclo facendo? 66 00:03:53,630 --> 00:03:58,330 É un loop sobre as cordas posibles que podería ser claves válidas. 67 00:03:58,330 --> 00:04:02,700 O primeiro que imos facer é tomar o noso palpite actual ao que o 68 00:04:02,700 --> 00:04:03,920 contrasinal. 69 00:04:03,920 --> 00:04:07,230 Imos levar o sal que nos agarramos desde a cadea cifrada, e estamos 70 00:04:07,230 --> 00:04:09,850 indo para cifrar o palpite. 71 00:04:09,850 --> 00:04:14,760 Isto daranos un palpite criptografía, que nós estamos indo a comparación 72 00:04:14,760 --> 00:04:18,810 a cadea cifrada que o usuario entrou na liña de comandos. 73 00:04:18,810 --> 00:04:23,030 >> Se son idénticos, caso en que corda comparable volverá cero, se 74 00:04:23,030 --> 00:04:28,050 son o mesmo, entón creo que foi o contrasinal que xerou o cifrado 75 00:04:28,050 --> 00:04:33,520 cadea, caso en que pode imprimir que, como o seu contrasinal e retorno. 76 00:04:33,520 --> 00:04:37,520 Pero se eles non eran os mesmos, que significa que o noso palpite estaba incorrecta. 77 00:04:37,520 --> 00:04:43,250 >> E nós queremos repetir a a seguinte suposición válida. 78 00:04:43,250 --> 00:04:46,410 Entón, iso é o que este tempo loop está intentando facer. 79 00:04:46,410 --> 00:04:51,760 Vai repetir o noso palpite á seguinte suposición válida. 80 00:04:51,760 --> 00:04:56,080 Teña en conta que cando dicimos que un carácter particular, na nosa suposición ten 81 00:04:56,080 --> 00:05:01,770 alcanzaron o símbolo máximo, que aquí defínese como unha mestura til, pois 82 00:05:01,770 --> 00:05:05,710 que é o maior personaxe valor ASCII que un usuario pode entrar no 83 00:05:05,710 --> 00:05:11,210 teclado, cando o personaxe alcanzar a max símbolo, así que queremos enviar 84 00:05:11,210 --> 00:05:17,150 ao seu símbolo mínimo, que é un espazo, unha vez máis o menor ASCII 85 00:05:17,150 --> 00:05:20,800 símbolo de valor que un usuario pode escribe no teclado. 86 00:05:20,800 --> 00:05:22,940 >> Entón, nós estamos indo a definir que símbolo mínimo. 87 00:05:22,940 --> 00:05:25,720 E entón nós estamos indo a ir ao seguinte carácter. 88 00:05:25,720 --> 00:05:28,730 Entón, como están os nosos historiadores vai repetir? 89 00:05:28,730 --> 00:05:33,685 Agora ben, se os caracteres válidos son a, b, e c, entón, se iniciou coa, 90 00:05:33,685 --> 00:05:36,630 vai repetir ab, que vai iteración para c. 91 00:05:36,630 --> 00:05:44,360 c é o noso símbolo máximo, entón imos establecer c volta a un, símbolo mínimo. 92 00:05:44,360 --> 00:05:48,100 E entón nós imos repetir índice ao seguinte carácter. 93 00:05:48,100 --> 00:05:53,920 >> Entón, se a estimación inicial foi c, o seguinte personaxe será o nulo 94 00:05:53,920 --> 00:05:55,560 Terminator. 95 00:05:55,560 --> 00:06:00,670 Aquí abaixo, teña en conta que se o personaxe que queremos agora 96 00:06:00,670 --> 00:06:04,690 incremento é o terminador nulo, entón imos configuralo para o 97 00:06:04,690 --> 00:06:06,260 símbolo mínimo. 98 00:06:06,260 --> 00:06:11,431 Polo tanto, se o palpite era c, entón a nosa novo palpite será aa. 99 00:06:11,431 --> 00:06:16,050 E se a nosa suposición orixinal cccc, entón o noso novo palpite 100 00:06:16,050 --> 00:06:18,380 será AAAAA. 101 00:06:18,380 --> 00:06:24,430 >> Así, sempre que chegamos a corda máxima dunha determinada lonxitude, entón estamos 102 00:06:24,430 --> 00:06:29,090 vai aplicar para a secuencia mínima da lonxitude seguinte, que pode 103 00:06:29,090 --> 00:06:34,420 pode ter todos os personaxes de símbolo mínimo. 104 00:06:34,420 --> 00:06:36,970 Agora, o que é esa verificación está facendo aquí? 105 00:06:36,970 --> 00:06:42,780 Ben, se o índice pasou de oitavo carácter ao carácter nove - 106 00:06:42,780 --> 00:06:46,460 entón engadimos oito c de como o noso anterior creo - 107 00:06:46,460 --> 00:06:51,270 a continuación, o contido vai concentrarse na última terminador nulo do noso palpite 108 00:06:51,270 --> 00:06:57,990 matriz, que non se destina a efectivamente pode usar no noso contrasinal. 109 00:06:57,990 --> 00:07:03,530 >> Entón, se estamos enfocados nesa última nulo terminator, entón nós non atopamos unha 110 00:07:03,530 --> 00:07:07,750 contrasinal que é válido utilizar só oito caracteres, o que significa que non hai 111 00:07:07,750 --> 00:07:10,550 contrasinal válida que criptografía a cadea dada. 112 00:07:10,550 --> 00:07:13,520 E nós temos que imprimir iso, dicindo que non conseguimos atopar un válido 113 00:07:13,520 --> 00:07:16,100 contrasinal, e retorno. 114 00:07:16,100 --> 00:07:20,280 Polo tanto, este loop while vai repetir sobre as cordas posibles. 115 00:07:20,280 --> 00:07:24,640 >> Se atopa calquera que criptografía a cadea cifrada esperar, que vai 116 00:07:24,640 --> 00:07:26,190 devolver o contrasinal. 117 00:07:26,190 --> 00:07:29,610 E non atopar nada, entón el pode voltar, a impresión que 118 00:07:29,610 --> 00:07:31,910 non foi capaz de atopar calquera cousa. 119 00:07:31,910 --> 00:07:39,220 Agora, teña en conta que a iteración sobre todos posibles secuencias probablemente vai 120 00:07:39,220 --> 00:07:40,420 tardar un pouco. 121 00:07:40,420 --> 00:07:43,590 Imos realmente ver como tempo que leva. 122 00:07:43,590 --> 00:07:47,230 >> Imos facer o crack. 123 00:07:47,230 --> 00:07:51,050 Ben, oops - di indefinido referencia a cripta. 124 00:07:51,050 --> 00:07:55,330 Entón lembre, ao p define especificación e a páxina de manual a cripta que 125 00:07:55,330 --> 00:07:58,130 necesidade de conectar na cripta. 126 00:07:58,130 --> 00:08:01,130 Agora, o patrón comando make non sabe que 127 00:08:01,130 --> 00:08:03,010 quero usar esta función. 128 00:08:03,010 --> 00:08:09,680 >> Entón, imos copiar esta orde cliente e só engadir ata o final 129 00:08:09,680 --> 00:08:13,300 do mesmo, conectando cripta. 130 00:08:13,300 --> 00:08:14,820 Agora, compila. 131 00:08:14,820 --> 00:08:23,880 Entón imos correr de crack nun determinado cadea cifrada - 132 00:08:23,880 --> 00:08:25,130 a César. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Así, foi moi rápido. 135 00:08:30,790 --> 00:08:33,230 >> Nótese que esta terminou en 13. 136 00:08:33,230 --> 00:08:38,240 Ben, contrasinal cifrada de César pasa a ser 13. 137 00:08:38,240 --> 00:08:41,650 Entón, imos tratar con outro contrasinal. 138 00:08:41,650 --> 00:08:45,830 Imos dar cifrado de Hirschhorn contrasinal e tentar romper iso. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Entón, teña en conta que xa chegou tres personaxes. 141 00:08:55,110 --> 00:08:58,660 E nós estamos interactuar sobre as posibles secuencias de tres caracteres. 142 00:08:58,660 --> 00:09:01,420 Isto significa que xa rematar iteración sobre todo un posible e 143 00:09:01,420 --> 00:09:04,660 dúas cadeas de caracteres. 144 00:09:04,660 --> 00:09:09,180 Agora, parece que isto vai tomar algún tempo antes de chegar ao 145 00:09:09,180 --> 00:09:10,580 secuencias de catro caracteres. 146 00:09:10,580 --> 00:09:14,680 Pode levar un par de minutos. 147 00:09:14,680 --> 00:09:16,055 >> Non pasou un par de minutos. 148 00:09:16,055 --> 00:09:18,450 Estamos nas cordas de catro caracteres. 149 00:09:18,450 --> 00:09:22,800 Pero agora, necesitamos iterado sobre todos posibles secuencias de caracteres de catro, que 150 00:09:22,800 --> 00:09:26,000 que pode levar quizais 10 minutos. 151 00:09:26,000 --> 00:09:28,720 E entón, cando chegamos a cinco carácter cordas, necesitamos iterado sobre todos 152 00:09:28,720 --> 00:09:31,450 dos, o que pode levar unhas horas. 153 00:09:31,450 --> 00:09:34,080 E necesitamos iterado sobre as posibles seis caracteres cordas, que 154 00:09:34,080 --> 00:09:36,560 Pode tardar varios días e así por diante. 155 00:09:36,560 --> 00:09:41,380 >> Así, podería ter un potencial moi longo tempo para repetir as posibles 156 00:09:41,380 --> 00:09:44,850 oito caracteres e menos cordas. 157 00:09:44,850 --> 00:09:50,600 Entón, entende que iso non é necesariamente unha algoritmo moi eficiente para atopar 158 00:09:50,600 --> 00:09:51,860 un contrasinal. 159 00:09:51,860 --> 00:09:54,540 Podes pensar que non son as mellores formas. 160 00:09:54,540 --> 00:10:02,230 Por exemplo, o contrasinal ZYX! 32ab probablemente non é un contrasinal moi común, 161 00:10:02,230 --> 00:10:06,440 mentres que o contrasinal é 12345 Probablemente moito máis comúns. 162 00:10:06,440 --> 00:10:13,570 >> Polo tanto, unha forma de tentar atopar un contrasinal máis rápido é só ollar 163 00:10:13,570 --> 00:10:15,560 en contrasinais que son máis comúns. 164 00:10:15,560 --> 00:10:20,480 Así, por exemplo, podemos tratar de ler as palabras dun dicionario e tratar todo 165 00:10:20,480 --> 00:10:24,860 esas palabras como os nosos historiadores contrasinal. 166 00:10:24,860 --> 00:10:29,210 Agora, quizais un contrasinal non é tan sinxelo. 167 00:10:29,210 --> 00:10:32,600 Talvez o usuario foi un pouco intelixente e probe engadir un número para 168 00:10:32,600 --> 00:10:34,220 ao final dunha palabra. 169 00:10:34,220 --> 00:10:37,000 >> Entón, talvez o seu contrasinal foi password1. 170 00:10:37,000 --> 00:10:41,520 Entón podes probar iteración sobre as palabras no dicionario cun 171 00:10:41,520 --> 00:10:43,210 anexada ao final da mesma. 172 00:10:43,210 --> 00:10:47,360 E entón, quizais, despois de facelo, vai achegar a dous para o fin de todo. 173 00:10:47,360 --> 00:10:50,240 >> Ou que o usuario está a tentar ser aínda máis intelixente, e queren que os seus 174 00:10:50,240 --> 00:10:54,980 contrasinal para ser "hacker", pero son vai substituír todas as instancias e de 175 00:10:54,980 --> 00:10:56,600 con tres. 176 00:10:56,600 --> 00:10:58,440 Entón, podería facelo tamén. 177 00:10:58,440 --> 00:11:02,100 Iterado sobre as palabras no dicionario pero substituír caracteres que 178 00:11:02,100 --> 00:11:04,790 parecen números con estes números. 179 00:11:04,790 --> 00:11:09,670 >> Así, deste xeito, pode incorporarse aínda máis contrasinais que son moi comúns. 180 00:11:09,670 --> 00:11:14,690 Pero ao final, o único xeito que pode capturar todos os contrasinais é bruta 181 00:11:14,690 --> 00:11:17,340 forzar iterado sobre todos secuencias de caracteres posibles. 182 00:11:17,340 --> 00:11:22,100 Entón, ao final, ten que repetir sobre as cordas dun personaxe para 183 00:11:22,100 --> 00:11:28,110 oito caracteres, o que pode levar a moito tempo, pero ten que facelo. 184 00:11:28,110 --> 00:11:30,024 >> O meu nome é Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 E este é o crack. 186 00:11:31,425 --> 00:11:36,533