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