1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> Rob BOWDEN: Ako Rob, at sabihin makapag-crack. 3 00:00:15,890 --> 00:00:19,390 Kaya tandaan mula sa spec na pset kami ay pagpunta sa ay nangangailangan na gamitin ang 4 00:00:19,390 --> 00:00:20,890 silid sa ilalim ng lupa function. 5 00:00:20,890 --> 00:00:26,330 Para sa mga pahina ng tao, mayroon kaming dalawang hash tukuyin _xopensource. 6 00:00:26,330 --> 00:00:28,290 Huwag mag-alala tungkol sa kung bakit kailangan namin upang gawin iyon. 7 00:00:28,290 --> 00:00:31,550 At din hash isama unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Kaya sa sandaling iyon sa labas ng paraan, sabihin makapunta sa aktwal na programa. 9 00:00:35,920 --> 00:00:39,570 Unang bagay na kailangan naming gawin ay ang tiyakin ipinasok ng gumagamit ang isang wastong naka-encrypt 10 00:00:39,570 --> 00:00:41,520 password sa command line. 11 00:00:41,520 --> 00:00:46,050 Tandaan na ang programa ay dapat na tumakbo tulad ng dot slash crack, at 12 00:00:46,050 --> 00:00:48,120 pagkatapos ay naka-encrypt na string. 13 00:00:48,120 --> 00:00:52,990 >> Kaya dito kami pagsuri upang matiyak na argc sa dalawa kung gusto naming 14 00:00:52,990 --> 00:00:54,380 magpatuloy sa programa. 15 00:00:54,380 --> 00:00:58,830 Kung argc ay hindi dalawa, na nangangahulugan na alinman sa ang gumagamit ay hindi ipasok ang isang naka-encrypt 16 00:00:58,830 --> 00:01:02,560 password sa command line, o sila ipinasok higit pa sa mga naka-encrypt 17 00:01:02,560 --> 00:01:05,379 password sa command line, kung saan kaso hindi namin alam kung ano ang gagawin sa mga 18 00:01:05,379 --> 00:01:07,660 linya ng command argumento. 19 00:01:07,660 --> 00:01:11,390 >> Kaya kung argc noon ay dalawang, maaari naming magpatuloy. 20 00:01:11,390 --> 00:01:14,160 At dito, kami ay pagpunta sa idedeklara isang variable na naka-encrypt. 21 00:01:14,160 --> 00:01:17,650 Na lamang ang pagpunta sa alias ang orihinal argv1 kaya na ito sa buong 22 00:01:17,650 --> 00:01:20,690 programa, hindi namin kailangang tumawag ito argv1, na pagkatapos ay mayroon kang mag-isip 23 00:01:20,690 --> 00:01:22,950 tungkol sa kung ano ang aktwal na nilalayong. 24 00:01:22,950 --> 00:01:27,180 >> Kaya sa wakas, gusto naming patunayan na ang naka-encrypt na password ng gumagamit 25 00:01:27,180 --> 00:01:30,840 naipasok sana talaga naging isang naka-encrypt na password. 26 00:01:30,840 --> 00:01:35,120 Bawat tao ang pahina ng mga silid sa ilalim ng lupa, ang naka-encrypt na password ay dapat na 13 27 00:01:35,120 --> 00:01:36,440 character ang haba. 28 00:01:36,440 --> 00:01:41,500 Hanggang dito, napansin namin na tinukoy ng hash i-encrypt ang haba bilang 13. 29 00:01:41,500 --> 00:01:46,140 Kaya lang kami sa pagtiyak na ang string haba ng naka-encrypt 30 00:01:46,140 --> 00:01:49,090 password ay 13. 31 00:01:49,090 --> 00:01:52,280 >> At kung hindi, gusto namin upang lumabas mula sa programa. 32 00:01:52,280 --> 00:01:56,470 Kaya sa sandaling iyon sa labas ng paraan, maaari naming ngayon talagang subukan upang mahanap kung ano ang 33 00:01:56,470 --> 00:02:00,410 password na ibinigay sa naka-encrypt ay password. 34 00:02:00,410 --> 00:02:04,870 Dito, nais naming grab ang asin mula sa naka-encrypt na password. 35 00:02:04,870 --> 00:02:08,930 Tandaan, ang bawat pahina ng tao, na ang unang dalawang mga character ng isang naka-encrypt 36 00:02:08,930 --> 00:02:10,590 string, i dito - 37 00:02:10,590 --> 00:02:12,770 50ZPJ at iba pa - 38 00:02:12,770 --> 00:02:16,170 ang unang dalawang mga character bigyan amin ang asin na ginamit 39 00:02:16,170 --> 00:02:18,080 sa silid sa ilalim ng lupa function. 40 00:02:18,080 --> 00:02:21,740 >> At dito, makikita natin na ang asin ay ha. 41 00:02:21,740 --> 00:02:27,610 Kaya gusto namin upang kopyahin ang unang dalawang character, asin haba pagiging hash 42 00:02:27,610 --> 00:02:30,230 tinukoy bilang dalawang. 43 00:02:30,230 --> 00:02:35,970 Mayroon kaming upang kopyahin ang unang dalawang mga character ito sa array, asin. 44 00:02:35,970 --> 00:02:39,340 Pansinin na kailangan namin ng asin haba plus isa, dahil pa rin namin kailangan ang isang null 45 00:02:39,340 --> 00:02:42,440 Terminator sa dulo ng aming mga asin. 46 00:02:42,440 --> 00:02:46,940 >> Pagkatapos kami ay pagpunta upang ipahayag ang array, guest, laki ng max na haba plus 47 00:02:46,940 --> 00:02:51,930 isa, kung saan ang max na haba ay tinukoy ng hash bilang walo, dahil ang maximum password 48 00:02:51,930 --> 00:02:55,090 ay walong mga character ang haba. 49 00:02:55,090 --> 00:02:59,860 At kami ay pagpunta sa gamitin ito upang umulit sa ibabaw ng lahat ng posibleng mga string na maaari 50 00:02:59,860 --> 00:03:01,430 maging wastong mga password. 51 00:03:01,430 --> 00:03:07,720 Kaya kung ang wastong character sa isang password ay lang a, b, at c, pagkatapos ay 52 00:03:07,720 --> 00:03:14,970 Gusto naming umulit sa paglipas ng a, b, c, aa, BA, ca, at iba pa, hanggang sa 53 00:03:14,970 --> 00:03:16,690 makuha namin upang makita cccccccc - 54 00:03:16,690 --> 00:03:19,600 walong ni c. 55 00:03:19,600 --> 00:03:23,620 >> At kung kami ay hindi pababa ng wastong password, pagkatapos ay kailangan naming sabihin na ang 56 00:03:23,620 --> 00:03:26,590 naka-encrypt na string ay hindi wastong upang magsimula sa. 57 00:03:26,590 --> 00:03:29,970 Kaya ngayon, maabot namin ito habang 1 loop. 58 00:03:29,970 --> 00:03:33,100 Pansinin na nangangahulugan na ito isang walang-katapusang loop. 59 00:03:33,100 --> 00:03:36,430 >> Pansinin walang mga break na pahayag sa loob ng walang hangganang ito loop. 60 00:03:36,430 --> 00:03:38,570 Mayroon lamang bumalik pahayag. 61 00:03:38,570 --> 00:03:41,210 Kaya hindi namin talaga inaasahan upang lumabas mula sa loop. 62 00:03:41,210 --> 00:03:44,750 Lamang kami asahan upang lumabas mula sa programa. 63 00:03:44,750 --> 00:03:48,220 Idinagdag ko na ang naka-print na pahayag sa tuktok ng loop na ito upang i-print lamang out 64 00:03:48,220 --> 00:03:51,790 kung ano ang aming kasalukuyang mga hula sa ano ang password ay. 65 00:03:51,790 --> 00:03:53,630 >> Ngayon, kung ano ang loop ito ginagawa? 66 00:03:53,630 --> 00:03:58,330 Ito ay looping sa paglipas ng lahat ng posibleng mga string maaaring hindi wastong mga password. 67 00:03:58,330 --> 00:04:02,700 Ang unang bagay na kami ay pagpunta sa gawin ay tumagal ng aming kasalukuyang hula para sa kung ano ang 68 00:04:02,700 --> 00:04:03,920 password ay. 69 00:04:03,920 --> 00:04:07,230 Kukunin namin ang asin na namin grabbed mula sa ang naka-encrypt na string, at kami ay 70 00:04:07,230 --> 00:04:09,850 pagpunta upang i-encrypt ang hula. 71 00:04:09,850 --> 00:04:14,760 Ito ay magbibigay sa amin ng isang naka-encrypt na hula, na kung saan kami ay pagpunta sa ihambing laban sa 72 00:04:14,760 --> 00:04:18,810 ang naka-encrypt na string ng user inilagay sa linya ng command. 73 00:04:18,810 --> 00:04:23,030 >> Kung ang mga ito ang parehong, kung saan string maihahambing ay magbabalik zero, kung 74 00:04:23,030 --> 00:04:28,050 ang mga ito ay ang parehong, pagkatapos ay hulaan ang password na bumuo ng naka-encrypt 75 00:04:28,050 --> 00:04:33,520 string, kung saan maaari naming i-print na bilang aming mga password at return. 76 00:04:33,520 --> 00:04:37,520 Ngunit kung sila ay hindi ang parehong, na Nangangahulugan ang aming hula ay hindi tama. 77 00:04:37,520 --> 00:04:43,250 >> At gusto namin upang umulit sa sa susunod wastong hula. 78 00:04:43,250 --> 00:04:46,410 Kaya iyon ang kung ano ito habang loop ay sinusubukang gawin. 79 00:04:46,410 --> 00:04:51,760 Ito ay pagpunta sa umulit ang aming hula sa susunod wastong hula. 80 00:04:51,760 --> 00:04:56,080 Pansinin na kapag sinabi namin na ang isang partikular na character sa aming mga hula ay 81 00:04:56,080 --> 00:05:01,770 Naabot mo na ang max na simbolo, na hanggang dito hash ay tinukoy bilang isang tilda, dahil 82 00:05:01,770 --> 00:05:05,710 iyon ang pinakamalaking halaga ASCII na character na ang isang user ay maaaring ipasok sa 83 00:05:05,710 --> 00:05:11,210 keyboard, kapag ang mga character na umabot sa max simbolo, pagkatapos ay nais naming ipadala ang 84 00:05:11,210 --> 00:05:17,150 i-back ito sa minimum na simbolo, na ay isang puwang, muli ang pinakamababang ASCII 85 00:05:17,150 --> 00:05:20,800 halaga simbolo na ang isang gumagamit ay maaari ipasok sa keyboard. 86 00:05:20,800 --> 00:05:22,940 >> Kaya kami ay pagpunta sa set na sa minimum na simbolo. 87 00:05:22,940 --> 00:05:25,720 At pagkatapos ay kami ay pagpunta sa pumunta sa susunod na character. 88 00:05:25,720 --> 00:05:28,730 Kaya kung paano ang aming mga guesses pagpunta sa umulit? 89 00:05:28,730 --> 00:05:33,685 Well, kung ang wastong mga character ay a, b, at c, pagkatapos kung namin magsimula sa isang, 90 00:05:33,685 --> 00:05:36,630 Makikita ito upang umulit b, bibigyan ito umulit sa c. 91 00:05:36,630 --> 00:05:44,360 c ay ang aming max simbolo, kaya magtatakda kami c pabalik sa, ang minimum na simbolo. 92 00:05:44,360 --> 00:05:48,100 At pagkatapos ay gagamitin namin umulit index sa susunod na character. 93 00:05:48,100 --> 00:05:53,920 >> Kaya kung ang orihinal na hula ay c, ang susunod na na karakter ay pagpunta sa maging null 94 00:05:53,920 --> 00:05:55,560 Terminator. 95 00:05:55,560 --> 00:06:00,670 Down dito, mapapansin na kung ang character na namin ngayon ay nais upang 96 00:06:00,670 --> 00:06:04,690 paglakas ay ang null Terminator, pagkatapos kami ay pagpunta upang i-set ito sa 97 00:06:04,690 --> 00:06:06,260 minimum na simbolo. 98 00:06:06,260 --> 00:06:11,431 Kaya kung ang hula ay c, pagkatapos ay ang aming bagong hula ay magiging ee. 99 00:06:11,431 --> 00:06:16,050 At kung ang aming orihinal na hula ay cccc, pagkatapos ay ang aming bagong hula 100 00:06:16,050 --> 00:06:18,380 ay magiging aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Kaya sa tuwing namin maabot ang maximum na string ng isang naibigay na haba, pagkatapos kami ay 102 00:06:24,430 --> 00:06:29,090 pagpunta sa ipatupad sa pinakamaliit na string ng susunod na haba, na kalooban 103 00:06:29,090 --> 00:06:34,420 lamang maging ang lahat ng mga character ang minimum na simbolo. 104 00:06:34,420 --> 00:06:36,970 Ngayon, kung ano ang tseke ito ginagawa dito? 105 00:06:36,970 --> 00:06:42,780 Well, kung ang index ay inilipat mula sa pangwalo na character sa siyam na character - 106 00:06:42,780 --> 00:06:46,460 kaya naming magdagdag ng walong c bilang ang aming nakaraang hulaan - 107 00:06:46,460 --> 00:06:51,270 pagkatapos ay i-index ay pagpunta upang tumutok sa mga huling null Terminator ng aming mga hula 108 00:06:51,270 --> 00:06:57,990 array, na kung saan ay hindi ginawa upang aktwal magamit sa aming password. 109 00:06:57,990 --> 00:07:03,530 >> Kaya kung kami ay nakatuon sa na huling null Terminator, pagkatapos ay hindi pa namin nakitang isang 110 00:07:03,530 --> 00:07:07,750 password na wastong gamit lamang walong character, na nangangahulugan na walang 111 00:07:07,750 --> 00:07:10,550 wastong password na ine-encrypt sa naibigay na string. 112 00:07:10,550 --> 00:07:13,520 At kami ay may upang i-print na, na sinasabi Hindi kami makahanap ng wastong 113 00:07:13,520 --> 00:07:16,100 password, at tubo. 114 00:07:16,100 --> 00:07:20,280 Kaya ito habang loop ay pagpunta sa umulit sa ibabaw ng lahat ng posibleng mga string. 115 00:07:20,280 --> 00:07:24,640 >> Kung nahahanap nito ang anuman na ine-encrypt sa Inaasahan ang naka-encrypt na string, bibigyan ito 116 00:07:24,640 --> 00:07:26,190 bumalik na password. 117 00:07:26,190 --> 00:07:29,610 At hindi ito mahanap ang anumang bagay, at pagkatapos ay ito ay bumalik, pag-print na ito 118 00:07:29,610 --> 00:07:31,910 Hindi nagawang upang mahanap ang anumang bagay. 119 00:07:31,910 --> 00:07:39,220 Ngayon, mapapansin na ang iterating sa ibabaw ng lahat posible string ay marahil pagpunta sa 120 00:07:39,220 --> 00:07:40,420 magtagal. 121 00:07:40,420 --> 00:07:43,590 Natin talaga makita kung paano matagal na tumatagal. 122 00:07:43,590 --> 00:07:47,230 >> Sabihin gumawa crack. 123 00:07:47,230 --> 00:07:51,050 Well, oops - sinasabi nito na hindi naipalilawanag isangguni sa silid sa ilalim ng lupa. 124 00:07:51,050 --> 00:07:55,330 Kaya tandaan, para p ang nagtatakda spec at din ang mga tao na pahina para sa silid sa ilalim ng lupa na namin 125 00:07:55,330 --> 00:07:58,130 kailangan na mag-link sa silid sa ilalim ng lupa. 126 00:07:58,130 --> 00:08:01,130 Ngayon, ang default na gumawa ng utos Hindi alam mo na 127 00:08:01,130 --> 00:08:03,010 nais na gumamit na function. 128 00:08:03,010 --> 00:08:09,680 >> Kaya sabihin kopyahin ito client utos at idagdag lamang sa hanggang sa dulo 129 00:08:09,680 --> 00:08:13,300 ng mga ito, pag-uugnay silid sa ilalim ng lupa. 130 00:08:13,300 --> 00:08:14,820 Ngayon, ito compiles. 131 00:08:14,820 --> 00:08:23,880 Kaya natin patakbuhin crack sa isang naibigay na naka-encrypt na string - 132 00:08:23,880 --> 00:08:25,130 kaya ni Caesar. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Kaya na noon ay medyo mabilis. 135 00:08:30,790 --> 00:08:33,230 >> Pansinin na ito natapos sa 13. 136 00:08:33,230 --> 00:08:38,240 Well, Caesar ng naka-encrypt na password Nagkataong 13. 137 00:08:38,240 --> 00:08:41,650 So sabihin subukan ang ibang password. 138 00:08:41,650 --> 00:08:45,830 Magpahinga Hirschhorn ng naka-encrypt password at subukang mag-crack na. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Kaya mapapansin na namin naabot tatlong character. 141 00:08:55,110 --> 00:08:58,660 At kami ay iterating sa paglipas ng lahat ng mga posibleng tatlong-character na string. 142 00:08:58,660 --> 00:09:01,420 Nangangahulugan iyon na namin tapusin iterating sa paglipas ng lahat ng mga posibleng isa at 143 00:09:01,420 --> 00:09:04,660 dalawang character na string. 144 00:09:04,660 --> 00:09:09,180 Ngayon, mukhang ito ay pagpunta sa matagalan bago maabot namin ang 145 00:09:09,180 --> 00:09:10,580 apat na-character na string. 146 00:09:10,580 --> 00:09:14,680 Maaaring tumagal ng ilang minuto. 147 00:09:14,680 --> 00:09:16,055 >> Hindi nito tumagal ng ilang minuto. 148 00:09:16,055 --> 00:09:18,450 Ikinalulungkot namin sa apat na-character na string. 149 00:09:18,450 --> 00:09:22,800 Ngunit ngayon, kailangan namin upang umulit sa ibabaw ng lahat posible apat na-character na string, na 150 00:09:22,800 --> 00:09:26,000 na maaaring tumagal siguro 10 minuto. 151 00:09:26,000 --> 00:09:28,720 At pagkatapos ay kapag naabot namin ang limang karakter string, kailangan namin upang umulit sa ibabaw ng lahat 152 00:09:28,720 --> 00:09:31,450 ng mga, na kung saan maaari tumagal ng dalawang oras. 153 00:09:31,450 --> 00:09:34,080 At kailangan namin upang umulit sa paglipas ng lahat ng mga posibleng anim na-character na string, na 154 00:09:34,080 --> 00:09:36,560 Maaaring tumagal ng ilang mga araw at iba pa. 155 00:09:36,560 --> 00:09:41,380 >> Kaya maaari itong tumagal ng isang potensyal na masyadong mahaba oras upang umulit sa paglipas ng lahat ng mga posibleng 156 00:09:41,380 --> 00:09:44,850 walong-character at mas kaunting mga string. 157 00:09:44,850 --> 00:09:50,600 Kaya mapapansin na ito ay hindi nangangahulugang isang napaka mahusay na algorithm para sa paghahanap ng 158 00:09:50,600 --> 00:09:51,860 isang password. 159 00:09:51,860 --> 00:09:54,540 Maaari mong isipin na mayroong ay mas mahusay na paraan. 160 00:09:54,540 --> 00:10:02,230 Halimbawa, ang password zyx! 32ab marahil ay hindi isang napaka-karaniwang mga password, 161 00:10:02,230 --> 00:10:06,440 samantalang ang password 12345 ay marahil ng maraming mas karaniwang. 162 00:10:06,440 --> 00:10:13,570 >> Kaya isang paraan ng sinusubukan upang makahanap ng isang password mas mabilis ay upang tingnan lamang 163 00:10:13,570 --> 00:10:15,560 sa mga password na ay mas karaniwan. 164 00:10:15,560 --> 00:10:20,480 Kaya halimbawa, maaari naming subukan na basahin ang mga salita mula sa isang diksyunaryo at subukan ang lahat ng 165 00:10:20,480 --> 00:10:24,860 mga salitang iyon ng aming guesses password. 166 00:10:24,860 --> 00:10:29,210 Ngayon, marahil ng isang password ay hindi na simple. 167 00:10:29,210 --> 00:10:32,600 Siguro ang user ay medyo matalino at subukang appending isang numero sa 168 00:10:32,600 --> 00:10:34,220 sa dulo ng isang salita. 169 00:10:34,220 --> 00:10:37,000 >> Kaya marahil ang kanilang password ay password1. 170 00:10:37,000 --> 00:10:41,520 Kaya maaari mong subukan iterating sa paglipas ng lahat ng mga salita sa diksyunaryo na may isa 171 00:10:41,520 --> 00:10:43,210 nakadugtong sa dulo ng ito. 172 00:10:43,210 --> 00:10:47,360 At pagkatapos ay marahil pagkatapos ng paggawa na, bibigyan ka ikabit ang isang dalawang sa dulo ng ito. 173 00:10:47,360 --> 00:10:50,240 >> O siguro ang user ay sumusubok na maging kahit na mas matalino, at nais nila ang kanilang 174 00:10:50,240 --> 00:10:54,980 password upang maging "Hacker," ngunit ang mga ito ay pagpunta sa palitan ang lahat ng mga pagkakataon ng e ni 175 00:10:54,980 --> 00:10:56,600 may threes. 176 00:10:56,600 --> 00:10:58,440 Kaya maaari mong gawin ito masyadong. 177 00:10:58,440 --> 00:11:02,100 Umulit sa lahat ng mga salita sa diksyunaryo pero palitan ang mga character na 178 00:11:02,100 --> 00:11:04,790 hitsura ng mga numero na may mga numero. 179 00:11:04,790 --> 00:11:09,670 >> Kaya sa ganitong paraan, maaari mong abutin kahit na higit pa mga password na ay medyo pangkaraniwan. 180 00:11:09,670 --> 00:11:14,690 Ngunit sa katapusan, ang tanging paraan na maaari mong makuha ang lahat ng mga password ay ang taong malupit 181 00:11:14,690 --> 00:11:17,340 puwersahin ang umulit sa ibabaw ng lahat posible string. 182 00:11:17,340 --> 00:11:22,100 Kaya sa katapusan, mo kailangang umulit sa lahat ng mga string mula sa isang character sa 183 00:11:22,100 --> 00:11:28,110 walong mga character, na maaaring tumagal ng masyadong mahaba ang oras, ngunit kailangan mong gawin ito. 184 00:11:28,110 --> 00:11:30,024 >> Ang pangalan ko ay Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 At ito ay crack. 186 00:11:31,425 --> 00:11:36,533