\title{Łamanie hasła zakodowanego funkcją skrótu SHA-1 za pomocą algorytmu siłowego wykorzystując środowisko MPI.
\title{Łamanie hasła zakodowanego funkcją skrótu SHA-1 za pomocą algorytmu siłowego wykorzystując środowisko MPI.
}
}
\section*{Opis projektu}
\section{Opis projektu}
Celem projektu było zaimplementowanie programu pozwalającego na załamanie hashu sha1. Zastosowano metodę typu brute force. Zrównoleglenia programu dokonano za pomocą MPI. Program uruchomiono na klasterze komputerowym składającym się z X węzłów.
Celem projektu było zaimplementowanie programu pozwalającego na załamanie hashu sha1. Zastosowano metodę typu brute force. Zrównoleglenia programu dokonano za pomocą MPI. Program uruchomiono na klasterze komputerowym składającym się z 13 węzłów.
\section*{Algorytm brute force }
\section{Algorytm brute force }
Algorytm brute force, inaczej algorytm siłowy. Ten algorytm opiera się na sukcesywnym sprawdzaniu wszystkich możliwych kombinacji w poszukiwaniu rozwiązania problemu. Nie skupia się na jego szczegółowej analizie. Zwykle jest to nieoptymalna metoda, jednak jst prosta w do zaimplementowania. Teoretycznie pozwala ona złamać każde hasło. praktycznie, w zależności od skomplikowania hasła, może to być bardzo długi czas (np. dłuższy niż istnieje Wszechświat). W zależności od kontekstu, w którym termin brute force zostaje użyty, może mieć on nieznacznie różne definicje. Meoda brute-force może być przeprowadzony wobec prawie wszystkich szyfrów symetrycznych i szyfrów asymetrycznych.
Algorytm brute force, inaczej algorytm siłowy. Ten algorytm opiera się na sukcesywnym sprawdzaniu wszystkich możliwych kombinacji w poszukiwaniu rozwiązania problemu. Nie skupia się na jego szczegółowej analizie. Zwykle jest to nieoptymalna metoda, jednak jst prosta w do zaimplementowania. Teoretycznie pozwala ona złamać każde hasło. praktycznie, w zależności od skomplikowania hasła, może to być bardzo długi czas (np. dłuższy niż istnieje Wszechświat). W zależności od kontekstu, w którym termin brute force zostaje użyty, może mieć on nieznacznie różne definicje. Meoda brute-force może być przeprowadzony wobec prawie wszystkich szyfrów symetrycznych i szyfrów asymetrycznych.
\section*{SHA-1}
\section{SHA-1}
SHA-1 (Secure Hash Algorithm) jest jednokierunkową funkcją hashującą zaprojektowaną przez National Security Agency (NSA) i opublikowaną przez National Institute of Standards and Technology (NIST. Wytwarza ona skrót o długości 160 bitów z wiadomości o dowolnym rozmiarze, nie większym niż pow(2,64) bitów. Funkcja SHA-1 jest
SHA-1 (Secure Hash Algorithm) jest jednokierunkową funkcją hashującą zaprojektowaną przez National Security Agency (NSA) i opublikowaną przez National Institute of Standards and Technology (NIST. Wytwarza ona skrót o długości 160 bitów z wiadomości o dowolnym rozmiarze, nie większym niż pow(2,64) bitów. Funkcja SHA-1 jest
oparta na zasadach podobnych, do użytych przez profesora Ronalda L. Rivesta z MIT przy projektowaniu funkcji hashujących MD4 i MD5, i w znacznym stopniu naśladuje te algorytmy. Oryginalna specyfikacja tego algorytmu została opublikowana w 1993 roku jako Secure Hash Standard, FIPS PUB 180. Ta wersja jest teraz często nazywana jako SHA-0. Była ona wycofana przez NSA krótko po publikacji i zastąpiona przez poprawioną wersję
oparta na zasadach podobnych, do użytych przez profesora Ronalda L. Rivesta z MIT przy projektowaniu funkcji hashujących MD4 i MD5, i w znacznym stopniu naśladuje te algorytmy. Oryginalna specyfikacja tego algorytmu została opublikowana w 1993 roku jako Secure Hash Standard, FIPS PUB 180. Ta wersja jest teraz często nazywana jako SHA-0. Była ona wycofana przez NSA krótko po publikacji i zastąpiona przez poprawioną wersję
opublikowaną w 1995 roku w FIPS PUB 180-1 i nazwaną SHA-1.
opublikowaną w 1995 roku w FIPS PUB 180-1 i nazwaną SHA-1.
@ -195,11 +195,33 @@ Zaletami MPI nad starszymi bibliotekami przekazywania wiadomości są przenośno
Standard nie zabrania, aby poszczególne procesy były wielowątkowe. Nie są też udostępnione mechanizmy związane z rozłożeniem obciążenia pomiędzy poszczególne procesy, z architekturą rozkładu procesorów, z dynamicznym tworzeniem i usuwaniem procesów. Procesy są identyfikowane poprzez ich numer w grupie w zakresie od 0 do groupsize – 1.
Standard nie zabrania, aby poszczególne procesy były wielowątkowe. Nie są też udostępnione mechanizmy związane z rozłożeniem obciążenia pomiędzy poszczególne procesy, z architekturą rozkładu procesorów, z dynamicznym tworzeniem i usuwaniem procesów. Procesy są identyfikowane poprzez ich numer w grupie w zakresie od 0 do groupsize – 1.
\section*{Opis klastra}
\section*{Opis programu}
Program został napisany w języku c++. Wykorzystana implementacja MPI to MPICH2.
Zastosowany w programie algorytm jest algorytmem siłowym. Najpierw generuje hasło, potem oblicza z niego sha1 i porównuje z hashem podanym jako argument programu. Gdy są takie same program wypisuje hasło oraz czas obliczeń. Jeśli nie są zgodne wtedy próbuje szczęścia z kolejnym hasłem. Dla potrzeb tego projektu dokonano kilku założeń dotyczących hasła:
\section{Opis klastra}
Program został uruchomiony na klastrze komputerowym składającym się z 13 wezłów i w sumie dysponującym 48 rdzeniami. W tabeli 1. przedstawiono dokładną konfigurację klastra.
Program został napisany w języku c++. Wykorzystana implementacja MPI to MPICH2. Zastosowany w programie algorytm jest algorytmem siłowym. Najpierw generuje hasło, potem oblicza z niego sha1 i porównuje z hashem podanym jako argument programu. Gdy są takie same program wypisuje hasło oraz czas obliczeń. Jeśli nie są zgodne wtedy próbuje szczęścia z kolejnym hasłem. Dla potrzeb tego projektu dokonano kilku założeń dotyczących hasła:
\begin{lista}
\begin{lista}
\item Hasło może mieć długość od 2 do 10 znaków.
\item Hasło może mieć długość od 2 do 10 znaków.
@ -215,10 +237,75 @@ W programie istnieje pewnego rodzaju ograniczenie co do ilości znaków z który
Funkcja generująca hash SHA-1 została zaimplementowana przez autorów. W stopniu na jaki pozwalały umiejętność autorów została również zoptymalizowana pod katem jak najszybszego wykonania.
Funkcja generująca hash SHA-1 została zaimplementowana przez autorów. W stopniu na jaki pozwalały umiejętność autorów została również zoptymalizowana pod katem jak najszybszego wykonania.
\section*{Wyniki}
\section{Wyniki}
Program testowano na dwóch hasłach 3 znakowych oraz dwóch hasłach 5-cio znakowych. Wykresy (Rysunek 2. do 9.) przedstawiają uzyskane wyniki. Można na nich zauważać, że wzrost przyspieszenia uzyskuje się tylko do momentu gdy liczba procesów jest mniejsza lub równa ilości fizycznych rdzeni. Powyżej 48 rdzeni następuje już przetwarzanie współbieżne, co powoduje duże wahania w czasie obliczeń.
Mało równomierny wzrost przyspieszenia można wytłumaczyć tym że w pewnych przypadkach podziału hashy do obliczenia proces może szybciej natrafić na rozwiązanie. Obrazuje to Rysunek 1. W przypadku podziału na 3 cześć rozwiązanie jest znajdowane już w pierwszej iteracji. Przy podziale na 4 każdy proces ma mniej do zadań ale rozwiązanie będzie dopiero w ostatniej iteracji.
\caption{Wykres przyspieszenia od ilości procesów dla hasła 5 znakowego nr 2}
\label{fig:figure2}
\end{figure}
\section*{Podsumowanie}
Łamanie haseł metodą siłową i przy użyciu MPI jest możliwe. Wymaga to jednak dużej mocy obliczeniowej. Czas potrzebny do złamania hasha rośnie wykładniczo w stosunku do długości hasła.