4/15/2012

Analizator haseł v0.1 [C++]

W ramach doskonalenia skilla z programowania w C++, postanowiłem stworzyć coś użytecznego. Po krótkim przemyśleniu, postanowiłem skodzić analizator haseł.
Cały program, zbudowany został na funkcjach. Oblicza on według podanych wytycznych ilość punktów zdobytych za wpisane hasło. Pod ocenę brane są przede wszystkim - długość hasła i użyte znaki oraz ich ilość.

Skompilowany *.exe i kod źródłowy, dostępne są na serwerze.

Myślałem o stworzeniu artykułu, opisującego cały kod Analizatora. Mam nadzieję że w ciągu dwóch tygodnii uda mi się go stworzyć ;)

Pzdr.

9 komentarzy:

  1. myślisz ze jest sens opisywac kod przy takiej ilości komentarzy? :D

    OdpowiedzUsuń
  2. Tak :P - wychodzę z założenia że początkująca osoba bardzo dużo by skorzystała na takim artykule :)

    OdpowiedzUsuń
  3. Proponowałbym lekką zmianę podejścia do tego problemu.
    Zupełnie bezsensowne jest w każdej funkcji wykonywanie tej samej pętli od nowa.
    W prawdzie w tym przypadku wszystko działa ekspresowo, ale przy bardziej skomplikowanych zadaniach coś takiego może widocznie spowolnić program. Warto uczyć się dobrych nawyków od początku ;)
    Jeżeli chcesz koniecznie mieć analizę poszczególnych parametrów w osobnych funkcjach to proponuje do tych funkcji przekazywać tylko 1 znak, i te wszystkie funkcje wywoływać w jednej wspólnej pętli.

    OdpowiedzUsuń
  4. @Up: Hmm... to nie jest głupi pomysł. Aczkolwiek to jest dopiero mój pierwszy, samodzielnie napisany program w C++. Dlatego też zastosowane tutaj pomysły są takie proste i banalne. Mam nadzieję że w miarę dalszego zdobywania nowego doświadczenia i pielęgnowania umiejętności - będą mógł poprzez nawyki o których mówisz - tworzyć jeszcze lepszy kod :)

    Bardzo dziekuję za cenne wskazówki :)

    OdpowiedzUsuń
  5. O mój Boże :)

    Zalety kodu:
    - Dużo komentarzy i dwa rodzaje, do różnych zastosowań, dobry nawyk.
    - W miarę sensownie stylistycznie

    A takie drobnostki, które nic nie znaczą, a warto wiedzieć :) Muszę trochę się popastwić ;> Kolega wyżej skupił się na samym algorytmie, ja poszukałem detali :) Z drugiej strony nie zwrócił uwagi na fakt, że wywołanie funkcji również trwa. Więc dla hasła 30 znakowego będzie 30 wywołań * ilość funkcji. Trzeba by pomyśleć nad czymś innym albo funkcjami inline :)

    1. Przesyłaj tablicę przez wskaźnik, ewentualnie przez referencję. Inaczej niepotrzebnie kopiujesz całą tablicę.
    2. int strong(char tab[4096]) lub prościej int strong(char tab[]), pierwszy rozmiar tablicy nie bierze udziału w obliczaniu odległości danego elementu od początku tablicy.
    3. << endl; powoduje wyrzucenie bufora na ekran, to trochę zajmuje, w przeciwieństwie do znaku nowej linii '\n'. Co prawda optymalizacja tyle co kot napłakał, ale zawsze. (Pod koniec można dać endl, żeby wypisało wszystko tak jak chcemy).
    4. #include
    #pragma hdrstop
    #pragma argsused

    Makra borlanda widzę, i jego bibliotekę. Hm... Zdajesz sobie sprawę, że wcale nie używasz tej biblioteki :P? Nie potrzebnie tworzyłeś projekt z tą biblioteką. Bulider, zapewne wersja 2006. Polecam Visual Studio C++ 2008/2010(genialne, genialny debugger, darmowy do zastosowań komercyjnych), lub Geany na Linuksa i g++ :P.

    5. (char)tab[i] to rzutowanie w c-stylu, lepsze (i jak profesjonalnie wygląda) rzutowanie w C++ static_cast(tab[i]). Na wiki są opisane wszystkie 4 rodzaje rzutowania. Co prawda rzutowanie w c-stylu jest poprawne jednak czasami może powodować błąd ciężki do znalezienia. Warto stosować profilaktycznie, albo wyryć na pamięć kiedy jest obowiązkowe rzutowanie lepsze :D

    6. Program obsługuje Unicode :P? Sprawdź co to są lokalki w strumieniach oraz w_char. Podałem mnóstwo polskich znaków i hasło było słabsze niż jakbym pisał zwykłymi literami :)

    7. W C++ nowe nagłówki bibliotek standardowych pisze się bez .h, aby odróżnić je od starych wersji
    np.
    #include // iostream.h
    #include // time.h

    Powyższy zapis biblioteki iostream wymaga później dodania przestrzeni nazw. using namespace std; lub pisania przed obiektami jak cout przestrzeni nazw std::.

    8. Standardowa rzecz, co jeśli użytkownik wpisze ponad 4096 znaków. No pierwsze pytanie, kto normalny ma takie długie hasło? Nikt. Ale dzięki właśnie takim rzeczom, jak ograniczenie tablicy, kiedyś można było przekręcić licznik int-a w Windows Messenger pseudonimu o długości 65 535 znaków (zakres unsigned short) :) I tutaj polecam std::string.

    Dlaczego piszę o tych detalach, przecież program działa. Ale wiem kto Cię uczy programowania ;)
    Dlatego nie napisałem tylko o tym, co jest na teraz, bo obsługę std::stringa na pewno będziesz na programowaniu miał, ale tak wyprzedzam fakty :)

    I jeszcze jedna zaleta, wielka zaleta o której nie pisałem na początku, żeby nie zapeszyć.

    Gratulacje, że ruszyłeś temat i zrobiłeś coś samemu! Wartości tego już się nie da oszacować, ani rzutować na int :)

    Jakbyś kiedyś coś pisał i był w ślepym zaułku albo miał drobny problem, to pisz na facebooku do mnie, albo załóż temacik na cpp0x.pl

    OdpowiedzUsuń
    Odpowiedzi
    1. Oh tak, HTML wciął mi to co było po #include :)

      #include <iostream> // iostream.h
      #include <ctime> // time.h

      Usuń
  6. Prawie wszystko zostało już napisane, od siebie dodam, że w oczy kłuje ten fragment:
    cout << "Zdobyles: " << analysis(tab) << " punktow."<< endl;
    cout << "Wynik procentowy - " << strong(tab) << "%" << endl;
    Funkcja strong() wywołuje funkcję analysis(), w tym przypadku podwajasz czas działania programu - zapisz wynik analysis do zmiennej, a później przekaż ten wynik do funkcji strong.
    Pozdrawiam!

    OdpowiedzUsuń
  7. Kamil & Peter - dzięki wielkie za cenne rady :) - na pewno będę dzięki nim rozwijał analizatora ;>

    OdpowiedzUsuń
    Odpowiedzi
    1. Ale poszerz też funkcjonalność :) Proponuje obliczanie czasu złamania hasała atakiem bruteforce w zależności od wyboru zestawu znaków czyli np. wersja optymistyczna(tylko potrzebne znaki) i pesymistyczna (wszystkie możliwe). Są na internecie takie strony "Sprawdź ile zajmie złamanie Twojego hasła", na pewno gdzieś będzie algorytm. A jest to fajny feature :D

      // KP, pisze ze szkoły wiec nie loguje się nawet na konto :)

      Usuń

Zastrzegam sobie możliwość usuwania komentarzy, które nie są zbytnio konstruktywne pod względem merytorycznym.