Ve skole jsme dostali za ukol dostat se do fiktivniho trezoru, ktery ja na me jmeno. Heslo je 9 mistny a je slozeno jen z velkych a malych pismen. Me by jen zajimalo jestli jde to heslo zjistit rychleji nez to tam pomoci programu zkouset hrubou silou.
Piste mi prosim jen navrhy, nechci abyste za me psali muj ukol. :)
Fórum › Java
Prolomeni hesla
Můžeš na ten trezor zkusit kouzelné slovíčko nebo ho rozmlátit a heslo si z něj přečíst :)
Teď vážně. Jakým způsobem můžeš s tím trezorem interagovat? Pokud jediná možnost je vložit heslo a dozvědět se, jestli se otevřel, pak samozřejmě nejde nic jiného než zkoušet všechny možnosti (anebo heslo dostat z učitele).
S úkolem jsem také obeznámen a i přes největší optimalizaci, které jsem byl schopen dosáhnout by zpracování všech kombinací klíče trvalo 4,5 roku. Trochu to ve mě budí podezření, že musí být jiný cesta než brute force útok :-)
Začíná mě to zajímat. Bylo by možné sem dát kompletní zadání se vším všudy? Rád bych se na to podíval. (To neznamená, že tady pak chci zveřejnit kompletní řešení. Jsem jen zvědavý)
A ten trezor je v jaké podobě? Dotazuješ se serveru na netu, nebo je to metoda z nějaké knihovny?
To petr.satka : Ten trezor co mam otevrit mam stazeny a pridany mezi knihovnami v projektu. Hele ja vam klidne pak to sem soupnu, ale az po 20.11.2010. To mam deadline na prolomeni :D Aby nahodou muj profesor na to tady nenarazil a pak bych byl trochu v riti.
Hele já myslím že bruteforce taky nebude správnej přístup protože na mém procesoru by to trvalo zhruba 8 let (2,2GHz, java, algoritmus vytvořený pouze ad hoc nedodržující ani zásadu obecnosti algoritmu)Podle mě i kdyby jsi to přetáhl přes CUDA (a měl nějakou QudroSLI sestavu samé Geforce480) tak by jsi se pod půl roku nedostal (jen spekuluji). Pokud ovšem nemáte ve škole superpočítač... :D
Tak jsem se hluboce zamyslel a napadla mě jedna metoda. Pokud open(klic) funguje podobně, nebo stejně jako String.equals() (což se dá předpokládat), tak by se dalo heslo odhalit celkem snadno. Nejdřív rozeberu jak pracuje String.equals().
String.equals() - Po zavolání proběhne nějaký konstantní počet porovnání (délka, hash objektu, null...) a pak se začnou porovnávat řetězce znak po znaku. Nejdřív první znak, pak druhý... jakmile se najde rozdíl, vrací se false.
Jak toho využít?
Pokud se řetězce liší v prvním znaku, provede se n porovnání, pokud ve druhém, musí se provést n+1, ve třetím n+2... Více porovnání zabere více času.
Pokud tedy budeme měnit první znak hesla a kontrolovat dobu potřebnou pro kontrolu hesla, můžeme podle doby odezvy zjistit, zda jsme uhodli první znak. Jakmile uhodneme první znak, jdeme na další. Vyhodnocování je samozřejmě strašně rychlé, proto je třeba provést více vyhodnocení se stejným řetězcem a eliminovat co nejvíce vnějších vlivů (ostatní aplikace, řízení spotřeby procesoru...).
Zkoušel jsem to na tomto kousku kódu a zdá se, že by to mohlo fungovat.
Kód jsem odstranil. Uvědomil jsem si, že tazatel nechtěl abychom mu psali úkol. Byla to až moc velká nápověda.
Tajné heslo je HAAAAAAAA, já hledám první písmeno hesla xBBBBBBBB. Jakmile bude x=H, musí se provést o jedno porovnání (krát počet testů) navíc a to se projeví v rozdílu v časech.
TESTOVANÉHESLO:CELKOVÝČAS (ns)
run:
ABBBBBBBB:3711976522
BBBBBBBBB:3796328304
CBBBBBBBB:3665792719
DBBBBBBBB:3619251888
EBBBBBBBB:3638235307
FBBBBBBBB:3668465965
GBBBBBBBB:3633702887
HBBBBBBBB:4946703841 //Delší čas
IBBBBBBBB:3606229563
JBBBBBBBB:3621930999
KBBBBBBBB:3644098622
LBBBBBBBB:3614445691
MBBBBBBBB:3610919265
NBBBBBBBB:3619050186
OBBBBBBBB:3642345605
PBBBBBBBB:3612770617
QBBBBBBBB:3652674293
RBBBBBBBB:3616460192
SBBBBBBBB:3652207194
TBBBBBBBB:3630947229
UBBBBBBBB:3614244268
VBBBBBBBB:3620968308
WBBBBBBBB:3645710837
XBBBBBBBB:3613180446
YBBBBBBBB:3615456434
ZBBBBBBBB:3613444726
BUILD SUCCESSFUL (total time: 1 minute 36 seconds)
Za necelé dvě minuty jsem na Pentiu M získal první písmeno hesla. Vaše heslo může obsahovat ještě malá písmena, takže by to trvalo dvakrát déle, ale pořád je to fofr. Pro zmatení nepřítele může open(klic) porovnávat řetězce obráceně, nebo může vkládat náhodnou prodlevu, ale za pokus to stojí.
To petr.satka : nápad to je velmi dobrý, bohužel nelze použít na náš trezor. Po dekompilaci trezoru jsem zjistil, že heslo je ověřováno metodou, která tento postup znemožňuje. Nejprve jsou všechny znaky předané trezoru převedeny na čísla, která jsou přičtena k proměnné a teprve poté se porovnává, zda má daná proměnná správnou hodnotu. Zpracování každého klíče trvá tedy zhruba stejně dlouhou dobu.
Pozn.: své heslo sice již znám, ale jak jsem říkal výše - dekompilace nebude ta správná cesta.
a uz si teda zkousel, kolik zvladnes testu za 1s ?
pokud to nevytezuje 100% procesoru tak muzes pouzit i vic vlaken..
nebo sem hod ten kod jak se to vypocitava..
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Prolomení hesla java — založil LLiky
Prolomení hesla=zdhlouhavé! — založil John
Bezpečnost - prolomení C.A.P.T.C.H.A. — založil DragonBehemont
Prolomení instalačního kódu — založil spider-x
Prolomení Vigénerovy šifry — založil yaqwsx
Moderátoři diskuze