Šifrování pomocí GPG
GnuPG je program umožňující používat asymetrickou kryptografii založenou na využívání dvou klíčů: privátního a veřejného. Zatímco privátní klíč je uchováván v tajnosti, veřejný klíč je volně dostupný. Oba klíče jsou vytvářeny společně, ale z jednoho nelze odvodit druhý (proto je možné dávat veřejný klíč volně k dispozici). Program gpg
je opensource nástupce komerčního programu PGP.
Úvod
Program gpg
má pouze textové rozhraní. Pro grafické uživatelské rozhraní existují nadstavby, například Kleopatra (pro Linux i Windows), Seahorse pro GNOME, KGPG pro KDE. Klienti pro elektronickou poštu používají GPG pomocí pluginů (Outlook používá plugin Enigmail nebo ji mají vestavěnou jako Mozilla Thunderbird (od roku 2019). Dále se budeme věnovat pouze nástroji gpg
pro příkazový řádek.
Generování klíčů
Při generování klíčů je využit generátor náhodných čísel, který těží entropii z vnějšího prostředí (při nedostatku entropie trvá generování dlouho, doporučuji generovat síťový provoz, hýbat myší, psát na klávesnici). Pokud by nebylo náhodné číslo dostatečně náhodné, kvalita klíčů by byla nízká (šly by například uhádnout). Klíče jsou jednoznačně identifikovány svým hashem (otisk, fingerprint). Spojení s osobou je pomocí jména, příjmení a e-mailové adresy (v pokročilém režimu lze vyplnit komentář, který může upřesnit účel klíče). Klíč lze nahrát na server s klíči, čímž vznikne vaše digitální identita. Tuto identitu obvykle postupně potvrzují ostatní uživatelé pomocí sítí důvěry tím, že váš klíč podepisují (viz Setkání s podepisováním klíčů).
Klíčenka
Klíče se ukládají na vaši vlastní klíčenku (v Linuxu do vašeho domácího adresáře do ~/.gnupg
). Smazáním tohoto adresáře kompletně odstraníte celou klíčenku. Klíčenka může být bezpečněji umístěna na smartcard, která podporuje OpenPGP standard (např. některé modely YubiKey). Při přenášení klíčů je vhodnější klíče exportovat než kopírovat celý adresář klíčenky, protože při importu dochází ke slučování do klíčenky, nikoliv přepsání jejího obsahu.
Hlavní klíč a podklíče
GPG generuje standardně tzv. hlavní klíč (masterkey) a k němu jeden podklíč (subkey). Hlavní klíč tvoří vaši identitu a slouží i k podepisování hlavních klíčů ostatních uživatelů využívajících sítě důvěry. Proto je privátní klíč od hlavního klíče potřeba velmi pečlivě chránit heslovou frází (dlouhým heslem) a nejlépe uložením mimo počítače připojené k internetu. V případě kompromitace privátního klíče od hlavního klíče by se za vás mohl kdokoliv vydávat (kompromitace znamená, že klíč někdo zkopíruje). Kompromitace hlavního klíče znamená, že vaše identita a důvěra v ní skončila a musíte si vybudovat novou (od nuly). Hlavní klíč i podklíče sdílí stejnou heslovou frázi.
Kompromitace klíče
Kvůli riziku kompromitace klíče a postupnému stárnutí šifer (už nejsou považovány za bezpečné) je velmi vhodné omezit platnost klíče. Platnost klíče se dá v případě potřeby prodlužovat. V případě kompromitace je možné klíč zneplatnit (odvolat klíč) vytvořením certifikátu (pomocí hlavního klíče) a jeho nahráním na server s klíči. Certifikát pro zneplatnění klíče je proto vhodné vytvořit hned po vygenerování klíčů a pečlivě uložit mimo počítač (vypálit na CD, USB flash, vytisknout a podobně), protože v případě ztráty privátního klíče už nejde certifikát vytvořit a tím ani zneplatnit klíče.
Hlavní klíč umožňuje libovolné vytváření a zneplatňování podklíčů, které pod něj patří a umožňuje i prodlužování jeho platnosti. Je možné do něj přidávat další e-mailové adresy, případně je zneplatňovat.
Základy
Základní informace zjistíme pomocí gpg --version
:
$ gpg --version gpg (GnuPG) 2.2.27 libgcrypt 1.9.4 Copyright (C) 2021 Free Software Foundation, Inc. License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Home: /home/<váš_login>/.gnupg Supported algorithms: Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256 Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 Compression: Uncompressed, ZIP, ZLIB, BZIP2
Výpis klíčů na klíčence
Seznam všech veřejných klíčů na vaší klíčence:
gpg --list-keys gpg --list-public-keys
Seznam veřejných klíčů včetně hashů (otisků) u subklíčů
gpg --list-keys --with-subkey-fingerprint
Seznam všech privátních klíčů na vaší klíčence:
gpg --list-secret-keys
Seznam všech podpisů pod všemi veřejnými klíči vytvořenými v rámci sítí důvěry:
gpg --with-sig-list --list-keys
Význam výstupu
V následujícím příkladu vypíši svůj vlastní klíč. Protože jich mám v klíčence více, uvedu jeho identifikátor. Identifikátorem může být celý hash (otisk, fingerprint), ale i jeho část (používá se posledních 16 nebo 8 cifer, tj. posledních 8 nebo 4 bajty). Lze použít celky nebo části e-mailové adresy, nebo jména.
$ gpg --list-keys A58D24F9DC29F4B153FF85D576C0B465FE7BEE98 pub ed25519 2023-12-08 [SC] [expires: 2033-12-05] A58D24F9DC29F4B153FF85D576C0B465FE7BEE98 uid [ultimate] Milan Kerslager <milan.kerslager@seznam.cz> uid [ultimate] Milan Kerslager <milan.kerslager@pslib.cz> uid [ultimate] Milan Kerslager <milan.kerslager@gmail.com> sub cv25519 2023-12-08 [E] [expires: 2026-12-07]
Ve výpisu je postupně uvedeno:
- pub – veřejný hlavní klíč
- ed25519 – použitý algoritmus
- datum vzniku klíče
- [SC] – co klíč umí (příznaky), u master klíče musí být vždy alespoň tyto dva
- C (Certify) – podepisování jiných klíčů
- S (Sign) – vytváření elektronického podpisu
- E (Encrypt) – šifrování
- A (Auth) – autentizace (tj. přihlašování pro SSH klíče)
- expirace klíče (lze prodloužit)
- část hashe klíče (otisk, fingerprint), tj. jednoznačného identifikátoru klíče
- uid – uživatelovy identifikátory
- [ultimate] – důvěryhodnost identifikátoru v klíčence (pro naše potřeby)
- unknown = Zatím nenastaveno (0?)
- undefined = Nevím nebo neřeknu (1)
- never = Klíči NEVĚŘÍM (2)
- marginal = Věřím klíči jen trochu (3)
- full = Klíč jsem ověřil (4)
- ultimate = Moje vlastní klíče (5)
- sub – subklíče (klíče podřazené hlavnímu klíči, lze je přidávat/zneplatňovat)
- význam dalších položek u subklíčů je jako u řádku pub
Generování klíčů
Při generování páru klíčů lze využít jednoduchou metodu:
gpg --gen-key
Nebo využít možnosti změny parametrů (např. komentář ke klíči):
gpg --full-generate-key
Pokud nemáte staré zařízení (např. YubiKey 4, které podporuje jen šifru RSA), doporučuji používat šifry nad eliptickými křivkami (EdDSA – ed25519):
gpg --expert --full-generate-key - zvolit ECC and ECC => 9 a Curve 25519 => 1 - zvolte vhodnou platnost (dá se dodatečně prodloužit, např. 3 roky) => 3y - jméno a příjmení, nedoporučuji používat čárky a háčky (nelze dodatečně změnit, jen přidat/zneplatnit) - e-mailová adresa identifikuje vaši osobu (jeden e-mail může být v různých klíčích) - komentář je například upřesnění účelu klíče (nelze dodatečně změnit, jen přidat/zneplatnit) - heslová fráze chrání váš privátní klíč
Podepisování dokumentu
K vytvoření elektronického podpisu je potřeba privátní klíč. Pokud neuvedete jaký, prohledá program GPG klíčenku a použije buď první klíč nebo klíč určený volbou --default-key
. Pokud chcete použít nějaký konkrétní klíč, použijte přepínač -u
, resp. --local-user
. Příklad předpokládá, že existuje soubor dopis.txt s nějakým obsahem:
gpg --sign dopis.txt
Příkaz vytvoří soubor dopis.txt.gpg
s odpojeným elektronickým podpisem (binární soubor). Tento postup se využívá v případech, že nelze elektronický podpis k datům přímo připojit (např. k obrázku, ISO souboru a podobně).
Pokud byste chtěli vytvořit čitelný (resp. tisknutelný) podpis, použijte volbu --clearsign
, která vytvoří soubor dopis.txt.asc
obsahující jak text dopisu, tak vložení podpis, který je zakódovaný pomocí Base64 (Base64 je veřejně známý postup, jak binární obsah zakódovat do ASCII znaků a zpět, používá se v e-mailech společně se standardem MIME).
gpg --clearsign dopis.txt
Data i podpis jsou odděleny značkami, které je nutné zachovat, aby byla umožněna následná kontrola podpisu:
$ cat dopis.txt.asc -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Ahoj babi, prachy došly, nové pošli. Tvůj René -----BEGIN PGP SIGNATURE----- iHUEARYIAB0WIQROwSBCbBUoDbgPcYky5PJM52HEVQUCZXV/VwAKCRAy5PJM52HE VTqUAQClBWCQ6E/u3thV7n6y3LACa2GBCWwDMI6q6TEY7MZZPwEAu4dyRPbGZEsd nkfoAC0gj7E2KfOx6wTbAczd1NHqQA4= =U7WQ -----END PGP SIGNATURE-----
Kontrola podpisu
Kontrola podpisu z prvního výše uvedeného příkladu se provádí pomocí volby --verify
, kterému předložíme soubor s odpojeným podpisem. GPG se pokusí najít soubor s podepsanými daty tak, že odebere příponu, ale tento postup není doporučen. Správně by se měl soubor s daty dodat jako druhý parametr.
gpg --verify dopis.txt.gpg gpg --verify dopis.txt.gpg dopis.txt
V druhém příkladu je vše v jednom souboru, stačí tedy jen jeden parametr:
$ gpg --verify dopis.txt.asc gpg: Signature made Sun Dec 10 10:05:27 2023 CET gpg: using EDDSA key 4EC120426C15280DB80F718932E4F24CE761C455 gpg: Good signature from "Milan Kerslager <milan.kerslager@seznam.cz>" [ultimate]
Výše uvedený výstup obsahuje popis elektronického podpisu (kdy a jakým klíčem byl vytvořen). Slovní spojení Good signature značí, že došlo k úspěšnému matematickému ověření podpisu. Dále je uvedena identifikace uživatele použitého klíče a vámi nastavená úroveň důvěry v to, že je skutečně majitelem klíče.
Šifrování dokumentu
Dokument lze zašifrovat pomocí volby --encrypt
. Pokud není příjemce určen pomocí --recipient
(resp. -r
) nebo --default-recipient
, GPG se zeptá na jeho identifikaci (lze použít jméno, e-mail i hash klíče):
gpg --recipient Milan --encrypt dopis.txt file dopis.txt.pgp dopis.txt.gpg: data
Pokud je potřeba čitelný výstup zakódovaný do Base64, je možné použít volbu --armor
:
$ gpg -r Milan --armor --encrypt dopis.txt $ cat dopis.txt.asc -----BEGIN PGP MESSAGE----- hF4DZYWc6bUgGf0SAQdATY+ts6PzIaxJDANFt8Ej4C5SywAfgv+tZyWITxwIzn4w cOODrGKQtAZLjOq7Dd3tiuXm4e7nki1sCbvvthpPnzB/zzg+qdDFdqPalv5kgAiL 0ncBWS+hWO3nwZmRsCmCupu75TzATk+Omoz00oITDMhEKu6Qa5SwXOuTfxG7kErF gkk1tl70250boWpCGWCIn+t64MvKQZJBIWguai9W+siJbbRuyO6ha5ApdQT2vU0m TL+eCWDzeN631Xk2o63dpGJ4P4k6/iCvNw== =xEHK -----END PGP MESSAGE-----
Uvnitř zakódované zprávy je uveden klíč příjemce. Pokud bychom chtěli omezit možnost zjištění příjemce pomocí odposlechnutí síťového provozu, lze identifikaci klíče potlačit pomocí --hidden-recipient
(resp. -R
):
$ gpg -R Milan --armor --encrypt dopis.txt $ cat dopis.txt.asc -----BEGIN PGP MESSAGE----- hF4DAAAAAAAAAAASAQdA3U/oBR17qB43fextvrP020MPg3Mbf9rfP2fEHG5VogYw C9KBUOkDEx4NyF3Q2F3KvX2nZRh/Sg8MPS+Vd+sjBRBokv/o1MbI4s0ym3ESHbQs 0ncB3x/lvZNVySjM4FaZagBRRd2DFyFtRdjRez8u3trttYhMO64ZCy7TOsZQ+RUb h17GvLwnYzNuI9oGg6W0dUVWCvc08iS/gXia9oIRQShAy70GmamS/ZI3ENWVByzO 57wt3I6Cbg5AYuKnWobQyJ6Kbs1Nxi8xMw== =NS62 -----END PGP MESSAGE-----
Dešifrování dokumentu
Dešifrování provádíme pomocí volby --decrypt
(resp. -d
), přičemž je výstup směrován na obrazovku.
$ gpg --decrypt dopis.txt.asc gpg: encrypted with 255-bit ECDH key, ID 65859CE9B52019FD, created 2023-12-08 "Milan Kerslager <milan.kerslager@seznam.cz>" Ahoj babi, prachy došly, nové pošli. Tvůj René
Chceme-li výstup uložit, lze použít volbu --output
(resp. -o
), která musí být uvedena před volbou dešifrovat, nebo přesměrování:
gpg --output --decrypt dopis.txt.asc gpg --decrypt dopis.txt.asc > new.asc
Podepsání a zašifrování dokumentu
Podepsání a zašifrování lze sloučit do jednoho kroku:
$ gpg --sign --recipient Milan --encrypt dopis.txt $ file dopis.txt.gpg dopis.txt.gpg: data
Dešifrování a kontrola podpisu
Při dešifrování je automaticky zkontrolován i vložený podpis:
$ gpg --decrypt dopis.txt.gpg gpg: encrypted with 255-bit ECDH key, ID 65859CE9B52019FD, created 2023-12-08 "Milan Kerslager <milan.kerslager@seznam.cz>" Ahoj babi, prachy došly, nové pošli. Tvůj René gpg: Signature made Sun Dec 10 11:03:40 2023 CET gpg: using EDDSA key 4EC120426C15280DB80F718932E4F24CE761C455 gpg: Good signature from "Milan Kerslager <milan.kerslager@seznam.cz>" [ultimate]
Správa klíčů v klíčence
TODO
Stahování klíčů
Mazání klíčů
Export klíčů
Import klíčů
Nahrávání na server s klíč
Aktualizace klíčů v klíčence
Nastavení důvěryhodnosti klíčů
Úprava klíčů
Podepisování klíčů
Podepisování klíčů za účelem vytvoření Sítě důvěry se dělá pomocí Setkání s podepisováním klíčů. Aby byla síť důvěry funkční, je potřeba zajistit, že nepodepíšeme podvržený klíč. Proto se postupuje takto:
- Vytvoříme si vlastní kvalitní klíče, které chceme využívat pro potvrzení naší identity (viz začátek textu)
- Požádáme majitele klíčů (René), které chceme podepsat, aby nám napsal na papírek hash (otisk, fingerprint) master klíče společně s jeho identitou (jméno a e-mail)
- důkladně si ověříme, že identita majitele je shodná s tím, co je uvedeno na papírku (např. pomocí občanského průkazu nebo tím, že ho známe či ho zná někdo, komu velmi důvěřujeme).
- odneseme si papírek na místo, kde máme k dispozici dobře chráněné klíče své vlastní identity
- nikdy nepodepisujeme cizí klíče přímo na místě, kde je více lidí
- nikdy nenosíme privátní klíč svého masterklíče (své digitální identity) na místo, kde je více lidí
- stáhneme si klíč Reného (pomocí celého hashe nebo posledních 8 či 16 znaků jeho hexadecimálního otisku) ze serveru s klíči (buď implicitní nebo jiný):
-
gpg --recv-keys 1234567890ABCDEF
-
gpg --keyserver keyserver.ubuntu.com --recv-keys 1234567890ABCDEF
-
gpg --keyserver pgp.mit.edu --recv-keys 1234567890ABCDEF
-
- pečlivě zkontrolujeme přijatý klíč s obsahem papírku (hash, jméno, e-mail)
- klíč podepíšeme:
-
gpg --sign-key 1234567890ABCDEF
-
- Není vhodné posílat klíč na server s klíči, protože není ověřena jeho autenticita majitelem, viz např. zde nebo zde (caff)
- podepsaný veřejný klíč Reného vyexportujeme, podepíšeme a zašifrujeme:
-
gpg -a --export 1234567890ABCDEF | gpg -se -r 1234567890ABCDEF > 1234567890ABCDEF.asc.pgp
-
- pošleme klíč Renému na jeho e-mailovou adresu (nejlépe na tu uvedenou v jeho klíči jako hlavní) – tj. pošleme soubor
1234567890ABCDEF.asc.pgp
- René dešifruje svůj přijatý klíč a pečlivě ho zkontroluje včetně vloženého podpisu:
-
gpg --decrypt 1234567890ABCDEF.asc.pgp
-
- pokud je vše v pořádku, René naimportuje přijatý klíč do své klíčenky, čímž dojde ke spojení s již uloženým:
-
gpg --import 1234567890ABCDEF.asc
-
- je-li spokojen s výsledkem, může svůj masterklíč poslat na různé servery s klíči:
-
gpg --send-keys 1234567890ABCDEF
-
gpg --keyserver pgp.mit.edu --send-keys 1234567890ABCDEF
-
gpg --keyserver keyserver.ubuntu.com --send-keys 1234567890ABCDEF
-
- po nějaké chvíli (resp. druhý den) můžeme na serverech klíč zkontrolovat:
- ostatní mohou po nějaké době aktualizovat klíč ve svých klíčenkách:
-
gpg --refresh-keys 1234567890ABCDEF
- nebo celou klíčenku:
gpg --refresh-keys
-
Mapa vztahů mezi klíči
Mapu vztahů vašeho klíče lze zobrazit dle návodu na stránce nástroje caff.
gpg --list-sigs | sig2dot | xdot