GnuPG/Szyfrowanie i deszyfrowanie plików

We wcześniejszej części artykułu było opisane, jak zaimportować czyjś klucz publiczny. Teraz pokażę, jak za jego pomocą zaszyfrować dokument. Z technicznego punktu widzenia nie ma znaczenia jaki rodzaj pliku szyfrujemy (może to być tekst, plik graficzny czy muzyczny), najczęściej jednak są to dokumenty tekstowe. Do szyfrowania używamy opcji --encrypt. Jako parametr tej opcji możemy podać nazwę pliku do zaszyfrowania (w takim wypadku opcja ta powinna zostać podana jako ostatnia), w przeciwnym wypadku dane zostaną wczytane ze standardowego wejścia. Za pomocą opcji --output możemy określić nazwę pliku wyjściowego. Jeśli tego nie zrobimy, wynikiem będzie plik o nazwie stworzonej z nazwy pliku wejściowego z sufiksem .gpg. Klucz publiczny można ustalić za pomocą opcji --recipient, która przyjmuje jako argument identyfikator użytkownika. Jeśli chcemy zaszyfrować wiadomość do wielu użytkowników, musimy ich podać osobno, za każdym razem używająć --recipient. Jeśli nie zostanie ustalony żaden klucz publiczny, program poprosi o ustalenie odbiorców. Pamiętaj, że jeśli nie podasz swojego klucza publicznego w liście kluczy odbiorców, nie będziesz mógł odszyfrować wiadomości, którą zaszyfrowałeś. Poniżej pokazuję jak to wygląda w praktyce.

 $ gpg --output /tmp/widomosc.gpg --encrypt /tmp/wiadomosc.txt
 Nie został podany identyfikatora użytkownika (np za pomocą ,,-r)
 
 Identyfikator użytkownika (pusta linia oznacza koniec): mr_K
 Added 1024g/E9B3B634 2004-02-07 "Krzysztof Adamski <mr_K@interia.pl>"
 
 Identyfikator użytkownika (pusta linia oznacza koniec):
 $ file /tmp/widomosc.gpg
 /tmp/widomosc.gpg: data
 $

Jak można było zauważyć w przykładzie przytoczonym przed chwilą, plik wynikowy zawiera dane w formacie binarnym. Jeśli chcemy żeby zamiast tego wynik był w formacie tekstu, tak żebyśmy mogli go na przykład wkleić do wiadomości e-mail, musimy użyć opcji --armour. Przykład podaję poniżej.

 $ gpg --armour --output /tmp/wiadomosc2.gpg -r mr_K --encrypt /tmp/wiadomosc.txt
 
 $ cat /tmp/widomosc2.gpg
 -----BEGIN PGP MESSAGE-----
 Version: GnuPG v1.2.6 (GNU/Linux)
 
 hQEOA6X+L6Tps7Y0EAP+JsSr0WOVY3oKio93Osw/x+L3fvrvphWZbeE+fYPZuXzc
 K7j8LrkJJlyBFmE7ZYJnrGyywU+d+OCnCYwpj68FSVrWUx3RP6HWFsLTMRxKgTbm
 XCr8AzZ7KV/U4/ZGdCh3QAjoUb9v4YhNcSB9P9IaAS/y7Xt18u7tzte53pAtgiED
 /R70N5bTxatlc8MQ3xvIHUUWyJ+UaNHAaxskA6lytcJ5pYEgYuRof1PVsmeLaDIT
 WLnaNxJf4d71MT4pmdxiYc38UXhbvxXA0GAuVKRuWtbk7flFu0GzYOB+kpa0SVeK
 P6SKKtvVLJsHQgLG0popGAHOC/MOICN23HDeBh9rSzh00k0BttGocgWyac35yBXb
 nuNCLo+Cv8oBLn7ik/PAISdwh5iu7VK75WxNmp/VWWYs0i+LXmr3ecEzYvmdRYfR
 fCCxYihBTBdmGV+4E7v3yg==
 =LwSl
 -----END PGP MESSAGE-----
 $

