Wstęp.

Przez pierwsze kilkadziesiąt lat swojego istnienia, sieci komputerowe były wykorzystywane głównie przez naukowców, którzy wymieniali dane między ośrodkami badawczymi oraz poprzez pracowników współdzielących dostęp do pojedynczych zasobów takich jak drukarki, czy plotery. W tych warunkach, zagadnienie dotyczące bezpieczeństwa sieci miało znaczenie marginalne. Czasy się jednak zmieniły, a rzeczywistość wygląda inaczej niż sobie to wyobrażał prezes IBM, T.J. Watson który w 1945 roku, odpowiadając na pytanie, dlaczego IBM nie wchodzi do branży komputerowej? Powiedział

Cztery lub pięć komputerów powinno wystarczyć całemu światu do roku 2000

Obecnie komputery stały się narzędziami powszechnego użytku, dla zwykłych obywateli, natomiast szeroko rozumiane bezpieczeństwo informacji stało się zagadnieniem priorytetowym. Mimo powszechnego korzystania, użytkowników sieci z poczty elektronicznej, niewielu z nich zastanawia się nad stopniem bezpieczeństwa przesyłanych informacji. Internauci z reguły nie dbają o bezpieczeństwo swojego systemu, jak i informacji które przesyłają, nie zdając sobie sprawy z konsekwencji jakie mogą ponieść. Niektórzy użytkownicy w mailach przesyłają sobie numery telefonów, adresy, czasem również numery kont bankowych. Warto tutaj uświadomić sobie fakt iż wiadomości które zostają wysłane jako zwykły tekst, mogą zostać odczytane przez osoby trzecie zanim dotrą do adresata. Dlatego też chciałbym zachęcić czytelników, do szyfrowania poczty, co też tutaj poniżej przedstawię wykorzystując do tego celu najpopularniejsze obecnie uniksowe oprogramowanie do kryptografii GnuPG.

GPG jest wolnym zamiennikiem oprogramowania kryptograficznego PGP. Udostępnionym na licencji GPL.
Istnieją różnorodne nakładki udostępniające interfejs graficzny (GnuPG jest zintegrowane z KMail i Evolution, domyślnymi klientami pocztowymi środowisk KDE i GNOME, natomiast program enigmail pozwala na zastosowanie GPG w Mozilli).

W niniejszym wpisie, skupię się na opisie działania programu korzystając z linii poleceń.

Na czym polega szyfrowanie poczty?

Metoda GPG polega, na utworzeniu niepowtarzalnej pary dwóch kluczy. Jednym z kluczy, jest klucz publiczny, będzie on rozsyłany do wszystkich znajomych, może również zostać umieszczony na stronie www utworzonej przez użytkownika, lub w specjalnie przygotowanym do tego serwisie, takim jak np. http://wwwkeys.pgp.net, w którym sam osobiście trzymam swój klucz publiczny. Drugim klucz prywatny, który powinien być trzymany w bezpiecznym miejscu. Ponieważ każda informacja, która została zaszyfrowana przy użyciu klucza publicznego, może być rozszyfrowane jedynie poprzez użycie klucza prywatnego. Gdy użytkownik wysyła wiadomość, szyfruje ją kluczem publicznym odbiorcy. Odbiorca otrzymując wiadomość rozszyfrowuje ją swoim kluczem prywatnym. Jeśli ktoś przechwyci zaszyfrowaną wiadomość, nie będzie mógł jej przeczytać, ponieważ nie posiada klucza prywatnego odbiorcy.GPG jest w większości dystrybucji Linuxa, lecz jeśli użytkownik nie posiada GPG lub chciałby pobrać najnowszą wersję, może to zrobić korzystając np. z: GnuPG

Obecnie najnowszą wersją jest: gnupg-2.0.3.tar.bz2

Zaczynamy.

Archiwum pobieramy na dysk twardy, następnie rozpakowujemy.
Uruchamiamy terminal i wpisujemy:

tar xvjf gnupg-2.0.3.tar.bz2

Po rozpakowaniu, przechodzimy do katalogu który zostanie utworzony i wydajemy polecenia:

$ ./configure // uruchamiamy skrypt konfiguracyjny
$ make // kompilujemy całość
# make install // jako root, instalujemy w systemie

