ROB BOWDEN: Jsem Rob a Pusťme se do toho. Takže nezapomeňte od Pset spec, že budeme potřebovat k použití krypta funkce. Pro manuálové stránky, máme dvě hash definovat _xopensource. Nebojte se o tom, proč musíme udělat. A také hash patří unistd.h. Takže jakmile to je z cesty, pojďme se na aktuální program. První věc, kterou musíme udělat, je ujistit uživatel zadal platné šifrována heslo na příkazovém řádku. Nezapomeňte, že program má který má být spuštěn jako tečka trhliny lomítko, a pak šifrované řetězec. Takže tady máme kontrolu, aby se ujistil že argc na dva, pokud chceme pokračovat v programu. Pokud není argc dvě, to znamená, že buď uživatel nezadal šifrována heslo na příkazovém řádku, nebo zadat více než jen šifrované heslo na příkazovém řádku, ve kterém případě nevíme, co dělat s Argumenty příkazového řádku. Takže pokud argc byly dva roky, můžeme pokračovat. A tady, budeme deklarovat variabilní zakódovány. To jen tak alias původních argv1 tak, že v celé této Program, nemáme říkat argv1, které pak musíte myslet , co to vlastně znamená. Tak konečně, chceme ověřit, že zašifrované heslo uživatele vstoupil by byly skutečně zašifrované heslo. Dle manuálové stránky krypty, na zašifrované heslo musí být 13 znaků. Až tady si všimněte, že hash definováno šifrování délku jak 13 let. Takže jsme jen ujistit, že délka řetězce šifrované Heslo je 13. A pokud tomu tak není, chceme ukončit program. Takže jakmile to je z cesty, můžeme se skutečně snaží najít to, co heslo, které dal šifrována heslo bylo. Zde chceme chytit sůl od šifrovaným heslem. Pamatujte si, že na manuálové stránky, které první dva znaky šifrována řetězec, jako tady - 50ZPJ a tak dále - první dva znaky dávají nás sůl, která byla použita v kryptě funkce. A tady vidíme, že sůl byla ha. Takže chceme zkopírovat první dvě znaky, sůl délka je hash definována jako dvě. Musíme zkopírujte první dva znaky do tohoto pole, sůl. Všimněte si, že potřebujeme sůl délku a jeden, protože stále potřebujeme null zakončení na konci našeho soli. Pak budeme deklarovat toto pole, host, délky a velikosti max. jeden, kde maximální délka je definována hash osmi let, protože maximální heslo je osm znaků dlouhé. A budeme se použít k iteraci přes všechny možné řetězce, které by mohly být platné hesla. Takže pokud platné znaky hesla byly jen a, b, a c, pak bychom iteraci, b, c, aa, ba, CA, a tak dále, dokud dostaneme vidět cccccccc - C je osm. A pokud nemáme dolů platný heslo, pak musíme říci, že šifrovaný řetězec nebyl platné začít. Takže teď se dostáváme to, když jeden smyčka. Všimněte si, že znamená, že je nekonečná smyčka. Všimněte si, že nejsou break v této nekonečné smyčky. Jsou vrátit pouze prohlášení. Takže jsme vlastně nikdy očekávat, k opuštění smyčky. Máme jen očekávat, že program ukončete. Přidal jsem tento tiskový prohlášení Vrchol této smyčky jen vytisknout co náš současný odhad na co je heslo. A teď, co je tato smyčka dělá? Je to opakování přes všechny možné řetězce které by mohly být platné hesla. První věc, kterou budeme dělat, je se náš současný odhad pro to, co heslo. Vezmeme sůl, která se chytil od šifrované řetězce, a my jsme bude k zašifrování odhad. To nám šifrované odhad, které budeme srovnávat proti šifrované řetězec, který uživatel zadané na příkazovém řádku. Pokud jsou stejné, v tom případě string srovnatelné vrátí nulu, pokud jsou stejné, pak asi byl heslo, které generuje šifrovaný řetězec, v tom případě můžeme vytisknout že jako naše heslo a zpět. Ale kdyby nebyly stejné, že znamená, že náš odhad byl správný. A chceme, aby iteraci další platné odhad. Takže to je to, co to při smyčka se snaží dělat. Bude to náš odhad iteraci na další platné odhad. Všimněte si, že když říkáme, že zvláštní charakter v našem odhadu má dosáhl symbol Max, který se zde je definován jako hash vlnovkou, protože to je největší hodnota ASCII znak že uživatel může zadat na klávesnice, když charakter dosáhne max. symbol, pak chceme poslat zpět na minimální symbol, který Je to prostor, opět nejnižší ASCII hodnota symbol, který může uživatel zadejte na klávesnici. Takže budeme nastavit, aby se minimální symbolu. A pak jsme se chystáte jít na další znak. Tak, jak jsou naše odhady bude přecházet? No, v případě, že jsou platné znaky a, b, a c, pak, pokud jsme začali s, to bude přecházet do B, bude to iterovat až c. c je náš max. symbol, takže budeme nastavit c zpět k, minimální symbol. A pak budeme iterovat index na další znak. Takže v případě, že původní odhad byl c, další znak bude null terminátor. Tady dole si všimněte, že pokud charakter že nyní chceme přírůstek byl null terminátor pak budeme nastavit tak, aby Minimální symbol. Takže v případě, že odhad byl, c, pak se naše Nový odhad bude aa. A když náš původní odhad byl CCCC, pak náš nový odhad bude aaaaa. Takže když dosáhnete maximálního řetězec dané délky, pak jsme bude provádět minimální řetězec dalšího délky, který bude jen se všechny znaky minimální symbol. A teď, co je tato kontrola dělá? No, když index pohyboval od osmé znak devíti charakteru - tak přidáme osm C je jako naše předchozí hádat - pak index bude soustředit na poslední null terminátor našeho odhadu pole, které nejsou určeny pro praktické Pro použití v naší heslo. Takže pokud se zaměřujeme na té poslední null terminator, pak jsme nenašli heslo, které je platné pouze pomocí osmi znaky, což znamená, že není žádný platné heslo, které šifruje na daný řetězec. A máme k tisku, že říká, jsme nemohli najít platný heslo a návrat. Tak to while bude iterovat přes všechny možné řetězce. Pokud zjistí, všechny změny, které šifruje na Očekává šifrované řetězec, bude to návrat toto heslo. A to, že nic nenajde, pak vrátí, tisk, že nebyl schopen najít nic. Nyní si všimněte, že iterace přes všechny Možné řetězce se pravděpodobně bude chvíli trvat. Pojďme se podívat, jak vlastně dlouho to trvá. Pojďme udělat trhlinu. No, jejda - říká definováno odkaz na krypty. Takže pamatujte, že pro p sady spec a i manuálové stránky pro kryptě, že jsme třeba propojit do krypty. Nyní, výchozí příkaz make neví, že jste chcete použít tuto funkci. Takže pojďme zkopírujte tento příkaz klienta a stačí přidat na konec o tom, propojení krypta. Nyní je sestavuje. Takže pojďme spustit prasklinu na daný šifrovaný řetězec - tak Císařův. Takže to bylo docela rychle. Všimněte si, že to skončilo na 13 let. No, Caesarův zašifrované heslo se stane, že je 13. Takže pojďme zkusit zadat jiné heslo. Pojďme se Hirschhorn je šifrována heslo a zkuste to praskání, že. Takže oznámení jsme již dosáhli tři znaky. A my iterace přes všechny možné tři znakové řetězce. To znamená, že už jsme se dokončit iterace přes všechny možné jednu a dva znakové řetězce. Teď to vypadá, že to bude chvíli trvat, než se dostaneme čtyři řetězce znaků. To může trvat několik minut. Netrvalo pár minut. Jsme na čtyři znakových řetězců. Ale teď se musíme iterovat přes všechny Možné čtyři řetězce znaků, které že může trvat možná 10 minut. A pak, když se dostaneme pět charakter řetězce, musíme iterovat přes všechny z těch, které by mohly trvat několik hodin. A musíme iterovat přes všechny možné šest-znakové řetězce, které může trvat pár dní, a tak dále. Takže to může trvat potenciálně velmi dlouhý čas k iteraci přes všechny možné osmimístné a méně řetězců. Všimněte si, že tak, ale to není nezbytně velmi efektivní algoritmus pro hledání heslo. Můžete si myslet, že existuje jsou lepší způsoby. Například heslo ZYX! 32ab asi není velmi časté heslo zatímco heslo je 12345 pravděpodobně mnohem častější. Takže jeden způsob, jak se snaží najít heslo rychleji je jen dívat na hesla, která jsou častější. Tak například, můžeme se pokusit číst slova ze slovníku a vyzkoušeli všechny tato slova jako naše heslo hádá. Nyní, možná heslo není to tak jednoduché. Možná, že uživatel byl poněkud chytrá a zkuste připojením číslo konec slova. Takže možná své heslo bylo password1. Takže si můžete vyzkoušet iterace všechna slova ve slovníku s jedním připojena na konec. A pak možná po tom to, že budete připojit dva na konci. Nebo možná se uživatel pokouší být ještě chytřejší, a chtějí, aby jejich heslo, které "hacker", ale jsou chystá nahradit všechny výskyty ŽP s trojek. Takže byste mohli udělat to taky. Iterovat přes všechna slova ve slovníku ale nahradit znaky, které Vypadají jako čísla s těmito čísly. Takže tímto způsobem, můžete zachytit i více hesla, která jsou docela běžné. Ale na konci, jediný způsob, jak můžete zachytit všechna hesla je hovado nutí iterovat přes všechny Možné řetězce. Takže nakonec, vy potřebujete iterovat přes všechny struny z jednoho znaku na osm znaků, které může trvat velmi dlouhá doba, ale musíte to udělat. Jmenuji se Rob Bowden. A to je Crack.