====== Lab04 - Lámání hesel ====== {{:courses:b0b36pjv:hw:pjv-lab04.zip|Template domácího úkolu je ZDE}} Povedl se Vám nečekaně cenný úlovek - získali jste do rukou zadání testů z PJV. Bohužel, tyto testy jsou uzavřeny v sejfu s elektronickým zámkem. K tomuto zámku dokážete připojit svůj počítač, pomocí kterého můžete zkoušet různá hesla. Jednou z metod prolamování hesel je intuitivní tzv. [[http://en.wikipedia.org/wiki/Brute-force_attack|brute force attack]], tedy útok hrubou silou. Při této metodě útočník zkouší postupně všechny možné kombinace znaků, dokud neuhodne heslo. Domácí úkol sestává ze tříd ''Test, Thief a BruteForceAttacker''. Vy budete pracovat pouze se třídou ''BruteForceAttacker''. Zde doplňte kód do metody ''public void breakPassword(int sizeOfPassword)'', který se pokusí prolomit heslo o délce ''sizeOfPassword'' (heslo je dlouhé přesně zadaný počet znaků, tedy ani kratší ani delší). K dispozici máte následující metody: * ''char[] getCharacters()'' tato metoda vrací seznam znaků z jejichž podmnožiny je složeno heslo * ''boolean tryOpen(char[] password)'' tato metoda zkusí otevřít sejf. Pokud se podaří vypíše hlášku a vrací ''true'', jinak ''false''. Jakmile je sejf otevřen, již není třeba se snažit dále. Navíc, pokud budete dále zkoušet jiná hesla, sejf se opět zamkne. Téma cvičení - rekurze - vám napovídá, že tento úkol je **povinné** řešit pomocí rekurze ;-). Nicméně, je dost možné, že metoda ''void breakPassword(int sizeOfPassword)'' nebude rekurzivní a bude volat jinou metodu, která již rekurzivní bude. Váš algoritmus si můžete otestovat. Viz kód ve třídě ''Test.java''. V tomto kódu se sejf nastaví na heslo ''abcdaaaddb'' a množina znaků na ''{'a', 'b', 'c', 'd'}''. Podle tohoto vzoru si můžete vyzkoušet i jiná hesla. Do [[https://cw.felk.cvut.cz/upload/secure/umain.phtml|Upload Systemu]] nahrávejte soubor ''BruteForceAttacker.java'' (zabalený v archivu), který obsahuje vaše řešení.