Pokazywanie postów oznaczonych etykietą C. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą C. Pokaż wszystkie posty

czwartek, 5 lutego 2009

Dlaczego Python? - czyli "programowanie z klocków" :)

Dlaczego w Pythonie pisze się tak łatwo szybko i przyjemnie?

Jedną z zalet Pythona jest super prosta składnia, która pozwala pisać bardzo zwięzły kod. Pamiętam taki argument: dlaczego znaki {, } w C są lepsze niż begin i end Pascala? - bo pozawalają każdorazowo zaoszczędzić 6 znaków :) Idąc tą drogą można napisać, że Python jest lepszy na przykład od Javy, bo oszczędza jeszcze te 2 znaki :)

Wymuszanie wcięć w kodzie skutkuje dobrymi nawykami - dotyczy to przede wszystkim początkujących programistów. Ale ma też swoje wady: trudniej jest przenieść fragment kodu na przykład do innej klasy, a zmiana głębokości wcięcia zazwyczaj zmienia działanie fragmentu kodu.
Python jest w pełni obiektowy, ale nic nie stoi na przeszkodzie, żeby pisać w nim strukturalnie - co kto lubi. A znam takie języki w których można pisać tylko i wyłącznie obiektowo ( żeby wypisać 'Hello World' na ekran trzeba napisać klasę, lol).

Spotkałem się z argumentem, że Python jest wolny. Jak na język skryptowy nie jest wcale taki wolny, choć porównywanie jego szybkości z C++ nie ma raczej sensu.

Przede wszystkim pisanie programów w Pythonie przypomina budowanie go z klocków - gotowych komponentów. Biblioteki tego języka w większości napisane są w czystym C dzięki czemu musi on być szybki.
Jak wiadomo, jest to język skryptowy tak jak Perl, PHP, Ruby czy wiele innych, wirtualna maszyna potrafi skonwertować sobie skrypcik do bytecode'u, a wszysto po to żeby działał czybciej.

Jednym z argumentów przemawiających za tym żeby uczyć/nauczyć się pythona jest fakt, że używa go Google( tylko mi nie mówcie: " ja używam Yahoo albo wyszukiwarki onetu" :) ) i NASA.

Każdy język programowania ma swoje zastosowanie, jednakże pole potencjalnego wykorzystania Pythona jest ogromne: począwszy od aplikacji webowych, a skończywszy na obliczeniach( w Pythonie nie ma zakresu liczb!!!, jedynym ograniczeniem jest fizyczna wielkość zasobów Twojego komputera). No może z wyjątkiem gier..., chociaż jest w końcu Pygame, VPython czy Ogre... :)

Ponadto łatwa konwersja typów, listy i kroki, a wszystko po to by ułatwić życie programiści.

Zresztą w sieci pojawia się wiele porównać typu C++ vs Java vs Python, w których nie wiedzieć czemu ;) Python zawsze wygrywa.

piątek, 8 lutego 2008

Łamanie haseł - algorytmy brute force

Techniki brute force są najskuteczniejsze nie ze względu na wymyślne algorytmy, ale ze względu na prostotę działania. Schemat sprowadza się zawsze do tej samej metody którą można opisać dokładnie jednym zdaniem: "znajdź rozwiązanie sprawdzając kolejne możliwości(kombinacje)". Oczywiście algorytm można przerwać w momencie znalezienia rozwiązania, no chyba, że oczekujemy więcej poprawnych rozwiązań.

Może warto odwołać sie do jakiegoś przykładu. Niech to będzie łamanie hasła zaszyfrowanego archiwum RAR. Załóżmy, że mamy do dyspozycji program unrar (unrar.exe w środowisku za którym nie przepadam :) ) dowolny kompilator języka C( cc, gcc), bash lub dowolny język skryptowy z którego można wywoływać polecenia zewnętrzne.

Schemat działania jest prosty:

1) Definiujemy tablice znaków char tablica_znaków[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

2) Piszemy podprogram do generowania wszystkich możliwych wariacji z powtórzeniami ze znaków tablicy zadeklarowanej w punkcie (1), oczywiście wariacje muszą mieć długość od 1 do length(tablica_znaków[])

3) W pętli odpalamy unrara tj. unrar nazwa_archiwum.rar i-ta_kombinacja

Cóż, wydawać by sie mogło nic trudnego; jedyna rzecz która psuje całą zabawę to czas jaki zajmie sprawdzenie wszyskich możliwości.
Jeśli hasło ma 3 znaki( ilość możliwości = length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) * length(tablica_znaków[]) ) czas oczekiwania na odpowiedz jest w granicach naszych oczekiwań. W przypadku dłuższego hasła potrwa to o wiele, wiele dłużej (przyrost jest wykładniczy). Nawet wspomaganie sie dzieleniem zadań na wątki niewiele sie przyda w kontekście zysku czasowego.

Można oczywiści zawęzić alfabet, jeśli wiemy, że jakiś znaków na pewno nie zawiera hasło lub stosować dodatkowe algorytmy heurystyczne( np. zakładać że między spółgłoskami musi znajdować sie samogłoska) , ale wtedy istnieje prawdopodobieństwo, że nie znajdziemy hasła.

Mimo wszystko czasami warto próbować brute-for'ca, w końcu nie wszystkich chce sie wpisywać długie i wymyślnme hasła.... a nuż sie uda.