Aby móc korzystać, z zaszyfrowanej poczty elektronicznej, należy utworzyć parę kluczy dla każdego używanego konta pocztowego. Wydajemy w terminalu polecenie:

gpg --gen-key

// W konsoli pojawia się następujący tekst:
gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
gpg: keyring `/home/cordial/.gnupg/secring.gpg’ created
Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection?1

Program prosi o wybranie, jaki rodzaj klucza chcemy utworzyć?
Wybieramy 1. Dlatego że, pozostałe klucze jedynie podpisują wiadomości, bez szyfrowania ich zawartości.

DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? 2048

W następnym kroku jesteśmy pytani, jaki rozmiar klucza chcemy?
Ja wybrałem 2048, aczkolwiek domyślna wartość 1024 bits powinna wystarczyć. Należy tutaj pamiętać iż im dłuższy klucz, tym czas procesora potrzebny na wygenerowanie początkowych kluczy, jest dłuższy. Podobnie jest przy późniejszym podpisywaniu oraz szyfrowaniu naszych wiadomości, im dłuższy klucz, tym więcej czasu jest potrzebne na wykonanie niezbędnych operacji arytmetycznych.

Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0) 0

Teraz jesteśmy pytani, jak długo klucz powinien być ważny? Wybrałem 0, co znaczy że klucz nie traci swojej ważności. Wybierając np. 1y, należy pamiętać że, po roku klucz przestanie być ważny, oraz że po jego wygaśnięciu ten klucz będą mieli nadal nasi znajomi. Co może w przyszłości generować pewne problemy.

Key does not expire at all
Is this correct? (y/N) y

W następnym kroku potwierdzamy.

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
„Heinrich Heine (Der Dichter) „

Następnie podajemy dane.

Real name: Cordial
Email address: cordial01 [at] gmail [dot] com
Comment:
You selected this USER-ID:
Cordial cordial01 [at] gmail [dot] com

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

Jeżeli dane zostały wprowadzone poprawnie, akceptujemy.

You need a Passphrase to protect your secret key.
Enter passphrase:

Teraz należy wpisać frazę kodującą, która ma zabezpieczyć nasz klucz prywatny. Należy tutaj zwrócić uwagę, iż nie ma być to „hasło” a fraza, która jest zwykle całym zdaniem np. „Uwielbiam pisać na blogu porywające wpisy.”
Pamiętajmy że później będziemy wielokrotnie proszeni o ponownie wpisane tej frazy, należy ją zapamiętać.

public and secret key created and signed.
pub 1024D/923C7922 2007-07-15
uid Cordial cordial01 [at] @gmail [dot] com

W tej chwili, możemy sobie pogratulować, nasz klucz publiczny, oraz prywatny został utworzony, należy też zwrócić uwagę na drugą linijkę, zawiera ona informację o naszym public ID w moim przypadku jest to:

923C7922

Będziemy później to ID wykorzystywali, przy okazji eksportu naszego klucza publicznego na specjalny serwer.

Poniższym poleceniem, zapiszemy w bieżącym katalogu, w pliku key.gpg, swój klucz publiczny, podając własny adres e-mail. Opcja –armor powoduje, że zostanie on zapisany w kodzie ASCII (domyślnie jest on zapisywany w postaci binarnej). Uzyskany w ten sposób klucz możemy teraz publicznie udostępnić np. umieszczając go na naszej stronie internetowej, blogu.
gpg --output key.gpg --armor --export cordial01 [at] gmail [dot] com

Następnie:
ls -l
-rw-r--r-- 1 cordial cordial 1678 2007-07-16 00:14 key.gpg

oraz:
vim key.gpg

Jeśli ktoś z was będzie chciał mi coś przesłać, sekretnie.

—–BEGIN PGP PUBLIC KEY BLOCK—–
Version: GnuPG v1.4.6 (GNU/Linux)

mQGiBEaalvIRBADMQf6fen7J4JvD10Jt/MGHpEITNhMX+1UeW76SvnyMPWsw87sr
CUoa0hBav5Ck9QTq+/5+OsGeJN6JI83riD3JqvHtyX8ULGPsvVrbyuTpsKabKh3k
uj75Gxhz1BIuBjMyN6JbzDGdlTjaRe4fsyK24KzNgpz44Iu0G5oA4Qx7RwCg98kp
T0Onemev2kJlexZ6Ya9B0eUD/1TIJCSVWAhkwTPWWEosOOZagnuGerTkse/jRODp
TnZMX2Ft6fBrXUWfU0WSqTCjLPvAuusx359h+I+CF/lY78CbP269S8JTzHNeCTIe
qmEqz/AGBQWkimuRzVkKl7jvvV4/U3Esy9X4iQCGebysyDJ/Cu0OI4XNJbExyPaV
EDPeA/0dO1gDEw5hAf83hQtEMxx60Prk6hmJz9dMUgPpLIs/JMSHfdk63MlJiyeh
FJ9x9TKGMcvVteDbaW3eFPoYEbxjgl9iJlnsYbFhv3xUg5pMiojW2lWOYXCxwE2V
8fPAVQfYL7+opbL/j0KpiovcUnl7obcBxecH0sWPAE8Y9xL3HbQdQ29yZGlhbCA8
Y29yZGlhbDAxQGdtYWlsLmNvbT6IYAQTEQIAIAUCRpqW8gIbAwYLCQgHAwIEFQII
AwQWAgMBAh4BAheAAAoJECsAIluSPHkiSykAoMhJEPHOCqHaDgFZ6+IEIgxkGsfK
AJ48ppbb5jxee+ZoP4FiXNpYAm/PtLkCDQRGmpb7EAgAwazcgZ5gOMV0HRmW6HdX
lSN0god+ssPMPi+5RAvnuQ26hJm2oLOGLZaDZAwANYi2AoJ0gNTeTLObXLe4JNIO
mHuzi3HBLrDAWkkWOhxZLcGy/VIZ1TJJgfe3JLcuyUiM7ptEv20sW0XRLoLVYeFt
idhGj/HN8Nge469NsqiK6ewicmX4ggHqfgTDgOUC2y0NTfdo1VQRLvZ2MPKumqbJ
SjKiwWfvvoQ3ugZe8YdULKRHpcqJUr2ZjIsokH5i21XWmutIH1bMfmQ6TCfM9So7
qp6iXBgUHqxNblYmrD1BSh9VGuW9HWj1cX4/l8bjsXEw9uFKahy7KhHDdxixqH29
xwADBQf+NE1yMpLFiAeoDQp2+7Gn66IVlv85+AX/drvk680cTeTnwrLWi5pBC0In
GmF5vH65tOHHuWHCZ1vAbQXsFyYbucOh9SlO1rqS4pEjg8Rzeg6pe2Mt/VhD8Ndn
9o06zOEst0bnfi0CEt1pH6U0hg9cQZSiX1KGEBXLOZJw82RPi0hTtvgNpBmnXUdD
f3zKK9cIA/18qJm6vfjpM1hH7LLBm7paqDIrH9w+CwDAxRsn0Y2L4eSlIWbUMaY6
qde30/fmIbVQA0XFYNKxsthzwaMKRm0kxEM1PoYPktYMHvGwxKorGc8TsqYEmq3N
Veqxxp58Kugg2RTU+kxYOJHbM179xIhJBBgRAgAJBQJGmpb7AhsMAAoJECsAIluS
PHki5rsAn3pWYanPM6t3szOm83COmjvO5G1uAJ0eTw56NLVWSvq26YwxFAIXKbfB
pA==
=Ib9J
—–END PGP PUBLIC KEY BLOCK—–

Jak wysłać klucz publiczny na serwer?

gpg --keyserver wwwkeys.pgp.net --send-key 923C7922

Opcja --keyserver wskazuje serwer, na którym umieścimy nasz klucz, ja wybrałem wwwkeys.pgp.net. Większość serwerów publicznych, to maszyny odpowiednio ze sobą zsynchronizowane, tak więc nie ma potrzeby wysyłania swojego klucza na więcej niż jeden serwer.
Opcja --send-key pozwala nam na wyeksportowanie ID naszego klucza na serwer, w moim przypadku, jest to: 923C7922.

Dzięki temu, nasz znajomy będzie mógł sobie pobrać, nasz klucz publiczny z serwera, co też zresztą zostanie ukazane w poniższym przykładzie.

Jak pobrać klucz publiczny z serwera?

Załóżmy że nasz kolega, nazywa się Jan Kowalski. Jan korzystając z powyższego opisu, wyeksportował sobie swój klucz publiczny na serwer. Teraz prosimy go aby, podał nam ID swojego klucza. W moim przykładzie Jan napisał mi na gg: 5E68ACFA.Znając ID klucza Jana, możemy pobrać sobie z serwera jego klucz publiczny.

gpg --keyserver wwwkeys.pgp.net --recv-keys 5E68ACFA

gpg: requesting key 5E68ACFA from hkp server wwwkeys.pgp.net
gpg: key 5E68ACFA: public key „Jan Kowalski ” imported
gpg: Total number processed: 1
gpg: imported: 1

W jaki sposób wyświetlić listę kluczy?

Wszystkie klucze publiczne, które znajdują się w naszej bazie danych oraz ich ID możemy w każdej chwili sprawdzić za pomocą polecenia:

gpg --list-keys

pub 1024D/923C7922 2007-07-15
uid Cordial cordial01 [at] gmail [dot] com

pub 1024D/5E68ACFA 2007-06-30 [expires: 2008-06-29]
uid Jan Kowalski jan.kowalski [at] interia [dot] pl

Jak sprawdzić autentyczność klucza?

Dla upewnienia się, że klucz który znajduje się w naszej bazie jest autentyczny, wykonujemy następującą komendę:

gpg --fingerprint jan.kowalski [at] interia [dot] pl

pub 1024D/5E68ACFA 2007-06-30 [expires: 2008-06-29]
Key fingerprint = BB3F 4797 20G0 B94E 4C1D 8964 578A 0A6D 5E68 ACFA
uid jan.kowalski
sub 1024g/461465F0 2007-06-30 [expires: 2008-06-29]

Następnie rozmawiając z Janem Kowalskim osobiście, czy też np. telefoniczne proszę go o potwierdzenie „key fingerprint”.
Gdy wszystko się zgadza, możemy podpisać klucz:

gpg --sign-key jan.kowalski [at] interia [dot] pl

pub 1024D/5E68ACFA created: 2007-06-30 expires: 2008-06-29 usage: SC
trust: unknown validity: unknown
sub 1024g/461465F0 created: 2007-06-30 expires: 2008-06-29 usage: E
[ unknown] (1). Jan Kowalski
pub 1024D/5E68ACFA created: 2007-06-30 expires: 2008-06-29 usage: SC
trust: unknown validity: unknown
Primary key fingerprint: BB3F 4797 20G0 B94E 4C1D 8964 578A 0A6D 5E68 ACFA
Jan Kowalski
This key is due to expire on 2008-06-29.
Are you sure that you want to sign this key with your
key „Cordial ” (923C7922)
Really sign? (y/N) y

Jesteśmy pytani, czy napewno podpisać, potwierdzamy.

You need a passphrase to unlock the secret key for
user: „Cordial cordial01 [at] gmail [dot] com”

Wpisujemy dla potwierdzenia podaną uprzednio frazę.

Jak zaszyfrować wiadomość?

gpg --encrypt --sign --armor --recipient jan.kowalski [at] interia [dot] pl ./nasza_wiadomosc

W tym przykładzie nazwą pliku jest „nasza_wiadomosc”. Teraz w naszym bieżącym katalogu powinien pojawić się zaszyfrowany plik nasza_wiadmomosc.asc

ls -l
nasza_wiadomosc.asc

Teraz wysyłamy do Jana Kowalskiego, zaszyfrowany plik nasza_wiadomosc.asc. Jan Kowalski może rozszyfrować, wiadomość od nas wydając polecenie:

gpg --output nazwa_pliku --decrypt ./nasza_wiadomosc.asc

Pisząc niniejsze howto, korzystałem z:

man gpg,
Książek: „100 sposóbów na Linux” i „Sieci Komputerowe” A.S. Tanenbaum,
Stron WWW: 7thguard.net, Architektura klucza publicznego w GPG
oraz Wikipedia, GPG

Na koniec, podziękowania dla Xemiego, który robił tutaj za Jana Kowalskiego.

Miłego szyfrowania.
Pozdr.