Korzystanie z programu Gnu Privacy Guard Spis treści 1. Szyfrowanie informacji...2 2. Idea pary kluczy publicznego i prywatnego...2 3. Standard OpenPGP i jego implementacje...3 4. Instalacja GnuPG i narzędzi wspomagających...3 5. Generowanie kluczy...5 6. Eksportowanie oraz importowanie kluczy...8 7. Podpisywanie i weryfikacja...15 8. Szyfrowanie i deszyfrowanie...20 9. Sieć zaufania (web of trust)...22 10. Bibliografia...23 1
1. Szyfrowanie informacji JuŜ 100 lat p.n.e. powstały pierwsze pomysły na bezpieczną wymianę informacji. Jeden z pierwszych szyfrów został stworzony przez Juliusza Cezara. Opierał się na prostej idei przesuwania znaków o 3 pozycje. Np. znak 'a' był zapisywany jako 'd', 'b' jako 'e', 'z' jako 'b' itd. Oto jak wyglądałaby zaszyfrowany słynny cytat Juliusza Cezara: Postać oryginalna: Veni Vidi Vici Postać zaszyfrowana: Yhql Ylgl Ylfl Aby odszyfrować tak zakodowaną wiadomość naleŝy znać klucz jakim była szyfrowana i wykonać działania odwrotne. Szyfrując uŝywano przesunięcia o 3 znaki w prawo, więc deszyfrowanie odbywałoby się przesuwając kaŝdy znak o 3 pozycje w lewo. Taki algorytm nazywany jest w kryptografii szyfrowaniem symetrycznym. Deszyfrowanie polega na odwróceniu działań wykonanych podczas szyfrowania stosując ten sam klucz. W przypadku szyfru Cezara kluczem była liczba 3. Co ciekawe szyfr Cezara moŝe dawać wyniki zupełnie odmienne od oczekiwanych, przykładowo zaszyfrowanie kluczem o wartości 13 łańcucha hejnal urwany da w wyniku łańcuch urwany hejnal. Oczywiście szyfr przesuwający zostanie złamany w ciągu ułamków sekund na kaŝdym współczesnym komputerze. Nie nadaje się więc do zastosowania w dzisiejszych warunkach. Ponadto szyfrowanie symetryczne nie nadaje się do wykorzystania w Internecie, poniewaŝ w takim przypadku zachodziłaby potrzeba bezpiecznej wymiany klucza. Przechwycenie przez intruza pakietu zawierającego klucz dawałoby mu pełny dostęp do szyfrowanych informacji, więc cała idea straciłaby sens. Jak więc bezpiecznie wymienić dane poprzez sieć? Idealnie byłoby gdyby dane moŝna było szyfrować jednym, a deszyfrować tylko innym kluczem. W takim przypadku przechwycenie klucza umoŝliwiającego szyfrowanie, nie wystarczyłoby, aby odszyfrować informacje. Jak się okazuje istnieje takie rozwiązanie i nazywa się szyfrowaniem asymetrycznym. 2. Idea pary kluczy publicznego i prywatnego Zasada działania szyfrowania asymetrycznego opiera się na idei dwóch kluczy, publicznego i prywatnego. Kluczem publicznym moŝna tylko szyfrować, a kluczem prywatnym moŝna deszyfrować. Jak wskazują nazwy klucz prywatny powinien być dostępny tylko dla osoby, która moŝe czytać szyfrowane wiadomości, natomiast klucz publiczny moŝe być dostępny dla kaŝdego, kto zechce zaszyfrować informacje. Idea szyfrowania asymetrycznego opiera się na złoŝoności danych działań matematycznych względem działań do nich odwrotnych. PomnoŜenie dwóch duŝych liczb pierwszych jest duŝo mniej wymagające obliczeniowo, niŝ uzyskanie czynników z tak uzyskanego iloczynu. Weźmy dwie 128-bitowe liczby pierwsze, przeciętny komputer w ciągu niespełna sekundy dokona mnoŝenia takich liczb i zwróci liczbę 256-bitową. Odwrócenie działania, czyli uzyskanie z liczby 256-bitowej dwóch liczb 128-bitowych, będzie duŝo bardziej wymagające. Klucz publiczny moŝe być właśnie tak powstałą liczbą 256-bitową, natomiast klucz prywatny dwiema liczbami 128-bitowymi, z których powstał klucz publiczny. Przykładowo rozłoŝenie na czynniki pierwsze liczby 15 jest proste: 3 5, natomiast liczba 91723948197324 sprawi juŝ trochę więcej kłopotu, tym bardziej liczba 155- czy 200-cyfrowa. RozłoŜenie liczby na czynniki pierwsze składa się z pewnej ilości kroków, która to ilość zwiększa się wykładniczo wraz ze wzrostem wielkości liczby. Oznacza to, ze jeśli liczba jest wystarczająco 2
duŝa, jej faktoryzacja moŝe zająć lata. Najbardziej istotne jest to, Ŝe klucz deszyfrujący (prywatny) znacząco róŝni się od klucza szyfrującego (publicznego) oraz Ŝe dla odpowiednio długiego klucza publicznego nie jest moŝliwe, w rozsądnym czasie, wygenerowanie klucza prywatnego. 3. Standard OpenPGP i jego implementacje Wraz z rozwojem Internetu oraz związanych z nim niebezpieczeństw i brakiem prywatności, szyfrowanie przesyłanych danych nabrało szczególnego znaczenia. W 1991 roku Phil Zimmerman zapoczątkował projekt PGP - program umoŝliwiający szyfrowanie i cyfrowe podpisywanie wszelkiego rodzaju dokumentów elektronicznych. PGP umoŝliwiał bezpieczną wymianę oraz autentykację wszelkiego rodzaju dokumentów elektronicznych. Początkowo był dostępny wraz kodem źródłowym, począwszy jednak od wersji 5.0 stał się oprogramowaniem zamkniętym i komercyjnym. Z początkiem 1997 roku została powołana w ramach IETF (Internet Engineering Task Force) grupa, która zdefiniowała otwarty standard szyfrowania poczty elektronicznej z wykorzystaniem kryptografii klucza publicznego, bazując na zamkniętym programie PGP i zapewniając kompatybilność z nim. Tak powstał standard OpenPGP, opisany w dokumencie RFC 2440. Określa on wzorcowe formaty zaszyfrowanych wiadomości i podpisów. Od tej pory praktycznie kaŝdy moŝe stworzyć własną implementację standardu i wymieniać informacje z uŝytkownikami innych, jak choćby PGP. Najpopularniejszą otwartą implementacją protokołu OpenPGP jest Gnu Privacy Guard (GPG). Choć oferuje nieco mniejsze moŝliwości niŝ komercyjny PGP, znakomicie nadaje się do zastosowań w małych firmach oraz wśród uŝytkowników domowych. 4. Instalacja GnuPG i narzędzi wspomagających Gnu Privacy Guard w wersji w przygotowanej na platformę Windows moŝna pobrać ze strony projektu http://www.gpg4win.org/. W pakiecie oprócz GnuPG znajduje się kilka aplikacji ułatwiających korzystanie z niego: GPGee rozszerzenia systemowego menu podręcznego WinPT narzędzie do zarządzania kluczami Proces instalacji nie sprawia kłopotu. Jednak aby móc korzystać z narzędzi w powłoce systemowej naleŝy dodać ich lokalizację do zmiennej systemowej PATH. W tym celu przejdźmy do Panel sterowania -> System -> Zaawansowane -> Zmienne środowiskowe -> Zmienne systemowe 3
Rys. 1 Ustawianie zmiennej systemowej PATH. Jeśli wszystko wykonaliśmy jak naleŝy, otwórzmy powłokę systemową Start -> Uruchom -> cmd.exe. Po wpisaniu: gpg --version powinniśmy ujrzeć numer wersji zainstalowanego GPG oraz wspierane algorytmy kryptograficzne. MoŜemy juŝ więc rozpocząć właściwą pracę z GnuPG. Rys. 2 Wynik wywołania polecenia gpg version. 4
5. Generowanie kluczy Kiedy utworzymy parę kluczy, zarówno publiczny jak i prywatny będą przechowywane na dysku naszego komputera. Stwarza to pewne ryzyko kaŝdy kto uzyska dostęp do naszego komputera moŝe zdobyć nasz klucz prywatny i odszyfrować nasze wiadomości lub podszyć się pod nas. Próba zapamiętania klucza w pamięci równieŝ skazana jest na niepowodzenie jest on po prostu bardzo długi. Praktycznym rozwiązaniem tego problemu jest zaszyfrowanie klucza prywatnego hasłem. Przy kaŝdej próbie uŝycia klucza prywatnego gpg zapyta o nie, a po poprawnym podaniu zdeszyfruje klucz w pamięci i skorzysta z niego. NaleŜy dbać by hasło miało odpowiednią długość i złoŝoność na pewno złym pomysłem będzie uŝywanie haseł słownikowych. Zaleca się hasła zawierające małe i duŝe litery, cyfry oraz znaki specjalne o długości conajmniej ośmiu znaków. Aby utworzyć parę kluczy, w powłoce systemowej wpiszmy: gpg --gen-key Zostaniemy poproszeni o wybranie rodzaju klucza. Wybierzmy domyślny DSA and Elgamal. Następne pytanie dotyczy długości klucza. W tym miejscu równieŝ zaleca się wybranie wartości domyślnej. Wartość ta powinna być kompromisem krótszy klucz łatwiej złamać, dłuŝszy klucz będzie wymagał więcej czasu na kaŝdą operację, która go wykorzystuje. Wzrost mocy obliczeniowej komputerów oraz rozwój badań w dziedzinie kryptoanalizy powoduje, Ŝe wiele algorytmów, uwaŝanych niegdyś za niemoŝliwe do złamania w krótkim czasie, zostało skompromitowanych w ostatnich latach. Na przykład w ostatnim czasie złamano algorytm RSA o długości klucza 576 bitów (100 maszyn w 3 miesiące). Kolejne pytanie dotyczy długości czasu waŝności klucza. Ustawienie wygaśnięcia klucza po pewnym czasie zwiększa nieco bezpieczeństwo po przekroczeniu daty waŝności nie będzie moŝna z niego korzystać. WiąŜe się z tym pewna niedogodność będziemy musieli rozesłać nasz nowy klucz publiczny wszystkim, którzy dotychczas korzystali ze starego. 5
Wybierzmy więc opcję 0 = key does not expire klucz nie wygasa nigdy. Rys. 3 Generowanie pary kluczy. Teraz program zapyta nas o naszą toŝsamość i adres email. Są to informacje, które pozwolą innym zidentyfikować do kogo naleŝy klucz. Jeśli troszczymy się o naszą prywatność, nie musimy podawać naszych prawdziwych danych, zamiast tego moŝemy wybrać nazwę unikalną na tyle, by nasz klucz nie został pomylony z naleŝącym do kogoś innego. MoŜemy równieŝ uzupełnić pole komentarz lub pozostawić je puste. Ostatnia rzecz o jaką zapyta proces generowania klucza jest hasło, którym będziemy go chronić. Podczas podawania hasła nie drukuje się ono na ekranie (ani Ŝadne inne znaki sygnalizujące wpisywanie). Po podaniu danych rozpoczyna się właściwy proces generowania klucza. Aby był on wygenerowany w sposób losowy potrzebna jest duŝa ilość entropii. Podczas trwania tego procesu zaleca się by intensywnie wykorzystywać dysk twardy lub aktywnie przeglądać strony internetowe. Aby dostarczyć odpowiednią entropię moŝna włączyć kopiowanie duŝego pliku, z róŝnymi 6
odstępami czasowymi naciskać klawisze i losowo przesuwać kursor myszy. Po wygenerowaniu nasza para kluczy znajduje się w katalogu: C:\Documents and Settings\%USERNAME%\Dane aplikacji\gnupg Klucz publiczny to pubring.gpg a prywatny secring.gpg. Ten drugi naleŝy szczególnie chronić. Skopiujmy go juŝ teraz na zewnętrzny nośnik i umieśćmy w bezpiecznym miejscu. Wygenerowane klucze naleŝy po zakończonych zajęciach bezwzględnie usunąć z komputerów laboratoryjnych! Alternatywnie, tą samą operację generowania klucza moŝemy wykonać korzystając z graficznej nakładki do zarządzania kluczami, która instaluje się wraz z pakietem Gpg4win, to jest WinPT. Odnajdźmy ją w menu Start i uruchommy. Aplikacja uruchamia się w zasobniku systemowym. Przy pierwszym uŝyciu, jeśli nie istnieją jeszcze Ŝadne klucze zostaniemy zapytani czy chcemy taką parę stworzyć. Wybierzmy wtedy Generate a GnuPG key pair. Tak jak poprzednio zostaniemy poproszeni o podanie naszej toŝsamości, adresu email oraz hasła chroniącego klucz prywatny. Ponadto zostaniemy zapytani czy chcemy utworzyć kopię zapasową świeŝo wygenerowanych kluczy, a jeśli tak, program pyta o ich docelową lokalizację. Nie mamy wpływu na waŝność, długość oraz rodzaj klucza zostaną ustawione sensowne wartości domyślne. W razie potrzeb moŝemy wygenerować klucz w trybie Expert (menu w WinPT, Key -> New -> Expert) i uzyskać dostęp do wspomnianych wyŝej opcji klucza. Rys. 4 Generowanie klucza z nakładki WinPT w trybie Expert. 7
6. Eksportowanie oraz importowanie kluczy Wygenerowany klucz publiczny jest bezuŝyteczny jeśli nie dostarczymy go osobom, z którymi chcemy wymieniać szyfrowane informacje. MoŜemy więc umieścić go na naszej stronie internetowej lub wysłać pocztą elektroniczną. Jeszcze innym, a prawdopodobnie najpraktyczniejszym, sposobem jest umieszczenie klucza na specjalnym serwerze, który słuŝy do ich przechowywania. By wyeksportować klucz do formatu tekstowego uŝyjemy w konsoli systemowej polecenia: gpg --armor --output "klucz.txt" --export "NAZWA" gdzie w miejsce nazwa wpisujemy adres email wpisany przy generacji klucza lub naszą 'nazwę' która identyfikuje klucz (np. imię i nazwisko). MoŜemy takŝe podać część nazwy jeśli jednoznacznie wskazuje ona klucz (np. jedynie nazwa domeny adresu email jeśli jest unikatowa w zbiorze kluczy). Tak spreparowany klucz jest gotowy do publikowania. WaŜne jest by umieszczać go w całości (razem z komentarzami, od początkowego do końcowego): -----BEGIN PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK----- 8
Rys. 5 Wyeksportowany klucz w postaci znaków ASCII. By dokonać tego samego z nakładki WinPT naleŝy w oknie głównym zaznaczyć interesujący nas klucz, a następnie wybrać bądź to z menu Edit -> Copy bądź z menu podręcznego (prawy klawisz myszy) Copy Key to Clipboard. Wybrany klucz publiczny znajduje się w schowku. Serwery kluczy potrafią przechowywać klucze publiczne i udostępniać je kaŝdemu, kto o nie poprosi. Jest to rozwiązanie wygodne, zwłaszcza jeśli chcemy rozdystrybuować klucz większej liczbie osób. Istnieje wiele serwerów kluczy, jednak nie musimy wysyłać naszego klucza do kaŝdego z nich. Zdecydowana większość, a przynajmniej popularne serwery, synchronizuje się ze sobą. W efekcie po pewnym czasie odpytanie któregokolwiek z nich o wyeksportowany klucz zwróci spodziewany wynik. Procedura wyeksportowania klucza na serwer jest prosta. W konsoli systemowej wystarczy w tym celu uŝyć polecenia: gpg --keyser SERWER_KLUCZY --send-keys ID_KLUCZA gdzie ID_KLUCZA to jego identyfikator, a SERWER_KLUCZY jest nazwą domenową lub adresem wybranego serwera kluczy. 9
Rys. 6 Eksport klucza publicznego do schowka w programie WinPT. Listę wszystkich kluczy wraz z identyfikatorami uzyskamy wywołując: gpg --list-keys Rys. 7 Listowanie wszystkich dostępnych kluczy. W ramce ID klucza. 10
Popularne serwery kluczy pgp.mit.edu wwwkeys.eu.pgp.net keyserver.veridis.com keyserver.pgp.com Rys. 8 Eksport klucza na serwer kluczy. Operację eksportu klucza na serwer moŝna dokonać takŝe za pomocą interfejsu WinPT. W tym celu otwórzmy menu podręczne na interesującym nas kluczu i wybierzmy pozycję Send to keyserver i dowolny serwer z listy. Jej zawartość moŝna modyfikować w menu Keyserver. Rys. 9 Eksport klucza na serwer w interfejsie WinPT. 11
Jeśli chcemy przesłać jakiejś osobie zaszyfrowaną wiadomość, to takŝe musimy zdobyć jej klucz publiczny. Jeśli dysponujemy juŝ takim, zapisanym w pliku tekstowym to by go zaimportować do naszego GPG wystarczy zrobić: gpg --import zapisany_klucz_publiczny.txt Naturalnie naleŝy podać poprawną ścieŝkę do pliku lub musimy znajdować się w katalogu gdzie jest klucz. Co ciekawe w pliku zawierającym klucz mogą znajdować się takŝe inne dane wczytany zostanie jedynie blok pomiędzy znacznikami. ----- BEGIN PGP PUBLICKEY BLOCK----- ----- END PGP PUBLICKEY BLOCK----- Rys. 10 Import klucza zapisanego w pliku tekstowym. Te same operacje wykonamy z nakładki WinPT. Odpowiednią opcję słuŝącą do importu obcego klucza publicznego z pliku tekstowego znajdziemy w menu Key -> Import. Tutaj mamy jeszcze moŝliwość zaimportować klucz wprost czyjejś witryny www wybierzmy wtedy Key -> Import via HTTP. Rys. 11 Import klucza zapisanego w pliku tekstowym z poziomu WinPT. 12
Importowanie klucza z serwerów jest znacznie wygodniejsze, nie wymaga uprzedniego dostarczenia klucza w formacie tekstowym. Najpierw musimy zlokalizować interesujący nas klucz. ZałóŜmy, Ŝe chcielibyśmy nawiązać bezpieczną korespondencję z Janem Nowakiem. Odnajdźmy najpierw jego klucz: gpg --keyserver SERWER_KLUCZY --search-key adres_email Gdy odnajdziemy właściwy klucz i poznamy jego ID, moŝemy go zaimportować: gpg --keyserver SERWER_KLUCZY --recv-key ID_KLUCZA Rys. 12 Wyszukanie i import klucza z serwera. Ta sama operacja w nakładce WinPT sprowadza się do wywołania menu Keyserver. Uruchomi się wtedy nowe okienko w którym moŝemy wpisać szukany przez nas klucz. Po odnalezieniu na serwerze zostanie utworzone nowe okienko, z którego moŝemy dokonać juŝ importu. Popularne serwery kluczy: pgp.mit.edu subkeys.pgp.net wwwkeys.eu.pgp.net keyserver.pgp.com keyserver.veridis.com 13
Rys. 13 Wyszukanie i import klucza z serwera za pomocą WinPT. Jest jeszcze jedna czynność, którą powinniśmy wykonać po zaimportowaniu. Taki klucz domyślnie nie naleŝy do grupy zaufanych. Jeśli będziemy z niego korzystać, otrzymamy ostrzeŝenia, Ŝe jego autentyczność nie została potwierdzona. Jeśli jednak jesteśmy przekonani co do jego pochodzenia, to by pozbyć się ostrzeŝeń wystarczy ustawić odpowiedni poziom zaufania względem niego. W konsoli wpiszmy: gpg --edit-key NAZWA_KLUCZA Wejdziemy w tryb interaktywny. Wydajmy w nim polecenie: trust 14
Zostaniemy poproszeni o wybranie poziomu zaufania. Wybierzmy opcję przedostatnią, tj. 5 = I trust ultimately. Aby wyjść z trybu interaktywnego i zapisać wprowadzone zmiany wpiszmy: quit Alternatywnie ta sama czynność w WinPT polega na wybraniu klucza z listy, a po uruchomieniu na nim menu podręcznego wybraniu opcji Set implicit trust. Pełną funkcjonalność interaktywnego trust znajdziemy pod opcją Key edit w tym samym menu. Rys. 13 Ustawianie pełnego zaufania dla zaimportowanego klucza. 7. Podpisywanie i weryfikacja Dzięki OpenPGP otrzymujemy mechanizm weryfikacji poprawności i autorstwa istotnych dla nas danych. Wystarczy, Ŝe nadawca podpisze cyfrowo swoim kluczem prywatnym dane, których autentyczność sprawdzimy my, korzystając z jego klucza publicznego. Procedura wygląda następująco obliczania jest wartość funkcji mieszającej dla danego zestawu danych, następnie ta wartość jest szyfrowana kluczem prywatnym nadawcy. MoŜna ją zdeszyfrować tylko kluczem publicznym tego nadawcy. To upewnia nas o pochodzeniu. Po zdeszyfrowaniu moŝemy porównać wartość funkcji mieszającej nadawcy z wynikiem takiego haszowania u nas. Jeśli są zgodne, to znaczy Ŝe dane nie uległy zmianie. Mamy wtedy juŝ całkowitą pewność, Ŝe to co otrzymaliśmy, po przejściu przez kanał komunikacyjny, zgadza się z oryginałem. 15
Aby podpisać plik wystarczy w konsoli wpisać: gpg --clearsign PLIK Zostanie do tego uŝyty nasz domyślny klucz. Program poprosi nas o podanie naszego hasła do klucza, a wynikiem jego działania będzie plik PLIK.asc. MoŜe on wyglądać następująco: Rys. 14 Podpisywanie wiadomości wybranym kluczem. Listing wiadomości. JeŜeli chcemy uŝyć do podpisu innego klucza niŝ nasz domyślny, wtedy dołączmy parametr --localuser. Jako argument przyjmuje nazwę wybranego klucza, tj. adres email wpisany przy generacji klucza, imię i nazwisko lub identyfikator. gpg --local-user NAZWA --clearsign PLIK PowyŜsze sposoby sprawdzają się kiedy podpisujemy pliki tekstowe. Jednak taka modyfikacja jak dodanie popisu do pliku binarnego uszkodzi go. Wtedy powinniśmy stosować podpis cyfrowy w osobnym pliku: gpg --output PLIK_PODPISU.sig --detach-sign PLIK Utworzony podpis będzie w formacie binarnym, nieczytelnym dla człowieka. Jeśli chcemy by podpis był w formacie pliku ASCII dodajmy przełącznik --armor 16
Rys. 15 Podpisywanie pliku binarnego. Podpis w formacie tekstowym w osobnym pliku. Weryfikacja popisanego pliku jest równieŝ prosta. JeŜeli posiadamy klucz publiczny osoby podpisującej, to po wpisaniu w konsoli: gpg --verify PODPIS (lub plik tekstowy z załączonym podpisem) otrzymamy potwierdzenie autentyczności, jeśli plik nie uległ zmianie. Jeśli nie posiadamy w naszym zbiorze klucza publicznego osoby podpisującej, musimy go wcześniej zaimportować. Wszystkie operacje podpisywana i weryfikacji moŝna uprościć stosując rozszerzenie powłoki systemowej Windows, GPGee. Dzięki niemu wystarczy wybrać odpowiednią opcję z menu kontekstowego pliku. Prześledźmy proces podpisywania (rys. 17, 19) i weryfikacji pliku (rys. 18, 20). 17
Rys. 16 Podpisywanie pliku binarnego. Weryfikacja podpisu. Rys. 17 Podpisywanie pliku. Rys. 18 Weryfikacja podpisu. 18
Rys. 19 Podpisywanie pliku. Zaznaczona opcja podpisu w osobnym pliku. tekstowym. Rys. 20 Weryfikacja podpisu. NaleŜy pamiętać o uprzednim zaimportowaniu klucza publicznego. 19
8. Szyfrowanie i deszyfrowanie Standard OpenPGP zapewnia wysoką ochronę prywatności umoŝliwiając szyfrowanie wiadomości i danych kryptografią asymetryczną. Plik zaszyfrujemy z konsoli w następujący sposób: gpg --recipient ODBIORCA --output PLIK.gpg --encrypt PLIK Nowo powstały plik binarny PLIK.gpg zawiera zaszyfrowane dane kluczem publicznym odbiorcy. Tylko on będzie mógł do zdeszyfrować swoim kluczem prywatnym. Zaszyfrowany plik wynikowy moŝe być równieŝ tekstowy, jeśli jego rozmiar nie jest zbyt wielki: gpg --armor --recipient ODBIORCA --output PLIK.asc --encrypt PLIK Rys. 21 Szyfrowanie pliku. Postać tekstowa po zaszyfrowaniu. Czasem chcemy przekazać szyfrowaną wiadomość więcej niŝ jednej osobie. Stwarza to pewien problem, gdyŝ dzielenie klucza prywatnego nie wchodzi w rachubę, a szyfrowanie dla kaŝdego z osobna nieco kłopotliwe. GnuPG pozwala nam jednak zakodować wiadomość dla więcej niŝ jednego odbiorcy jednocześnie. Wtedy jeden z ich kluczy prywatnych wystarcza do rozszyfrowania, więc kaŝdy moŝe to zrobić indywidualnie. Składnia tej operacji róŝni się jedynie dodaniem większej ilości odbiorców --recipient : gpg --armor --recipient ODBIORCA_1 --recipient ODBIORCA_2 --output PLIK.asc -- encrypt PLIK Teraz spróbujmy taki zaszyfrowany plik odkodować. Jeśli był on adresowany do nas, musimy posiadać odpowiedni klucz prywatny. 20
PoniŜsze polecenie : gpg --decrypt-files PLIK.gpg spowoduje zdekodowanie zaszyfrowanego pliku. Po podaniu hasła do klucza plik rozkodowany plik zostanie umieszczony w bieŝącym katalogu pod nazwą PLIK. Jeśli szyfrowany plik był wiadomością tekstową, moŝna uŝyć alternatywnie polecenia: gpg --decrypt PLIK.asc Nie wypakuje ono pliku z zaszyfrowanej postaci, lecz wyświetli zawartość na ekranie. Rys. 22 Deszyfrowanie pliku. Podobnie jak przy podpisywaniu tak i operacje szyfrowania/ deszyfrowania moŝna przeprowadzić za pomocą rozszerzeń powłoki GPGee. Proces jest bardzo podobny, wystarczy tylko zmienić uŝywane opcje. 21
9. Sieć zaufania (web of trust) Posiadanie kluczy publicznych daje moŝliwość weryfikacji nadawcy przesyłki. Otrzymując podpisanego maila od Jana Kowalskiego mamy pewność, Ŝe to właśnie Jan Kowalski jest nadawcą przesyłki. Jest jednak pewien szczegół, który do tej pory pomijaliśmy. ZałóŜmy następujący scenariusz. Dowolna osoba generuje parę kluczy. Tworzy e-maila i w polu nadawca wpisuje Jan Kowalski, po czym podpisuje przesyłkę wygenerowanym kluczem prywatnym i wysyła go do nas. Udostępnia wygenerowany niedawno klucz publiczny na serwerze kluczy. My odbieramy tak spreparowanego maila. Nieświadomi niebezpieczeństwa pobieramy klucz publiczny z serwera, aby sprawdzić autentyczność nadawcy. Oczywiście weryfikacja przebiega pomyślnie, choć nie wiemy, Ŝe zostaliśmy oszukani. Standard OpenPGP definiuje, a GnuPG implementuje, rozwiązanie tego problemu. Cała idea opiera się na podpisywaniu kluczy publicznych i przechodniości zaufania. Budowanie sieci zaufania musi zacząć się od minimum dwóch osób, które znają identyfikatory swoich kluczy. Niech takimi osobami będą osoba A i osoba B. ZałóŜmy, Ŝe osoba C równieŝ pragnie, aby osoby do których wysyła maile mogły sprawdzić czy faktycznie pochodzą od niej. Oczywiście w tym celu komendą gpg gen-key generuje klucz prywatny i publiczny. Jednak ma świadomość, Ŝe to nie wystarczy, aby odbiorcy jego poczty mogli być pewni jej autentyczności. W takim wypadku prosi osobę A, aby podpisała jego klucz publiczny swoim. Następnie wysyła maila do osoby B. Osoba B, pobiera z serwera klucz osoby C i widzi, Ŝe klucz jest podpisany przez osobę A. A ufa B, więc moŝe takŝe zaufać sygnowanym przez niego przesyłkom. Tym sposobem jeśli C wyśle maila do dowolnej osoby, która ufa kluczowi osoby A moŝe liczyć na zaufanie takŝe przesyłkom podpisanych pośrednio przez niego. Teraz B moŝe równieŝ złoŝyć podpis cyfrowy na kluczu C, dzięki czemu osoby, które ufają kluczowi B będą takŝe mogły zaufać kluczowi C. Jak widać sieć zaufania jest zdecentralizowana i opiera się na relacjach między kluczami. Relacja moŝe być jednokierunkowa (osoba A podpisuje klucz osoby B) lub dwukierunkowa (osoby A i B wzajemnie popisują swoje klucze). KaŜdy klucz zawiera tzw. sygnaturę. Sygnatura jest skrótem (np. MD5 lub SHA) klucza. Jeśli sygnatura pasuje do klucza weryfikacja wiadomości przebiega pozytywnie. Sygnatury tworzą ścieŝki zaufania, dzięki którym moŝliwe staje się budowanie sieci zaufania. W poprzednim przykładzie B zaufał kluczowi C, poniewaŝ po ścieŝce zaufania zbudowanej przez A, był pewny autentyczności klucza publicznego, który pobrał z serwera. Idealnie jest, kiedy kaŝde podpisanie kluczy przebiega w sposób dwukierunkowy, dzięki czemu sieć zaufania moŝe znacznie się rozszerzać. 22
Aby w programie GPG podpisać klucz naleŝy przejść w tryb edycji. Przed podpisaniem klucza zaleca się sprawdzenie jego odcisku (fingerprint) i skontaktowanie się z właścicielem w celu jego weryfikacji. Jeśli fingerprint jest prawidłowy moŝna przystąpić do podpisania klucza publicznego danej osoby swoim kluczem prywatnym. W trakcie podpisywania zostaniemy poproszeni o wpisanie hasła klucza, którego uŝywamy do podpisania. Teraz moŝna odesłać właścicielowi jego klucz wraz z naszym podpisem i poprosić o podpisanie naszego klucza. 10. Bibliografia OpenPGP Message Format. http://www.ietf.org/rfc/rfc2440.txt Dokumentacja GnuPG. http://www.gnupg.org/ http://pl.wikipedia.org/wiki/kryptografia SPKI Certificate Theory. http://www.ietf.org/rfc/rfc2693.txt Lista dysuksyjna Enigmail. http://mozdev.org/mailman/listinfo/enigmail/ MIME Security with OpenPGP. http://www.ietf.org/rfc/rfc3156.txt http://www.openpgp.org/ http://www.philzimmermann.com 23