Szyfrowanie danych jest dość istotną czynnością celem której ma być ukrycie zawartości danych (np dokumentu tekstowego) przed osobami niepowołanymi. Wraz z rozwojem potrzeb biznesowych pojawiły się tez inne możliwości takie jak podpis cyfrowy oraz związane z nimi funkcje skrótu czy sumy kontrolne. W tym poście opisano podstawowe wiadomości dotyczące szyfrowania asymetrycznego, generowania pary kluczy (publiczny / prywatny), oraz cyfrowego podpisu na bazie oprogramowania Gnu4Win. Przedstawiono też funkcje serwerów kluczy.
Wstępnie kilka uwag teoretycznych. Z szyfrowaniem inaczej mówiąc utajnianiem wiadomości wiąże się pojęcie algorytmu szyfrującego oraz klucza. Szyfrowanie, ogólnie rzecz ujmując można podzielić na dwa rodzaje: symetryczne i asymetryczne. W szyfrowaniu symetrycznym każda ze stron musi mieć ten sam klucz co przy większej ilości kontaktów zaczyna być problemem. W szyfrowaniu asymetrycznym każdy ma swoją parę kluczy prywatny + publiczny. Klucz prywatny musi być silnie strzeżony publiczny natomiast można (nawet należy) udostępnić wszystkim chcącym posyłać do nas zaszyfrowane wiadomości.
Szyfrowanie asymetryczne. Co zostanie zaszyfrowanie kluczem publicznym może być odszyfrowane tylko (a przynajmniej tam nam się mówi) powiązanym z nim kluczem prywatnym. Teoretycznie i jak na razie praktycznie nie ma możliwości zbudowania klucza prywatnego na bazie klucza publicznego. Szyfrowanie służy zachowaniu poufności wiadomości.
Podpis cyfrowy. Z drugiej strony zastosowanie klucza prywatnego, poza operacją odszyfrowania, ma miejsce w przypadku wykonywania podpisów elektronicznych (cyfrowych). Dokument jest traktowany funkcją skrótu, tak utworzony skrót jest szyfrowany kluczem prywatnym właściciela czy nadawcy dokumentu. Odbiorca za pomocą powiązanego klucza publicznego deszyfruje skrót, oblicza własny i porównuje. Jeśli wynik porównania jest pozytywny oznacz to poprawność podpisu. Pozostaje kwestia czy klucz publiczny np pobrany z ogólnodostępnego serwera kluczy należy faktycznie do tego kto jest w jego opisie ale to temat na inny post dotyczący certyfikatów i urzędów certyfikacyjnych.
Poniżej przedstawiono uproszczony schemat szyfrowania asymetrycznego.
Aby Helga mogła bezpiecznie do agenta J23 (Janek) posłać wiadomość musi posiadać jego klucz publiczny, który może pobrać z ogólnodostępnego serwera kluczy. Jednak aby się tam znalazł najpierw Janek musi go tam posłać. Tak więc:
1 – Janek posyła (eksportuje) swój klucz publiczny Jpub na serwer kluczy
2 – Helga pobiera klucz publiczny Janka i zapisuje w swoim archiwum
3 – Szyfruje dokument kluczem publicznym Janka i posyła go
4 – Janek, używając swojego klucza prywatnego Jpryw, deszyfruje dokument i cieszy się nim (bo Brunner poszedł na emeryturę)
Tyle teorii, więcej w necie i moim małym dokumencie Systemy_PKI.pdf, z podpisem cyfrowym Systemy_PKI.pdf.sig. Przystępujemy do praktyki.
Zakładam, że nie masz jeszcze swojej pary kluczy publiczny / prywatny i będziemy je generować za pomocą omawianego programu.
1. Wchodzimy na stronę www.gnupg.org i z lewej wybieramy Download i następnie Biranies po czym klikamy w Gpg4win. Przekieruje nas to do strony gpg4win.org. Z tej strony pobieramy najnowszą, stabilną (nie beta!) wersję pakietu GPG4Win. Po zakończeniu pobierania instalujemy ją zwracając uwagę aby zaznaczyć opcję GPA (Gnu Privacy Assistance) w razie gdyby była niezaznaczona. Cały proces jest dość prosty i w sumie polega na klikaniu Next.
2. Po instalacji rozpoczynamy proces generowania naszej pierwszej pary kluczy. Generowane są klucze publiczny i prywatny. Pamiętaj: publiczny możesz a nawet musisz udostępnić wszystkim zainteresowanym (o tym nieco dalej) ale prywatny trzeba chronić – on jest tylko dla Ciebie! Ponieważ program jest świeżo zainstalowany od razu pojawia się monit dotyczący wygenerowanie pierwszej pary kluczy.
Klikamy w Generate key now i rozpoczyna się proces generowania pierwszej pary kluczy. Podajemy dane:
– Imię i nazwisko
– adres e-mail
– decydujemy czy od razu wykonać kpię kluczy (tu dajemy nie – Do it later)
– czekamy chwilkę na wygenerowanie klucza po czym pojawia się monit o ustalenie hasła do klucza prywatnego, wpisujemy hasło (dwukrotnie) dbając aby było silne
– pojawia się główne okno programu z wygenerowaną parą kluczy (klucze symbolizowane są ikonką klucza: żółty to prywatny, błękitny to publiczny, gdy są jeden nad drugim oznacza to powiązaną parę kluczy)
W ten sposób mamy wygenerowaną pierwszą parę kluczy która składa się z klucza publicznego i prywatnego. Przejrzyjmy zatem opcje jakie mamy dostępne w programie GPA.
W głównym oknie mamy spis wszystkich zainstalowanych kluczy (na razie tylko jedna para) a w dolnej części okna podsumowanie aktualnie zaznaczonego klucza. Domyślny widok jest uproszczony aby przełączyć na widok zaawansowany klikamy w przycisk Detailed w górnej części okna programu. Przeanalizujmy teraz właściwości naszych kluczy.
Key ID – jest identyfikatorem klucza wyjątkowo pomocnym podczas korzystania z publicznych serwerów kluczy choć nie tylko (zapamiętaj to ID gdyż będzie używane w dalszych przykładach)
Expiry Date – data wygaśnięcia ważności klucza, domyślnie nigdy
Owner Trust – oznacza poziom zaufanie do klucza, dla naszej pary jest Ultimate czyli całkowity co jest logiczne bo to nasza nowa para kluczy
Validity – ważność klucza, którą traci po dojściu do daty ważności
User name – nazwa użytkownika wraz z e-mailem
Fingerprint – cyfrowy odcisk palca danej pary/klucza
Key type – typ klucza, tu RSA o długości 2048 bitów
W zasadzie to wszystko 🙂 Mamy nową parę kluczy, za pomocą której można już dokonywać operacji szyfrowania, deszyfrowania i podpisywania dokumentów. Dla przykładu możemy utworzyć plik tekstowy i wpisać do niego dowolny tekst:
Następnie przechodzimy do eksploratora plików (czy czego tam używasz – ja Totall Commandera) i prawym klikamy na naszym pliku. Pojawia się menu podręczne:
Na razie interesują nas pozycje Decrypt (odszyfrowanie), Encrypt (szyfrowanie), Sign(podpisanie) oraz Verify (weryfikacja podpisu). Dodatkową przydatną opcją jest suma kontrolna (Create i Verify).
W ćwiczeniach używam maszyn wirtualnych z zainstalowanym Gnu4Win. Jedna maszyna to „komputer” Janka a druga Helgi. Na każdym są wygenerowane klucze właściciela a dodatkowo Janek ma klucz publiczny Helgi. Aby pozyskać klucz publiczny Janka na komputerze Helgi i wspak skocz do postu opisującego obsługę kluczy. Tak czy inaczej Janek musi posiadać klucz publiczny Helgi a Helga klucz publiczny Janka aby mogli przesyłać do siebie zaszyfrowane dokumenty a następnie je deszyfrować czy weryfikować podpisy.
Szyfrowanie
Dane szyfruje się kluczem publicznym. Pamiętaj, że posyłając dane do np Janka szyfrujemy je kluczem publicznym Janka nie naszym! W takim wypadku tylko Janek może je odszyfrować (pozostaje problem pewności, że klucz który posiadam jest faktycznie przynależny do Janka a nie kogo innego ale to temat na inny post) więc uznajemy je za dobrze zabezpieczone. Tak więc szyfrujemy dane przeznaczone dla Helgi czyli Janek szyfruje za pomocą jej klucza publicznego a ona deszyfruje za pomocą swojego klucza prywatnego.
1 – Na wybranym pliku (poufne.txt) klikamy prawym i wybieramy pozycję More GpgEX options > Encrypt
2 – W oknie jakie się pojawi wybieramy opcję Encrypt
Uwaga – jeśli chcemy zarchiwizować kilka plików i jednocześnie stworzyć z nich archiwum zaznaczamy opcję Archiwe files with i określany nazwy plików z archiwum. Program wszystkie zaznaczone wcześniej pliki (więcej plików zaznaczamy w normalny sposób) spakuje do archiwum i całość zaszyfruje.
Pozostałe opcje:
– Sign oznacza operację wykonania podpisu cyfrowego, w tym wypadku Janek musi użyć jednego ze swoich kluczy prywatnych
– Text output (ASCII armor) wynik jest w formacie tekstowym ASCII (znaki 1-127) a nie binarnym co może być bardziej uniwersalne podczas przesyłania tak zaszyfrowanego pliku, w tym wypadku pliki zaszyfrowane mają rozszerzenie .asc w przeciwnym razie .gpg
– Remove… usuwa oryginał (pamiętaj ze zazwyczaj będzie istniała możliwość odtworzenia pliku jeśli ktoś będzie bardzo to chciał zrobić)
3 – W kolejnym oknie wybieramy klucz publiczny Helgi, naciskamy Add czyli dodajemy go do listy kluczy jakimi zaszyfrujemy plik (tak, można szyfrować do kilku odbiorców naraz w tym i do siebie jeśli oryginał ma być zniszczony), na koniec zatwierdzamy tym samym rozpoczynając proces szyfrowania (jeśli wśród kluczy szyfrujących, publicznych, nie było naszego program wyświetli ostrzeżenie omówione wyżej)
4 – Kończymy z informacją o poprawnym szyfrowaniu
5 – Celem weryfikacji sprawdzamy zawartość katalogu z plikiem jaki szyfrowaliśmy – pojawia się plik poufne.txt.gpg gdzie gpg jest automatycznie dodawanym rozszerzeniem zaszyfrowanym plikom:
Jak widać zawartość pliku jest nieczytelna czyli zaszyfrowana, w tym wypadku to plik binarny (Janek nie zaznaczył opcji ASCII armor). Taki plik można bezpiecznie posłać do adresata.
Deszyfrowanie
Odszyfrować dane można tylko w przypadku gdy posiadamy klucz prywatny powiązany z kluczem publicznym jakim dane zostały zaszyfrowane. Ktoś pobiera z serwera kluczy nasz publiczny, szyfruje nim plik i posyła do nas. Taki plik możemy deszyfrować za pomocą powiązanego klucza prywatnego. Helga ma już zaszyfrowany plik a więc może przystąpić do jego odszyfrowania.
1 – Przesiadamy się na komputer Helgi, prawym klikamy na zaszyfrowanym pliku poufne.txt.gpg i docelowo wybieramy Decrypt
2 – W następnym oknie wybieramy folder docelowy w jakim ma się pojawić rozszyfrowany plik (pliki w przypadku archiwum) i klikamy w Decrypt/Verify
3 – Zapewne pojawi się monit o hasło o prywatnego klucza Helgi jakim odszyfrujemy plik, należy je więc podać i zakończyć proces deszyfrowania
4 – Sprawdzamy zawartość katalogu – jak widać pojawił się oryginalny plik
Podpis
Podpis dokumentu (pliku) tworzymy za pomocą naszego klucza prywatnego a sprawdzić go może każdy kto posiada powiązany z num klucz publiczny (po to są ogólnodostępne serwery kluczy publicznych)
1 – Janek wysyła dokument do Helgi ale tylko go podpisuje, prawym na pliku i opcja Sign, pojawia się znane już okno, w którym wybierany pozycję Sign i dodatkowo tym razem Text output.
W kolejnym oknie wybieramy jeden z naszych kluczy prywatnych (np. ten, który mamy przeznaczony do podpisu cyfrowego) oraz odznaczamy opcję Sign with S/MIME, klikamy w Sign podajemy hasło do klucza prywatnego Janka i gotowe.
2 – Po zakończeniu pojawia się plik poufne.txt.asc, który jest cyfrowym podpisem pliku poufne.txt.
W przypadku nie włączenia opcji Text output (ASCI armor) pojawi się plik binarny z rozszerzeniem .sig. Generalnie pliki tekstowe podpisów (ASCII armor) mają rozszerzenie .asc a binarne .sig. Oba pliki zródłowy i z podpisem cyfrowym Janet teraz musi posłać Heldze aby mogła dokonać weryfikacji. Podpis służy dwom celom: po pierwsze zapewni integralność dokumentu po drugie potwierdza, że nadawcą i autorem jest Janek (o tyle o ile można ufać kluczowi publicznemu ze na 100% jest własnością Janka).
Weryfikacja
Podpisany dokument weryfikuje się za pomocą publicznego klucza powiązanego z prywatnym, którym został on podpisany. Helga może więc przystąpić do weryfikacji podpisu dokumentu Janka.
1 – Przechodzimy do komputera Helgi i prawym na dokumencie (pliku) i wybieramy Verify oraz zatwierdzamy opcje z kolejnego okna
Input file: – plik na jakim Helga kliknęła czyli plik z sygnaturą podpisu
opcja Input file is a detached signature oznacza iż ten plik to oddzielna sygnatura względem pliku z dokumentem (sygnatura może być scalona z plikiem)
Signed data: – plik oryginalnego dokumentu
2 – Jeśli wszystko przebiegło bez problemów i dokument jest oryginalny bez zmian a podpis jest OK pojawia się informacja o poprawności podpisu i zgodności dokumentu wraz z informacją o ID klucza publicznego Janka.
3 – W przypadku kliknięcia na pliku dokumentu a nie podpisu
program automatycznie szuka plików z podpisami
i następnie je weryfikuje
4 – Jeśli Helga nie posiada klucza publicznego Janka pojawi się błąd mówiący o braku certyfikatu (klucza publicznego): osoby podpisującej dokument. Klucz taki można pobrać z publicznego serwera lub importować z pliku ale o tym w innym poście.
5 – W przypadku zmodyfikowania choć jednego bitu pliku z dokumentem otrzymujemy błąd weryfikacji:
Tak więc podsumowując wiedzę o kluczach można powiedzieć, że zazwyczaj przechowujemy wiele kluczy: publiczne osób z którymi się komunikujemy oraz parę (lub więcej par) kluczy prywatny + publiczny należących do nas. Szyfrujemy kluczami publicznymi osób docelowych, odszyfrowujemy naszym kluczem prywatnym, podpisujemy naszym prywatnym a sprawdzamy podpisy kluczami publicznymi osób, które posyłają nam podpisane przez siebie dokumenty.
W tym poście to na tyle, zapraszam do czytania innych traktujących o obsłudze kluczy.