1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Jsem Rob a Pusťme se do toho. 3 00:00:15,890 --> 00:00:19,390 Takže nezapomeňte od Pset spec, že budeme potřebovat k použití 4 00:00:19,390 --> 00:00:20,890 krypta funkce. 5 00:00:20,890 --> 00:00:26,330 Pro manuálové stránky, máme dvě hash definovat _xopensource. 6 00:00:26,330 --> 00:00:28,290 Nebojte se o tom, proč musíme udělat. 7 00:00:28,290 --> 00:00:31,550 A také hash patří unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Takže jakmile to je z cesty, pojďme se na aktuální program. 9 00:00:35,920 --> 00:00:39,570 První věc, kterou musíme udělat, je ujistit uživatel zadal platné šifrována 10 00:00:39,570 --> 00:00:41,520 heslo na příkazovém řádku. 11 00:00:41,520 --> 00:00:46,050 Nezapomeňte, že program má který má být spuštěn jako tečka trhliny lomítko, a 12 00:00:46,050 --> 00:00:48,120 pak šifrované řetězec. 13 00:00:48,120 --> 00:00:52,990 >> Takže tady máme kontrolu, aby se ujistil že argc na dva, pokud chceme 14 00:00:52,990 --> 00:00:54,380 pokračovat v programu. 15 00:00:54,380 --> 00:00:58,830 Pokud není argc dvě, to znamená, že buď uživatel nezadal šifrována 16 00:00:58,830 --> 00:01:02,560 heslo na příkazovém řádku, nebo zadat více než jen šifrované 17 00:01:02,560 --> 00:01:05,379 heslo na příkazovém řádku, ve kterém případě nevíme, co dělat s 18 00:01:05,379 --> 00:01:07,660 Argumenty příkazového řádku. 19 00:01:07,660 --> 00:01:11,390 >> Takže pokud argc byly dva roky, můžeme pokračovat. 20 00:01:11,390 --> 00:01:14,160 A tady, budeme deklarovat variabilní zakódovány. 21 00:01:14,160 --> 00:01:17,650 To jen tak alias původních argv1 tak, že v celé této 22 00:01:17,650 --> 00:01:20,690 Program, nemáme říkat argv1, které pak musíte myslet 23 00:01:20,690 --> 00:01:22,950 , co to vlastně znamená. 24 00:01:22,950 --> 00:01:27,180 >> Tak konečně, chceme ověřit, že zašifrované heslo uživatele 25 00:01:27,180 --> 00:01:30,840 vstoupil by byly skutečně zašifrované heslo. 26 00:01:30,840 --> 00:01:35,120 Dle manuálové stránky krypty, na zašifrované heslo musí být 13 27 00:01:35,120 --> 00:01:36,440 znaků. 28 00:01:36,440 --> 00:01:41,500 Až tady si všimněte, že hash definováno šifrování délku jak 13 let. 29 00:01:41,500 --> 00:01:46,140 Takže jsme jen ujistit, že délka řetězce šifrované 30 00:01:46,140 --> 00:01:49,090 Heslo je 13. 31 00:01:49,090 --> 00:01:52,280 >> A pokud tomu tak není, chceme ukončit program. 32 00:01:52,280 --> 00:01:56,470 Takže jakmile to je z cesty, můžeme se skutečně snaží najít to, co 33 00:01:56,470 --> 00:02:00,410 heslo, které dal šifrována heslo bylo. 34 00:02:00,410 --> 00:02:04,870 Zde chceme chytit sůl od šifrovaným heslem. 35 00:02:04,870 --> 00:02:08,930 Pamatujte si, že na manuálové stránky, které první dva znaky šifrována 36 00:02:08,930 --> 00:02:10,590 řetězec, jako tady - 37 00:02:10,590 --> 00:02:12,770 50ZPJ a tak dále - 38 00:02:12,770 --> 00:02:16,170 první dva znaky dávají nás sůl, která byla použita 39 00:02:16,170 --> 00:02:18,080 v kryptě funkce. 40 00:02:18,080 --> 00:02:21,740 >> A tady vidíme, že sůl byla ha. 41 00:02:21,740 --> 00:02:27,610 Takže chceme zkopírovat první dvě znaky, sůl délka je hash 42 00:02:27,610 --> 00:02:30,230 definována jako dvě. 43 00:02:30,230 --> 00:02:35,970 Musíme zkopírujte první dva znaky do tohoto pole, sůl. 44 00:02:35,970 --> 00:02:39,340 Všimněte si, že potřebujeme sůl délku a jeden, protože stále potřebujeme null 45 00:02:39,340 --> 00:02:42,440 zakončení na konci našeho soli. 46 00:02:42,440 --> 00:02:46,940 >> Pak budeme deklarovat toto pole, host, délky a velikosti max. 47 00:02:46,940 --> 00:02:51,930 jeden, kde maximální délka je definována hash osmi let, protože maximální heslo 48 00:02:51,930 --> 00:02:55,090 je osm znaků dlouhé. 49 00:02:55,090 --> 00:02:59,860 A budeme se použít k iteraci přes všechny možné řetězce, které by mohly 50 00:02:59,860 --> 00:03:01,430 být platné hesla. 51 00:03:01,430 --> 00:03:07,720 Takže pokud platné znaky hesla byly jen a, b, a c, pak 52 00:03:07,720 --> 00:03:14,970 bychom iteraci, b, c, aa, ba, CA, a tak dále, dokud 53 00:03:14,970 --> 00:03:16,690 dostaneme vidět cccccccc - 54 00:03:16,690 --> 00:03:19,600 C je osm. 55 00:03:19,600 --> 00:03:23,620 >> A pokud nemáme dolů platný heslo, pak musíme říci, že 56 00:03:23,620 --> 00:03:26,590 šifrovaný řetězec nebyl platné začít. 57 00:03:26,590 --> 00:03:29,970 Takže teď se dostáváme to, když jeden smyčka. 58 00:03:29,970 --> 00:03:33,100 Všimněte si, že znamená, že je nekonečná smyčka. 59 00:03:33,100 --> 00:03:36,430 >> Všimněte si, že nejsou break v této nekonečné smyčky. 60 00:03:36,430 --> 00:03:38,570 Jsou vrátit pouze prohlášení. 61 00:03:38,570 --> 00:03:41,210 Takže jsme vlastně nikdy očekávat, k opuštění smyčky. 62 00:03:41,210 --> 00:03:44,750 Máme jen očekávat, že program ukončete. 63 00:03:44,750 --> 00:03:48,220 Přidal jsem tento tiskový prohlášení Vrchol této smyčky jen vytisknout 64 00:03:48,220 --> 00:03:51,790 co náš současný odhad na co je heslo. 65 00:03:51,790 --> 00:03:53,630 >> A teď, co je tato smyčka dělá? 66 00:03:53,630 --> 00:03:58,330 Je to opakování přes všechny možné řetězce které by mohly být platné hesla. 67 00:03:58,330 --> 00:04:02,700 První věc, kterou budeme dělat, je se náš současný odhad pro to, co 68 00:04:02,700 --> 00:04:03,920 heslo. 69 00:04:03,920 --> 00:04:07,230 Vezmeme sůl, která se chytil od šifrované řetězce, a my jsme 70 00:04:07,230 --> 00:04:09,850 bude k zašifrování odhad. 71 00:04:09,850 --> 00:04:14,760 To nám šifrované odhad, které budeme srovnávat proti 72 00:04:14,760 --> 00:04:18,810 šifrované řetězec, který uživatel zadané na příkazovém řádku. 73 00:04:18,810 --> 00:04:23,030 >> Pokud jsou stejné, v tom případě string srovnatelné vrátí nulu, pokud 74 00:04:23,030 --> 00:04:28,050 jsou stejné, pak asi byl heslo, které generuje šifrovaný 75 00:04:28,050 --> 00:04:33,520 řetězec, v tom případě můžeme vytisknout že jako naše heslo a zpět. 76 00:04:33,520 --> 00:04:37,520 Ale kdyby nebyly stejné, že znamená, že náš odhad byl správný. 77 00:04:37,520 --> 00:04:43,250 >> A chceme, aby iteraci další platné odhad. 78 00:04:43,250 --> 00:04:46,410 Takže to je to, co to při smyčka se snaží dělat. 79 00:04:46,410 --> 00:04:51,760 Bude to náš odhad iteraci na další platné odhad. 80 00:04:51,760 --> 00:04:56,080 Všimněte si, že když říkáme, že zvláštní charakter v našem odhadu má 81 00:04:56,080 --> 00:05:01,770 dosáhl symbol Max, který se zde je definován jako hash vlnovkou, protože 82 00:05:01,770 --> 00:05:05,710 to je největší hodnota ASCII znak že uživatel může zadat na 83 00:05:05,710 --> 00:05:11,210 klávesnice, když charakter dosáhne max. symbol, pak chceme poslat 84 00:05:11,210 --> 00:05:17,150 zpět na minimální symbol, který Je to prostor, opět nejnižší ASCII 85 00:05:17,150 --> 00:05:20,800 hodnota symbol, který může uživatel zadejte na klávesnici. 86 00:05:20,800 --> 00:05:22,940 >> Takže budeme nastavit, aby se minimální symbolu. 87 00:05:22,940 --> 00:05:25,720 A pak jsme se chystáte jít na další znak. 88 00:05:25,720 --> 00:05:28,730 Tak, jak jsou naše odhady bude přecházet? 89 00:05:28,730 --> 00:05:33,685 No, v případě, že jsou platné znaky a, b, a c, pak, pokud jsme začali s, 90 00:05:33,685 --> 00:05:36,630 to bude přecházet do B, bude to iterovat až c. 91 00:05:36,630 --> 00:05:44,360 c je náš max. symbol, takže budeme nastavit c zpět k, minimální symbol. 92 00:05:44,360 --> 00:05:48,100 A pak budeme iterovat index na další znak. 93 00:05:48,100 --> 00:05:53,920 >> Takže v případě, že původní odhad byl c, další znak bude null 94 00:05:53,920 --> 00:05:55,560 terminátor. 95 00:05:55,560 --> 00:06:00,670 Tady dole si všimněte, že pokud charakter že nyní chceme 96 00:06:00,670 --> 00:06:04,690 přírůstek byl null terminátor pak budeme nastavit tak, aby 97 00:06:04,690 --> 00:06:06,260 Minimální symbol. 98 00:06:06,260 --> 00:06:11,431 Takže v případě, že odhad byl, c, pak se naše Nový odhad bude aa. 99 00:06:11,431 --> 00:06:16,050 A když náš původní odhad byl CCCC, pak náš nový odhad 100 00:06:16,050 --> 00:06:18,380 bude aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Takže když dosáhnete maximálního řetězec dané délky, pak jsme 102 00:06:24,430 --> 00:06:29,090 bude provádět minimální řetězec dalšího délky, který bude 103 00:06:29,090 --> 00:06:34,420 jen se všechny znaky minimální symbol. 104 00:06:34,420 --> 00:06:36,970 A teď, co je tato kontrola dělá? 105 00:06:36,970 --> 00:06:42,780 No, když index pohyboval od osmé znak devíti charakteru - 106 00:06:42,780 --> 00:06:46,460 tak přidáme osm C je jako naše předchozí hádat - 107 00:06:46,460 --> 00:06:51,270 pak index bude soustředit na poslední null terminátor našeho odhadu 108 00:06:51,270 --> 00:06:57,990 pole, které nejsou určeny pro praktické Pro použití v naší heslo. 109 00:06:57,990 --> 00:07:03,530 >> Takže pokud se zaměřujeme na té poslední null terminator, pak jsme nenašli 110 00:07:03,530 --> 00:07:07,750 heslo, které je platné pouze pomocí osmi znaky, což znamená, že není žádný 111 00:07:07,750 --> 00:07:10,550 platné heslo, které šifruje na daný řetězec. 112 00:07:10,550 --> 00:07:13,520 A máme k tisku, že říká, jsme nemohli najít platný 113 00:07:13,520 --> 00:07:16,100 heslo a návrat. 114 00:07:16,100 --> 00:07:20,280 Tak to while bude iterovat přes všechny možné řetězce. 115 00:07:20,280 --> 00:07:24,640 >> Pokud zjistí, všechny změny, které šifruje na Očekává šifrované řetězec, bude to 116 00:07:24,640 --> 00:07:26,190 návrat toto heslo. 117 00:07:26,190 --> 00:07:29,610 A to, že nic nenajde, pak vrátí, tisk, že 118 00:07:29,610 --> 00:07:31,910 nebyl schopen najít nic. 119 00:07:31,910 --> 00:07:39,220 Nyní si všimněte, že iterace přes všechny Možné řetězce se pravděpodobně bude 120 00:07:39,220 --> 00:07:40,420 chvíli trvat. 121 00:07:40,420 --> 00:07:43,590 Pojďme se podívat, jak vlastně dlouho to trvá. 122 00:07:43,590 --> 00:07:47,230 >> Pojďme udělat trhlinu. 123 00:07:47,230 --> 00:07:51,050 No, jejda - říká definováno odkaz na krypty. 124 00:07:51,050 --> 00:07:55,330 Takže pamatujte, že pro p sady spec a i manuálové stránky pro kryptě, že jsme 125 00:07:55,330 --> 00:07:58,130 třeba propojit do krypty. 126 00:07:58,130 --> 00:08:01,130 Nyní, výchozí příkaz make neví, že jste 127 00:08:01,130 --> 00:08:03,010 chcete použít tuto funkci. 128 00:08:03,010 --> 00:08:09,680 >> Takže pojďme zkopírujte tento příkaz klienta a stačí přidat na konec 129 00:08:09,680 --> 00:08:13,300 o tom, propojení krypta. 130 00:08:13,300 --> 00:08:14,820 Nyní je sestavuje. 131 00:08:14,820 --> 00:08:23,880 Takže pojďme spustit prasklinu na daný šifrovaný řetězec - 132 00:08:23,880 --> 00:08:25,130 tak Císařův. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Takže to bylo docela rychle. 135 00:08:30,790 --> 00:08:33,230 >> Všimněte si, že to skončilo na 13 let. 136 00:08:33,230 --> 00:08:38,240 No, Caesarův zašifrované heslo se stane, že je 13. 137 00:08:38,240 --> 00:08:41,650 Takže pojďme zkusit zadat jiné heslo. 138 00:08:41,650 --> 00:08:45,830 Pojďme se Hirschhorn je šifrována heslo a zkuste to praskání, že. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Takže oznámení jsme již dosáhli tři znaky. 141 00:08:55,110 --> 00:08:58,660 A my iterace přes všechny možné tři znakové řetězce. 142 00:08:58,660 --> 00:09:01,420 To znamená, že už jsme se dokončit iterace přes všechny možné jednu a 143 00:09:01,420 --> 00:09:04,660 dva znakové řetězce. 144 00:09:04,660 --> 00:09:09,180 Teď to vypadá, že to bude chvíli trvat, než se dostaneme 145 00:09:09,180 --> 00:09:10,580 čtyři řetězce znaků. 146 00:09:10,580 --> 00:09:14,680 To může trvat několik minut. 147 00:09:14,680 --> 00:09:16,055 >> Netrvalo pár minut. 148 00:09:16,055 --> 00:09:18,450 Jsme na čtyři znakových řetězců. 149 00:09:18,450 --> 00:09:22,800 Ale teď se musíme iterovat přes všechny Možné čtyři řetězce znaků, které 150 00:09:22,800 --> 00:09:26,000 že může trvat možná 10 minut. 151 00:09:26,000 --> 00:09:28,720 A pak, když se dostaneme pět charakter řetězce, musíme iterovat přes všechny 152 00:09:28,720 --> 00:09:31,450 z těch, které by mohly trvat několik hodin. 153 00:09:31,450 --> 00:09:34,080 A musíme iterovat přes všechny možné šest-znakové řetězce, které 154 00:09:34,080 --> 00:09:36,560 může trvat pár dní, a tak dále. 155 00:09:36,560 --> 00:09:41,380 >> Takže to může trvat potenciálně velmi dlouhý čas k iteraci přes všechny možné 156 00:09:41,380 --> 00:09:44,850 osmimístné a méně řetězců. 157 00:09:44,850 --> 00:09:50,600 Všimněte si, že tak, ale to není nezbytně velmi efektivní algoritmus pro hledání 158 00:09:50,600 --> 00:09:51,860 heslo. 159 00:09:51,860 --> 00:09:54,540 Můžete si myslet, že existuje jsou lepší způsoby. 160 00:09:54,540 --> 00:10:02,230 Například heslo ZYX! 32ab asi není velmi časté heslo 161 00:10:02,230 --> 00:10:06,440 zatímco heslo je 12345 pravděpodobně mnohem častější. 162 00:10:06,440 --> 00:10:13,570 >> Takže jeden způsob, jak se snaží najít heslo rychleji je jen dívat 163 00:10:13,570 --> 00:10:15,560 na hesla, která jsou častější. 164 00:10:15,560 --> 00:10:20,480 Tak například, můžeme se pokusit číst slova ze slovníku a vyzkoušeli všechny 165 00:10:20,480 --> 00:10:24,860 tato slova jako naše heslo hádá. 166 00:10:24,860 --> 00:10:29,210 Nyní, možná heslo není to tak jednoduché. 167 00:10:29,210 --> 00:10:32,600 Možná, že uživatel byl poněkud chytrá a zkuste připojením číslo 168 00:10:32,600 --> 00:10:34,220 konec slova. 169 00:10:34,220 --> 00:10:37,000 >> Takže možná své heslo bylo password1. 170 00:10:37,000 --> 00:10:41,520 Takže si můžete vyzkoušet iterace všechna slova ve slovníku s jedním 171 00:10:41,520 --> 00:10:43,210 připojena na konec. 172 00:10:43,210 --> 00:10:47,360 A pak možná po tom to, že budete připojit dva na konci. 173 00:10:47,360 --> 00:10:50,240 >> Nebo možná se uživatel pokouší být ještě chytřejší, a chtějí, aby jejich 174 00:10:50,240 --> 00:10:54,980 heslo, které "hacker", ale jsou chystá nahradit všechny výskyty ŽP 175 00:10:54,980 --> 00:10:56,600 s trojek. 176 00:10:56,600 --> 00:10:58,440 Takže byste mohli udělat to taky. 177 00:10:58,440 --> 00:11:02,100 Iterovat přes všechna slova ve slovníku ale nahradit znaky, které 178 00:11:02,100 --> 00:11:04,790 Vypadají jako čísla s těmito čísly. 179 00:11:04,790 --> 00:11:09,670 >> Takže tímto způsobem, můžete zachytit i více hesla, která jsou docela běžné. 180 00:11:09,670 --> 00:11:14,690 Ale na konci, jediný způsob, jak můžete zachytit všechna hesla je hovado 181 00:11:14,690 --> 00:11:17,340 nutí iterovat přes všechny Možné řetězce. 182 00:11:17,340 --> 00:11:22,100 Takže nakonec, vy potřebujete iterovat přes všechny struny z jednoho znaku na 183 00:11:22,100 --> 00:11:28,110 osm znaků, které může trvat velmi dlouhá doba, ale musíte to udělat. 184 00:11:28,110 --> 00:11:30,024 >> Jmenuji se Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 A to je Crack. 186 00:11:31,425 --> 00:11:36,533