Do deszyfrowania plików służy opcja --decrypt, która podobnie jak --encrypt pobiera jako argument nazwę pliku do rozszyfrowania. Jak poprzednio, za pomocą opcji --output można określić nazwę pliku wynikowego. Gdy nie jest on określony, wynik wypisywany jest na standardowe wyjście. Oto przykład:

 $ gpg --decrypt /tmp/wiadomosc2.gpg
 
 Musisz podać hasło aby odbezpieczyć klucz prywatny użytkownika:
 "Krzysztof Adamski <mr_K@interia.pl>"
 długość 1024 bitów, typ ELG-E, numer E9B3B634, stworzony 2004-02-07 (podklucz D82E0E4B)
 
 gpg: zaszyfrowano 1024-bitowym kluczem ELG-E, numer E9B3B634, stworzonym 2004-02-07
      "Krzysztof Adamski >mr_K@interia.pl<"
 
 wiadomość
 $

Istnieje również możliwość zaszyfrowania danych bez klucza publicznego, za pomocą szyfrowania symetrycznego. W takim wypadku plik jest szyfrowany za pomocą podanego hasła, które wymagane jest oczywiście w procesie deszyfrowania. Ze względów bezpieczeństwa nie powinieneś używać tego samego hasła, które chroni Twój klucz prywatny. Aby zaszyfrować plik w ten sposób, powinieneś użyć opcji --symmetric, która podobnie jak poprzednie posiada opcjonalny argument określający nazwę pliku do zaszyfrowania. Również w tym przypadku możesz użyć opcji --armour. Oto przykład:

 $ gpg --armour --output /tmp/wiadomosc-sym.gpg --symmetric /tmp/wiadomosc.txt
 $ file /tmp/wiadomosc-sym.gpg
 /tmp/wiadomosc-sym.gpg: PGP armored data message
 $ 


Wysyłanie zaszyfrowanej wiadomościEdytuj

Wyobraźmy sobie, że stworzyliśmy Łukaszowi konto na naszym serwerze. Chłopak się ucieszył, ale my mamy poważny problem. Jak przesłać mu w bezpieczny sposób nowy login oraz hasło dostępowe?! Nierozsądne byłoby w tym momencie wysyłanie tak poufnych danych w postaci jawnej przez sieć. Oczywiście i tym razem z pomocą przychodzi nam GnuPG. Stajemy teraz przed potrzebą zaszyfrowania całej wiadomości. Jest to wbrew pozorom operacja bardzo prosta. Całą treść poufnej wiadomości szyfrujemy używając klucza publicznego należącego do Łukasza i dopiero tak przygotowany kryptogram wysyłamy mu przez internet. Zauważmy, że w poprzednim przykładzie znajomość klucza publicznego odbiorcy nie była konieczna. Teraz nawet jeśli atakujący przechwyci naszą wiadomość, to bez znajomości klucza prywatnego kolegi na nic się mu ona nie przyda.

> Krok 1 - Importowanie klucza:

Załóżmy, że Łukasz wysłał nam wcześniej numer ID swojego klucza, teraz musimy go tylko w całości ściągnąć z serwera. Wydajemy więc polecenie:

[root@crusader root]# gpg --keyserver www.keys.pgp.net --recv-keys 3958260E gpg: key 3958260E: public key "Łukasz Kowalski " imported gpg: Total number processed: 1 gpg: imported: 1

Klucz o identyfikatorze 3958260E został pomyślnie zaimportowany. Jak widzimy w danych identyfikacyjnych, należy on do naszego kolegi. Teraz powinniśmy dla pewności zweryfikować nowy klucz oraz podpisać wspomnianą wyżej opcją --sign-key. Jeśli wszystko przebiegło pomyślnie, możemy przystąpić do szyfrowania naszego listu.