>> 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.