Dzisiaj przygotowałam mały poradnik 📖 dla tych, którzy dotychczas nie używali szyfrowania 🔐 wiadomości, nie posiadają swojego klucza 🔑 publicznego i nigdy nie podpisywali komunikacji elektronicznej 💻. Uwaga: tylko dla fanów terminala 😄.
Plan
W pracy zawodowej już kilkukrotnie spotkałam się z sytuacją, w której ktoś nie do końca wiedział, czym różni się GPG od PGP. Skróty są dość podobne, używane są też w podobnych kontekstach, dlatego warto zacząć od definicji, która pozwoli odróżnić jedno od drugiego.
W kolejnym kroku wygenerujemy nasz klucz. W rzeczywistości tworzenie klucza przy użyciu gpg oznacza utworzenie pary kluczy: klucza prywatnego oraz klucza publicznego. Klucz publiczny można opublikować (np. na swojej stronie domowej b ądź na serwerze kluczy).
Sprawdzimy więc, jak wygenerować do tego celu tekst “klucza publicznego”.
Definicja
GnuPG (Gnu Privacy Guard) jest pełną i wolną implementacją standardu OpenPGP (Pretty Good Privacy) zdefiniowanego przez RFC4880 znanego pod nazwą PGP.
Zapamiętaj
- PGP to nazwa standardu opisanego w dokumencie RFC4880
- GnuPG to wolna implementacja tego standardu
Do dzieła!
Generowanie pary kluczy
Aby wygenerować parę kluczy (publiczny i prywatny), przejdź do wiersza poleceń w Twoim ulubionym terminalu i wprowadź polecenie:
gpg --full-generate-key (lub - w zależności od wersji gpg - gpg --gen-key)
Porada
GPG jest domyślnie instalowany w większości dystrybucji Linuksa. Jeśli jednak gpg nie jest zainstalowany, na Ubuntu czy Debianie możesz wpisać:
1
2
|
sudo apt-get update
sudo apt-get install gnupg
|
Wprowadź swoje dane, wybierz długość klucza (4096) i czas ważności klucza (np. 2 lata).
Pamiętaj o tym, aby ochronić swoje klucze mocnym hasłem (przeczytaj w tym artykule (ang.), dlaczego niektóre sprytne sztuczki z zapamiętywaniem haseł nie działają). Patrz Generowanie hasła poniżej.
Uwaga
NIGDY nie podawaj nikomu swojego klucza prywatnego!
Przykładowa sesja
Zobacz, jak wygląda przykładowa sesja tworzenia klucza. Utworzyłam klucz dla pana Grzegorza, który jest ważny 2 lata:
Program gpg wygenerował przy okazji certyfikat unieważenienia, który przyda mi się podczas usuwania klucza. Patrz: Usuwanie klucza poniżej.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
$ gpg --full-generate-key
gpg (GnuPG) 2.4.4; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Proszę wybrać rodzaj klucza:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (tylko do podpisywania)
(14) Existing key from card
Twój wybór?
Proszę wybrać rodzaj krzywej eliptycznej:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Twój wybór?
Okres ważności klucza.
0 = klucz nie ma określonego terminu ważności
<n> = termin ważności klucza upływa za n dni
<n>w = termin ważności klucza upływa za n tygodni
<n>m = termin ważności klucza upływa za n miesięcy
<n>y = termin ważności klucza upływa za n lat
Okres ważności klucza? (0) 2y
Klucz traci ważność sob, 17 kwi 2027, 06:27:14 CEST
Czy wszystko się zgadza (t/N)? t
GnuPG musi utworzyć identyfikator użytkownika do identyfikacji klucza.
Imię i nazwisko: Grzegorz Brzęczyszczykiewicz
Adres poczty elektronicznej: grzegorz.brzęczyszczykiewicz
To nie jest poprawny adres poczty elektronicznej
Adres poczty elektronicznej: grzegorz@brzęczyszczykiewicz.pl
Komentarz: To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com
Używany zestaw znaków: „utf-8”.
Twój identyfikator użytkownika będzie wyglądał tak:
"Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>"
Zmienić (I)mię/nazwisko, (K)omentarz, adres (E)mail, przejść (D)alej,
czy (W)yjść z programu? d
Musimy wygenerować dużo losowych bajtów. Dobrym pomysłem aby pomóc komputerowi
podczas generowania liczb pierwszych jest wykonywanie w tym czasie innych
działań (pisanie na klawiaturze, poruszanie myszką, odwołanie się do dysków);
dzięki temu generator liczb losowych ma możliwość zebrania odpowiedniej ilości
entropii.
Musimy wygenerować dużo losowych bajtów. Dobrym pomysłem aby pomóc komputerowi
podczas generowania liczb pierwszych jest wykonywanie w tym czasie innych
działań (pisanie na klawiaturze, poruszanie myszką, odwołanie się do dysków);
dzięki temu generator liczb losowych ma możliwość zebrania odpowiedniej ilości
entropii.
gpg: certyfikat unieważnienia został zapisany jako „/home/karma/.gnupg/openpgp-revocs.d/96D59C4A95680BAFE2A9A993E0C044266F026A36.rev”
klucz publiczny i prywatny (tajny) zostały utworzone i podpisane.
pub ed25519 2025-04-17 [SC] [wygasa: 2027-04-17]
96D59C4A95680BAFE2A9A993E0C044266F026A36
uid Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
sub cv25519 2025-04-17 [E] [wygasa: 2027-04-17]
|
Uzyskanie ID klucza
Twój klucz posiada swój identyfikator, który będzie potrzebny podczas wykonywania różnych operacji związanych z szyfrowaniem czy podpisywaniem dokumentów. Aby sprawdzić swój indentyfikator, wykonaj operację
gpg --list-key [twój@email]. W ten sposób wyświetlisz informację o swoim kluczu publicznym (“pub”), w tym jego identyfikator będący napisem złożonym z liczb i znaków.
1
2
3
4
5
6
7
8
9
|
$ gpg --list-key grzegorz
gpg: sprawdzanie bazy zaufania
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: poziom: 0 poprawnych: 3 podpisanych: 0 zaufanie: 0-,0q,0n,0m,0f,3u
gpg: następne sprawdzanie bazy odbędzie się 2026-03-27
pub ed25519 2025-04-17 [SC] [wygasa: 2027-04-17]
96D59C4A95680BAFE2A9A993E0C044266F026A36
uid [ absolutne ] Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
sub cv25519 2025-04-17 [E] [wygasa: 2027-04-17]
|
Klucz Grzegorza posiada identyfikator 96D59C4A95680BAFE2A9A993E0C044266F026A36. Ten sam identyfikator, tylko podzielony na grupy po cztery cyfry szesnastkowe, otrzymamy wykonując polecenie gpg --fingerprint <email lub nazwa> :
1
2
3
4
5
|
$ gpg --fingerprint Grzegorz
pub ed25519 2025-04-17 [SC] [wygasa: 2027-04-17]
96D5 9C4A 9568 0BAF E2A9 A993 E0C0 4426 6F02 6A36
uid [ absolutne ] Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
sub cv25519 2025-04-17 [E] [wygasa: 2027-04-17]
|
Jak edytować klucz
Czasami potrzebujemy zmienić dane w naszym kluczu, na przykład chcemy zmienić datę wygaśnięcia klucza lub hasło; chcemy podpisać klucz lub dodać czy usunąć zwiazane z kluczem tożsamości (emaile) bądź zdjęcia.
1
2
|
gpg --edit-key <grzegorz@brzęczyszczykiewicz.pl>
gpg>
|
Jeśli pan Grzegrz chciałby dodać nowy adres mailowy, może użyć polecenia adduid. Będzie mógł posługiwać się dwoma tożsamościami. Oto sesja, w której dodaję tożsamość związaną z innym adresem mailowym, grześ@onet.pl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
$ gpg --edit-key grzegorz@brzęczyszczykiewicz.pl
gpg (GnuPG) 2.4.4; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Dostępny jest klucz tajny.
sec ed25519/E0C044266F026A36
utworzono: 2025-04-17 wygasa: 2027-04-17 użycie: SC
zaufanie: absolutne poprawność: absolutne
ssb cv25519/A50DDD657F932D6D
utworzono: 2025-04-17 wygasa: 2027-04-17 użycie: E
[ absolutne ] (1). Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
gpg> list
sec ed25519/E0C044266F026A36
utworzono: 2025-04-17 wygasa: 2027-04-17 użycie: SC
zaufanie: absolutne poprawność: absolutne
ssb cv25519/A50DDD657F932D6D
utworzono: 2025-04-17 wygasa: 2027-04-17 użycie: E
[ absolutne ] (1). Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
gpg> adduid
Imię i nazwisko: Grzegorz Brzęczyszczykiewicz
Adres poczty elektronicznej: grześ@onet.pl
Komentarz: Test
Używany zestaw znaków: „utf-8”.
Twój identyfikator użytkownika będzie wyglądał tak:
"Grzegorz Brzęczyszczykiewicz (Test) <grześ@onet.pl>"
Zmienić (I)mię/nazwisko, (K)omentarz, adres (E)mail, przejść (D)alej,
czy (W)yjść z programu? K
Komentarz: Testowy komentarz
Używany zestaw znaków: „utf-8”.
Twój identyfikator użytkownika będzie wyglądał tak:
"Grzegorz Brzęczyszczykiewicz (Testowy komentarz) <grześ@onet.pl>"
Zmienić (I)mię/nazwisko, (K)omentarz, adres (E)mail, przejść (D)alej,
czy (W)yjść z programu? D
sec ed25519/E0C044266F026A36
utworzono: 2025-04-17 wygasa: 2027-04-17 użycie: SC
zaufanie: absolutne poprawność: absolutne
ssb cv25519/A50DDD657F932D6D
utworzono: 2025-04-17 wygasa: 2027-04-17 użycie: E
[ absolutne ] (1) Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
[ nieznane ] (2). Grzegorz Brzęczyszczykiewicz (Testowy komentarz) <grześ@onet.pl>
gpg> quit
Zapisać zmiany? (t/N) t
|
Po zapisaniu zmian można sprawdzić, ze teraz istnieją dwie tożsamości:
1
2
3
4
5
6
|
$ gpg --list-key grzegorz
pub ed25519 2025-04-17 [SC] [wygasa: 2027-04-17]
96D59C4A95680BAFE2A9A993E0C044266F026A36
uid [ absolutne ] Grzegorz Brzęczyszczykiewicz (Testowy komentarz) <grześ@onet.pl>
uid [ absolutne ] Grzegorz Brzęczyszczykiewicz (To jest klucz do usunięcia, wykorzystany jedynie dla celów edukacyjnych na blogu kamilachyla.com) <grzegorz@brzęczyszczykiewicz.pl>
sub cv25519 2025-04-17 [E] [wygasa: 2027-04-17]
|
Jak wyeksportować klucz publiczny
Aby wyeksportować swój klucz publiczny do pliku, użyj opcji --export i podaj id klucza (lub jego fragment). Pan Grzegorz mógłby zrobić to na dwa sposoby:
gpg --output grzegorz.gpg --export grześ@onet.pl - utworzyłby plik binarny grzegorz.gpg zawierający klucz publiczny
gpg --armor --export grzegorz - zobaczyłby wypisany na wyjście standardowe klucz publiczny w formacie ASCII (który można przekierować do pliku, np. gpg --armor --export grześ > grzegorz.gpg)
1
2
3
4
5
6
7
8
9
10
|
$ gpg --armor --export grześ
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaACDjBYJKwYBBAHaRw8BAQdAIi2VephBbmBJrtPAZVLoWnXngNPHg1ufYE8D
[...]
aAuv4qmpk+DARCZvAmo2BQJoAIOMAhsMBQkDwmcAAAoJEODARCZvAmo2wzIBAIA9
FuaMUiwDMkCzUHo7vzx6aK0tvJHXzkRueGI2vyiBAQDGlP1Wa+S9L0e2iYLtNVbB
zM9unfpXKPHAl0MHkVsUBQ==
=6XfT
-----END PGP PUBLIC KEY BLOCK-----
|
Keyring i importowanie
Co to jest keyring
gpg przechowuje klucze w “pęku kluczy” (ang. keyring). Jest to baza kluczy, do której dodawane są generowane klucze (publiczny i prywatny) oraz klucze publiczne zaimportowane z zewnątrz.
Dlatego wiele operacji na kluczu (edycja, wypisanie skrótu etc.) wymaga podania identyfikatora użytkownika (lub jego fragmentu) - możemy bowiem dokonywać operacji na dowolnym z nich.
Jak zaimportować klucz publiczny
Do zaimportowania klucza, który od kogoś otrzymaliśmy, należy użyć polecenia gpg --import plik.gpg. Zaimportowany klucz należy sprawdzić: zweryfikować w wiarygodny sposób, że zgadza się odcisk/skrót klucza (operacja fpr), a jeśli się zgadza, można klucz podpisać (operacja sign).
Szyfrowanie
Jak zaszyfrować plik dla kogoś
Grzegorz może teraz zaszyfrować dokument. Załóżmy, że zaimportował do swojego keyringa mój klucz publiczny i chce wysłać do mnie zaszyfrowany plik o nazwie tajne.txt:
1
2
3
|
$ gpg output tajne.txt.gpg --encrypt --recipient kamila.chyla@gmail.com tajne.txt
$ ls tajne*
tajne.txt tajne.txt.gpg
|
Jeśli otrzymam tajne.txt.gpg w mailu i zaimportowałam klucz Grzegorza do mojego keyringa, wówczas mogę odszyfrować plik poleceniem:
1
2
3
|
$ gpg --output od_grzesia.txt --decrypt tajne.txt.gpg
$ /bin/cat od_grzesia.txt
Przyznaję, rozpętałem tę wojnę
|
Jak zaszyfrować plik dla siebie
Jeśli nie zamierzamy się nikim dzielić plikiem i chcemy go zaszyfrować hasłem, możemy użyć szyfrowania symetrycznego. Wówczas do zaszyfrowania zostanie użyty klucz pochodzący z hasła, którym zabezpieczymy szyfrowanie (i nie powinno to być to samo hasło, którym zabezpieczyliśmy klucz prywatny).
Na przykład, szyfruję mój plik zawierający pamiętnik:
1
2
3
|
$ gpg --output pam.gpg --symmetric pamiętnik.txt
$ ls pam*
pam.gpg pamiętnik.txt
|
… i odszyfrowuję:
1
|
gpg --output pamiętnik_odszyfrowany.txt --decrypt pam.gpg
|
Jak wygenerować hasło
Aby klucz prywatny był porządnie chroniony, należy wymyślić porządne hasło. A sprawa nie jest wcale prosta. Aby wygenerować hasło, możesz:
- użyć programu passwd - ale ciężko te hasła zapamiętać
- skorzystać z łatwiejszego do zapamiętania diceware (patrz xkcd), na przykład:
- klasycznie, rzucając kostką, lub
- możesz użyć tego prostego programu w Go (używającego go-diceware ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package main
import (
"log"
"strings"
"github.com/sethvargo/go-diceware/diceware"
)
func main() {
// Generate 6 words using the diceware algorithm.
list, err := diceware.Generate(6)
if err != nil {
log.Fatal(err)
}
log.Printf(strings.Join(list, "-"))
}
|
Usuwanie klucza
Po usunięciu klucza prywatnego nie jest możliwe odwołanie (ang. revocation) klucza. Oznacza to, że w przypadku “wycieku” klucza prywatnego ktoś będzie mógł się nim posłyżyć do niecnych celów. Aby temu zapobiec, właściciel klucza prywatnego ma możliwość wygenerowania i użycia certyfikatu unieważnienia klucza (czyli zaimportowania tego certyfikatu).
Po ponownym opublikowaniu swojego unieważnionego klucza na serwerze kluczy pozostałe osoby będą mogły odświeżyć klucze z serwera i przekonać się, że klucz został unieważniony.
W przypadku Grzegorza, jego klucz unieważniający został wygenerowany automatycznie, więc Grzegorz może unieważnić swój klucz (importując certyfikat unieważnienia).
Wcześniej jednak Grzegorz musi usunąć dwukropek z wiersza certyfikatu zawierającego tekst “BEGIN PGP PUBLIC KEY BLOCK”:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ gpg --list-keys
$ cat ~/.gnupg/openpgp-revocs.d/96D59C4A95680BAFE2A9A993E0C044266F026A36.rev
[...]
:-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: This is a revocation certificate
iHgEIBYKACAWIQSW1ZxKlWgLr+KpqZPgwEQmbwJqNgUCaACDmgIdAAAKCRDgwEQm
bwJqNhH1AP91ZD1BuNizetJ5LBP+tJ4l5k+Zd8FEpAv8POzGiHu1wgD9H76ppGnR
fY9f8/eTXK5Dvydf2U7UCD9vtkzqCCeOKQo=
=c2zr
-----END PGP PUBLIC KEY BLOCK-----
$ gpg -- import ~/.gnupg/openpgp-revocs.d/96D59C4A95680BAFE2A9A993E0C044266F026A36.rev
|
Następnie należy usunąć klucz prywatny i klucz publiczny:
1
2
|
$ gpg --delete-secret-key 96D59C4A95680BAFE2A9A993E0C044266F026A36
$ gpg --delete-key 96D59C4A95680BAFE2A9A993E0C044266F026A36
|
…sprawdzić, czy zostały usunięte z keyringa:
1
2
|
$ gpg --list-keys
$ gpg --list-secret-keys
|
…oraz usunąć automatycznie utworzony certyfikat:
1
|
$ rm ~/.gnupg/openpgp-revocs.d/96D59C4A95680BAFE2A9A993E0C044266F026A36.rev
|
Podsumowanie
W artykule przedstawiłam podstawowe polecenia programu gpg służące do utworzenia pary kluczy, edycji danych klucza, sprawdzania zawartości “pęku kluczy” (keyringa), Pokazałam również, jak zaszyfrować wiadomość do osoby, której klucz publiczny znamy, oraz jak zaszyfrować dowolny plik hasłem. Na koniec opisałam, jak usunąć klucz, którego nie chcemy już używać.
Mam nadzieję, że artykuł zachęcił Cię nie tylko do wygenerowania klucza, ale też do tego, aby zainwestować trochę czasu w poszerzenie swojej wiedzy na ten temat.
Użycie GPG do szyfrowania poczty to tylko mały krok na drodze do wzmocnienia swojej prywatności w internecie, ale krok bardzo istotny. Mocno zachęcam Cię, abyś ten krok uczynił(a).
Zasoby