1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB Bowden: Ja sam Rob, a neka je pucanje. 3 00:00:15,890 --> 00:00:19,390 Pa sjetite se iz pset spec. da ćemo se trebaju koristiti 4 00:00:19,390 --> 00:00:20,890 kriptu funkciju. 5 00:00:20,890 --> 00:00:26,330 Za čovjeka stranici, imamo dva hash definirati _xopensource. 6 00:00:26,330 --> 00:00:28,290 Ne brinite o tome zašto moramo to učiniti. 7 00:00:28,290 --> 00:00:31,550 I također uključuju mljeveno meso unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Tako jednom da je zabit, neka je doći do stvarnog programa. 9 00:00:35,920 --> 00:00:39,570 Prva stvar koju trebate učiniti je da provjerite korisnik unio vrijedi kodiran 10 00:00:39,570 --> 00:00:41,520 lozinku na naredbenog retka. 11 00:00:41,520 --> 00:00:46,050 Sjetite se da je program trebao koji će se prikazivati ​​kao dot slash pukotinu, i 12 00:00:46,050 --> 00:00:48,120 zatim kodiran string. 13 00:00:48,120 --> 00:00:52,990 >> Dakle ovdje smo provjeru kako bi bili sigurni da argc na dva, ako želimo 14 00:00:52,990 --> 00:00:54,380 nastaviti s programom. 15 00:00:54,380 --> 00:00:58,830 Ako argc nisu dva, to znači da je bilo korisnik nije unio kodiran 16 00:00:58,830 --> 00:01:02,560 lozinku na naredbenog retka, ili oni stupio je više nego samo kodiran 17 00:01:02,560 --> 00:01:05,379 lozinku u naredbeni redak, u kojem Slučaj ne znamo što učiniti s 18 00:01:05,379 --> 00:01:07,660 argumenata naredbenog retka. 19 00:01:07,660 --> 00:01:11,390 >> Dakle, ako argc je dva, možemo nastaviti. 20 00:01:11,390 --> 00:01:14,160 I ovdje, idemo proglasiti promjenjiva kodiran. 21 00:01:14,160 --> 00:01:17,650 To jednostavno će alias izvornih argv1, tako da je tijekom ove 22 00:01:17,650 --> 00:01:20,690 Program, nemamo ga nazvati argv1, koji onda morate razmišljati 23 00:01:20,690 --> 00:01:22,950 o tome što to zapravo znači. 24 00:01:22,950 --> 00:01:27,180 >> Dakle, na kraju, želimo potvrditi da kriptirani lozinkom korisnik 25 00:01:27,180 --> 00:01:30,840 ušao bi zapravo bili kriptirani lozinkom. 26 00:01:30,840 --> 00:01:35,120 Po ljudskom stranici kripti, na kriptirani password moraju biti 13 27 00:01:35,120 --> 00:01:36,440 znakova. 28 00:01:36,440 --> 00:01:41,500 Ovdje gore, primijetiti da smo hash definira šifriranje duljinu kao 13.. 29 00:01:41,500 --> 00:01:46,140 Dakle, mi smo samo pazeći da string duljina kodiran 30 00:01:46,140 --> 00:01:49,090 lozinka je 13. 31 00:01:49,090 --> 00:01:52,280 >> A ako to nije, želimo za izlaz iz programa. 32 00:01:52,280 --> 00:01:56,470 Tako jednom da je zabit, možemo sada zapravo pokušati pronaći ono što 33 00:01:56,470 --> 00:02:00,410 lozinka koje je dao kodiran Lozinka je. 34 00:02:00,410 --> 00:02:04,870 Ovdje želimo da zgrabite sol iz šifriranom lozinkom. 35 00:02:04,870 --> 00:02:08,930 Zapamtite, čovjek po stranici, da Prva dva znaka kodiran 36 00:02:08,930 --> 00:02:10,590 string, mi se ovdje - 37 00:02:10,590 --> 00:02:12,770 50ZPJ i tako dalje - 38 00:02:12,770 --> 00:02:16,170 prva dva znaka daju nam soli koja je korištena 39 00:02:16,170 --> 00:02:18,080 u kripti funkciji. 40 00:02:18,080 --> 00:02:21,740 >> I ovdje vidimo da je sol ha. 41 00:02:21,740 --> 00:02:27,610 Dakle, želimo kopirati prva dva likovi, sol duljina je hash 42 00:02:27,610 --> 00:02:30,230 definira kao dva. 43 00:02:30,230 --> 00:02:35,970 Mi moramo kopirati prve dvije znakova u ovom nizu, sol. 44 00:02:35,970 --> 00:02:39,340 Obavijest da moramo soli dužine plus jedan, budući da još uvijek treba null 45 00:02:39,340 --> 00:02:42,440 terminator na kraju našeg soli. 46 00:02:42,440 --> 00:02:46,940 >> Onda ćemo proglasiti ovaj niz, gost, od veličine max duljine plus 47 00:02:46,940 --> 00:02:51,930 jedan, gdje je max duljina je definirana hash kao osam, od maksimalno lozinkom 48 00:02:51,930 --> 00:02:55,090 je osam znakova. 49 00:02:55,090 --> 00:02:59,860 I mi ćemo to upotrijebiti za iteraciju preko svih mogućih nizova koji bi mogao 50 00:02:59,860 --> 00:03:01,430 biti valjane lozinke. 51 00:03:01,430 --> 00:03:07,720 Dakle, ako su valjani znakovi lozinke u su samo a, b i c, a zatim 52 00:03:07,720 --> 00:03:14,970 bismo iteraciju više, b, c, aa, ba, CA, i tako dalje, sve dok 53 00:03:14,970 --> 00:03:16,690 ćemo se vidjeti cccccccc - 54 00:03:16,690 --> 00:03:19,600 osam Ca. 55 00:03:19,600 --> 00:03:23,620 >> I ako imamo ne dolje valjana lozinku, onda moramo reći da 56 00:03:23,620 --> 00:03:26,590 kodiran string nije bio važi za početak. 57 00:03:26,590 --> 00:03:29,970 Tako sada, mi bi se to postiglo, dok 1 petlje. 58 00:03:29,970 --> 00:03:33,100 Obavijest to znači da je klapa. 59 00:03:33,100 --> 00:03:36,430 >> Obavijest nema izjava Stanka unutar ove beskonačne petlje. 60 00:03:36,430 --> 00:03:38,570 Tu su se vratili samo izjave. 61 00:03:38,570 --> 00:03:41,210 Dakle, mi zapravo nikada očekivati za izlazak iz petlje. 62 00:03:41,210 --> 00:03:44,750 Mi samo očekivati ​​da će izaći iz programa. 63 00:03:44,750 --> 00:03:48,220 Dodao sam ovu izjavu za ispis Vrh ove petlje samo za ispis iz 64 00:03:48,220 --> 00:03:51,790 što je naš trenutni nagađati ono što je lozinka. 65 00:03:51,790 --> 00:03:53,630 >> Sada, što je to loop radi? 66 00:03:53,630 --> 00:03:58,330 Prošlo petlje preko svih mogućih nizova koje bi mogle biti valjane lozinke. 67 00:03:58,330 --> 00:04:02,700 Prvo što ćemo učiniti je uzeti našu trenutnu pogodak za ono 68 00:04:02,700 --> 00:04:03,920 lozinka. 69 00:04:03,920 --> 00:04:07,230 Mi ćemo uzeti soli koje smo uhvatio s kodiran string, a mi smo 70 00:04:07,230 --> 00:04:09,850 ide za šifriranje nagađati. 71 00:04:09,850 --> 00:04:14,760 To će nam dati šifrirani pogađati, koji ćemo usporediti protiv 72 00:04:14,760 --> 00:04:18,810 kriptirani niz koji korisnik stupio na naredbenog retka. 73 00:04:18,810 --> 00:04:23,030 >> Ako su isti, u kojem slučaju string usporediti će se vratiti na nulu, ako je 74 00:04:23,030 --> 00:04:28,050 oni su isti, onda valjda bio lozinka koje generira kodiran 75 00:04:28,050 --> 00:04:33,520 string, u kojem slučaju se može ispisivati da su naše lozinkom i povratak. 76 00:04:33,520 --> 00:04:37,520 No, ako oni nisu bili isti, da znači naša pretpostavka bila pogrešna. 77 00:04:37,520 --> 00:04:43,250 >> I želimo ponoviti da Sljedeći vrijedi pretpostavka. 78 00:04:43,250 --> 00:04:46,410 Dakle, to je ono to dok petlja se pokušava učiniti. 79 00:04:46,410 --> 00:04:51,760 To će se ponoviti našu pretpostavku na sljedeći važeći pogodak. 80 00:04:51,760 --> 00:04:56,080 Obavijest da kada kažemo da Konkretno lik u našoj pogodak ima 81 00:04:56,080 --> 00:05:01,770 dosegao max simbol, koji se ovdje se hash definira kao tilde, jer 82 00:05:01,770 --> 00:05:05,710 to je najveća vrijednost ASCII znakova koje korisnik može unijeti 83 00:05:05,710 --> 00:05:11,210 tipkovnice, kad lik dosegne max simbol, a zatim želimo poslati 84 00:05:11,210 --> 00:05:17,150 ga natrag na minimalnu simbol, koji je prostor, opet je najmanji ASCII 85 00:05:17,150 --> 00:05:20,800 Vrijednost simbol koji korisnik može unijeti na tipkovnici. 86 00:05:20,800 --> 00:05:22,940 >> Tako ćemo postaviti da na minimalnu simbol. 87 00:05:22,940 --> 00:05:25,720 A onda ćemo ići na sljedeći znak. 88 00:05:25,720 --> 00:05:28,730 Pa kako su naši pogodi će se ponoviti? 89 00:05:28,730 --> 00:05:33,685 I, ako su valjani znakovi su a, b, ic, pa ako smo započeli s, 90 00:05:33,685 --> 00:05:36,630 to ću ponoviti na b, to će iteraciju na c. 91 00:05:36,630 --> 00:05:44,360 c je naš max simbol, pa ćemo dogovoriti c natrag, minimalna simbol. 92 00:05:44,360 --> 00:05:48,100 A onda ćemo ponoviti indeksa na sljedeći znak. 93 00:05:48,100 --> 00:05:53,920 >> Dakle, ako je izvorna pretpostavka je c, pored Lik će biti null 94 00:05:53,920 --> 00:05:55,560 Terminator. 95 00:05:55,560 --> 00:06:00,670 Ovdje dolje, primijetio da ako lik da mi sada žele 96 00:06:00,670 --> 00:06:04,690 prirast bio null terminator, onda ćemo ga postaviti na 97 00:06:04,690 --> 00:06:06,260 Minimalna simbol. 98 00:06:06,260 --> 00:06:11,431 Dakle, ako je pogodak bio c, onda je naša Novi pogodak će biti aa. 99 00:06:11,431 --> 00:06:16,050 A ako naša izvorna pretpostavka je cccc, a zatim naš novi pogodak 100 00:06:16,050 --> 00:06:18,380 će biti aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Dakle, kad god dođemo do maksimalno string danog duljine, tada smo 102 00:06:24,430 --> 00:06:29,090 će provesti na minimalnu string od sljedećeg duljine, koji će 103 00:06:29,090 --> 00:06:34,420 Samo se svi likovi Minimalna simbol. 104 00:06:34,420 --> 00:06:36,970 Sada, što je ovaj ček radiš ovdje? 105 00:06:36,970 --> 00:06:42,780 Pa, ako je indeks preselio na osmo Lik na devet karaktera - 106 00:06:42,780 --> 00:06:46,460 pa smo dodali osam c-ih kao Naša prethodna pogodite - 107 00:06:46,460 --> 00:06:51,270 Indeks onda će se usredotočiti na Posljednji null terminator našeg pogodak 108 00:06:51,270 --> 00:06:57,990 polje, što nije značilo da je zapravo se koristiti u našoj lozinkom. 109 00:06:57,990 --> 00:07:03,530 >> Dakle, ako smo fokusirani na tom posljednjem null Terminator, onda nismo našli 110 00:07:03,530 --> 00:07:07,750 lozinka valjana je korištenjem samo osam likovi, što znači da ne postoji 111 00:07:07,750 --> 00:07:10,550 važeća lozinka koje šifrira u određenom nizu. 112 00:07:10,550 --> 00:07:13,520 I moramo napisati i da, rekavši nismo uspjeli pronaći valjana 113 00:07:13,520 --> 00:07:16,100 lozinka i povratak. 114 00:07:16,100 --> 00:07:20,280 Dakle, ovo while petlja će se ponoviti tijekom svih mogućih nizova. 115 00:07:20,280 --> 00:07:24,640 >> Ako se utvrdi da je bilo šifrira se Očekuje kodiran string, to će 116 00:07:24,640 --> 00:07:26,190 vrati tu lozinku. 117 00:07:26,190 --> 00:07:29,610 I to ne nađe ništa, a zatim ona će se vratiti, tisak da je to 118 00:07:29,610 --> 00:07:31,910 nije bio u mogućnosti pronaći ništa. 119 00:07:31,910 --> 00:07:39,220 Sada, primijetiti da iterating preko svega moguća žice vjerojatno će 120 00:07:39,220 --> 00:07:40,420 potrajati. 121 00:07:40,420 --> 00:07:43,590 Idemo vidjeti koliko je zapravo dugo da traje. 122 00:07:43,590 --> 00:07:47,230 >> Učinimo pukotine. 123 00:07:47,230 --> 00:07:51,050 Pa, pardon - kaže nedefinirano pozivanje na kripti. 124 00:07:51,050 --> 00:07:55,330 Tako zapamtite, za p postavlja spec. i Također man stranicu za kripti koje smo 125 00:07:55,330 --> 00:07:58,130 trebate povezati u kripti. 126 00:07:58,130 --> 00:08:01,130 Sada, zadana bi naredbu ne znam da li 127 00:08:01,130 --> 00:08:03,010 želite koristiti tu funkciju. 128 00:08:03,010 --> 00:08:09,680 >> Tako ćemo kopirati ovu naredbu klijenta i samo dodati na kraju 129 00:08:09,680 --> 00:08:13,300 nje, povezujući kripti. 130 00:08:13,300 --> 00:08:14,820 Sada, što sastavlja. 131 00:08:14,820 --> 00:08:23,880 Tako ćemo pokrenuti pukotine na dano kodiran string - 132 00:08:23,880 --> 00:08:25,130 tako Carev. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Tako da je prilično brzo. 135 00:08:30,790 --> 00:08:33,230 >> Obavijest da je ovaj završio na 13.. 136 00:08:33,230 --> 00:08:38,240 Pa, Cezarov kriptirani lozinkom dogoditi da bude 13. 137 00:08:38,240 --> 00:08:41,650 Dakle, pokušajmo još lozinku. 138 00:08:41,650 --> 00:08:45,830 Uzmimo Hirschhorna kodiran lozinkom i pokušati pucanja to. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Dakle, primijetite da smo već postigli tri znaka. 141 00:08:55,110 --> 00:08:58,660 I mi smo iterating preko svega to moguće tri niza znakova. 142 00:08:58,660 --> 00:09:01,420 To znači da smo već završili Ponavljanje tijekom svu moguću jedan i 143 00:09:01,420 --> 00:09:04,660 dva niza znakova. 144 00:09:04,660 --> 00:09:09,180 Sada, izgleda da će se to potrajati neko vrijeme prije nego što stignemo 145 00:09:09,180 --> 00:09:10,580 četiri znakova. 146 00:09:10,580 --> 00:09:14,680 To bi moglo potrajati nekoliko minuta. 147 00:09:14,680 --> 00:09:16,055 >> To nije potrajati nekoliko minuta. 148 00:09:16,055 --> 00:09:18,450 Mi smo na četiri znakova. 149 00:09:18,450 --> 00:09:22,800 Ali sada, moramo ponoviti preko svega moguća četiri niza znakova, koji se 150 00:09:22,800 --> 00:09:26,000 koja bi mogla potrajati možda 10 minuta. 151 00:09:26,000 --> 00:09:28,720 I onda kad dođemo do pet karakter žice, moramo ponoviti preko svega 152 00:09:28,720 --> 00:09:31,450 od onih, što bi moglo potrajati nekoliko sati. 153 00:09:31,450 --> 00:09:34,080 I moramo ponoviti tijekom ikako moguće šest-niz znakova koji 154 00:09:34,080 --> 00:09:36,560 možda trebati nekoliko dana i tako dalje. 155 00:09:36,560 --> 00:09:41,380 >> Dakle, to bi moglo potrajati jako dugo potencijalno Vrijeme je da ponove više uopće moguće 156 00:09:41,380 --> 00:09:44,850 osam znakova, a manje žice. 157 00:09:44,850 --> 00:09:50,600 Dakle, primijetite da to nije nužno Vrlo učinkovit algoritam za pronalaženje 158 00:09:50,600 --> 00:09:51,860 lozinkom. 159 00:09:51,860 --> 00:09:54,540 Vi možda mislite da postoji i bolji načini. 160 00:09:54,540 --> 00:10:02,230 Na primjer, lozinkom zyx! 32ab vjerojatno nije vrlo čest lozinkom, 161 00:10:02,230 --> 00:10:06,440 dok je lozinka 12345 vjerojatno puno više zajedničkog. 162 00:10:06,440 --> 00:10:13,570 >> Dakle, jedan od načina pokušava pronaći lozinke brže je samo pogled 163 00:10:13,570 --> 00:10:15,560 na lozinki koje su češći. 164 00:10:15,560 --> 00:10:20,480 Tako na primjer, možemo pokušati pročitati riječi iz rječnika i pokušati sve 165 00:10:20,480 --> 00:10:24,860 one riječi što su naši lozinka nagađanja. 166 00:10:24,860 --> 00:10:29,210 Sada, možda i lozinkom nije tako jednostavno. 167 00:10:29,210 --> 00:10:32,600 Možda je korisnik nešto pametno i pokušati dodavanjem broja na 168 00:10:32,600 --> 00:10:34,220 kraju riječi. 169 00:10:34,220 --> 00:10:37,000 >> Dakle, možda je password1 njihove lozinke. 170 00:10:37,000 --> 00:10:41,520 Tako možete isprobati tijekom iterating sve riječi u rječniku s jednim 171 00:10:41,520 --> 00:10:43,210 dodaje na kraju. 172 00:10:43,210 --> 00:10:47,360 A onda možda i nakon što je to, vi ćete dodati dva na kraju. 173 00:10:47,360 --> 00:10:50,240 >> Ili možda korisnik pokušava biti još više pametan, a oni žele da njihova 174 00:10:50,240 --> 00:10:54,980 lozinka biti "haker", ali oni su će zamijeniti sve instance E je 175 00:10:54,980 --> 00:10:56,600 s trojkama. 176 00:10:56,600 --> 00:10:58,440 Tako da bi mogao to učiniti previše. 177 00:10:58,440 --> 00:11:02,100 Ponoviti više od svih riječi u rječniku ali zamijenite znakove da 178 00:11:02,100 --> 00:11:04,790 izgleda kao brojeve s tim brojevima. 179 00:11:04,790 --> 00:11:09,670 >> Dakle, ovaj način, možda uhvatiti još lozinke koje su prilično uobičajene. 180 00:11:09,670 --> 00:11:14,690 Ali na kraju, jedini način možete uhvatiti sve lozinke je gruba 181 00:11:14,690 --> 00:11:17,340 prisiliti ponoviti preko svega moguća žice. 182 00:11:17,340 --> 00:11:22,100 Tako je na kraju, to ne treba da ponove nad svim žice iz jednog lika u 183 00:11:22,100 --> 00:11:28,110 osam znakova, što bi moglo potrajati jako dugo vremena, ali morate to učiniti. 184 00:11:28,110 --> 00:11:30,024 >> Moje ime je Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 A to je pukotina. 186 00:11:31,425 --> 00:11:36,533