Šifrování a podepisování souborů -------------------------------- V této kapitole se budeme věnovat dvěma využitím kryptografie s veřejným klíčem – šifrování a podepisování souborů. Podepisování souborů/zpráv ~~~~~~~~~~~~~~~~~~~~~~~~~~ Digitální podpis zajišťuje integritu a autenticitu posílaných dat. Příjemce si může ověřit, zda se data cestou nezměnila a kdo data odeslal, tj. čí soukromý klíč byl použit pro podepsání. Před ověřením podpisu musí příjemce získat veřejný klíč podepisujícího a měl by ověřit jeho platnost (viz následující kapitola TODO). .. figure:: ./media/pgp_image3.png :width: 6.3in :height: 4.38542in :align: center Podepsání zprávy a ověření podpisu. Podepsání souboru je jednoduché – zadáte přepínač ``--sign`` a jméno vstupního souboru: **gpg** **-\\-sign** [**-\\-armor**] [**-\\-output** *výstupní_soubor*] *soubor_k_podpisu* Při podepisování vznikne nový binární soubor, který obsahuje zkomprimovaná původní data a digitální podpis. Pokud nezadáte jméno výstupního souboru, tak se pro pojmenování vytvořeného souboru použije jméno původního souboru doplněné o koncovku ``.gpg``. Přepínač ``--armor`` zajistí převedení binárního výstupu do radix64 (viz kapitola TODO), soubor bude mít koncovku ``.asc``. .. code-block:: none :emphasize-lines: 1,2,3,4 :caption: Podepsání dvou souborů. Při podpisu vznikne nový soubor s komprimovaným původním obsahem a podpisem. Binární má koncovku .gpg, přepínač ``--armor`` zajistí převod do radix64 a koncovku .asc. gpg --sign soubor.txt … dotaz na heslo k soukromému klíči … gpg --sign --armor soubor2.txt ls -l -rw-r--r-- 1 pavlicek pavlicek 145390 Dec 7 21:00 soubor.txt -rw-r--r-- 1 pavlicek pavlicek 47009 Dec 7 21:01 soubor.txt.gpg -rw-r--r-- 1 pavlicek pavlicek 29043 Dec 7 21:09 soubor2.txt -rw-r--r-- 1 pavlicek pavlicek 14695 Dec 7 21:09 soubor2.txt.asc Při podepisování se program gpg zeptá na heslo k soukromému klíči. Ve verzi 2.1 programu se automaticky na pozadí spustí **gpg-agent**, který si soukromý klíč pamatuje v paměti. Po dobu 10 minut nemusíte znovu zadávat heslo k soukromému klíči. Podepsaný soubor se „rozbalí“ pomocí příkazu: **gpg** *podepsaný_soubor* Obnoví se původní soubor a současně se zkontroluje podpis. .. code-block:: none :emphasize-lines: 1,4,8,15 :caption: Rozbalení dvou podepsaných souborů. V prvním případe (soubor3.txt.gpg) nemáme veřejný klíč podepisujícího, ve druhém (soubor4.txt.gpg) veřejný klíč máme, ale (zatím) není platný. ls -l -rw-r--r-- 1 pavlicek pavlicek 9945 Dec 9 19:57 soubor3.txt.gpg -rw-r--r-- 1 pavlicek pavlicek 1119 Dec 9 19:59 soubor4.txt.gpg gpg soubor3.txt.gpg gpg: Signature made Fri 09 Dec 2016 07:57:21 PM CET gpg: using RSA key 8F43F7DD03E72450 gpg: Can't check signature: No public key gpg soubor4.txt.gpg gpg: Signature made Fri 09 Dec 2016 07:58:56 PM CET gpg: using RSA key 92001940314FDED5 gpg: Good signature from "Dr. Gall (R.U.R.) " [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: B697 1090 4644 0776 812A 804A 9200 1940 314F DED5 ls -l -rw-r--r-- 1 pavlicek pavlicek 25510 Dec 9 19:59 soubor3.txt -rw-r--r-- 1 pavlicek pavlicek 9945 Dec 9 19:57 soubor3.txt.gpg -rw-r--r-- 1 pavlicek pavlicek 1074 Dec 9 19:59 soubor4.txt -rw-r--r-- 1 pavlicek pavlicek 1119 Dec 9 19:59 soubor4.txt.gpg Při obnově a kontrole podpisu mohou nastat následující situace: - Máme platný veřejný klíč podepisujícího a podpis je v pořádku (*Good signature*). - Podpis je v pořádku, máme veřejný klíč podepisujícího, ale nevíme, zda patří správné osobě (*There is no indication that the signature belongs to the owner*). - Nemáme veřejný klíč podepisujícího (*No public key*). - Máme veřejný klíč podepisujícího, ale podpis není platný (*BAD signature*). - Chyba při přenosu, na kterou se přišlo díky kontrolním součtům (*CRC error*) či při dekompresi obsahu (*uncompressing failed*). Pouze v těchto případech se neobnoví původní soubor. Při zadání přepínače ``--verify`` se zkontroluje podpis bez obnovy původního souboru. **gpg -\\-verify** *podepsaný_soubor* Oddělený podpis ~~~~~~~~~~~~~~~ Digitální podpis může být i v odděleném (samostatném) souboru: **gpg -\\-detach-sign** [**-\\-armor**] [**-\\-output** *výstupní_soubor*] *soubor_k_podpisu* Pokud nezadáte jméno výstupního souboru, tak se ke jménu podepisovaného souboru doplní koncovka .sig. Přepínač ``--armor`` zajistí převedení binárního výstupu do radix64, koncovka bude ``.asc``. Oddělený podpis trochu komplikuje distribuci k příjemci, neboť zajištění přenosu dvou souborů je o trochu složitější než jednoho souboru. Při kontrole podpisu je potřeba zadat oba soubory – nejdříve soubor s podpisem a poté vlastní soubor **gpg -\\-verify** *soubor_s_podpisem podepisovaný_soubor* Oddělené podpisy umožňují podepsání souboru od více osob – každý vytvoří svůj oddělený podpis a ty se poté spojí dohromady. .. code-block:: none :emphasize-lines: 1,2,4,6 :caption: Podepsání souboru dvěma klíči (parametr –u specifikuje použitý privátní klíč, pokud jich uživatel má více), spojení podpisů a následná kontrola podpisů. Oba klíče jsou platné. gpg --detach-sign --output soubor5.sig1 -u 92001940314FDED5 soubor5.txt gpg --detach-sign --output soubor5.sig2 -u 4CEB66E448C0187B soubor5.txt cat soubor5.sig1 soubor5.sig2 > soubor5.sig gpg --verify soubor5.sig soubor5.txt gpg: Signature made Fri 09 Dec 2016 08:31:27 PM CET gpg: using RSA key 92001940314FDED5 gpg: Good signature from "Dr. Gall " [full] gpg: Signature made Fri 09 Dec 2016 08:31:55 PM CET gpg: using RSA key 4CEB66E448C0187B gpg: Good signature from "Robot Primus " [full] Šifrování souborů ~~~~~~~~~~~~~~~~~ OpenPGPG při šifrování kombinuje symetrickou šifru se šifrováním pomocí veřejného klíče. Vlastní zpráva se zašifruje symetrickou šifrou (např. AES-128) při použití jedinečného náhodného **klíč sezení** (session key). Klíč sezení poté zašifruje pomocí veřejného klíče příjemce, který musí být v klíčence. Obě části se spojí a odešlou. .. figure:: ./media/pgp_image5.png :width: 6.3in :height: 4.04167in :align: center Zašifrování a dešifrování souboru - kombinace symetrického šifrování a šifrování pomocí veřejného klíče. Příjemce nejdříve dešifruje zašifrovaný klíč sezení pomocí svého soukromého klíče. A poté dešifruje vlastní zprávu. Kombinování symetrické a asymetrické kryptografie má dvě výhody: - Šifrování symetrickou šifrou je výrazně rychlejší. - Snáze se šifruje stejná zpráva pro více příjemců. Gpg zašifruje soubor po zadání přepínače ``--encrypt``, je potřeba zadat aspoň jednoho příjemce: **gpg -\\-encrypt [-\\-sign] [-\\-armor] [-\\-output** *výstupní_soubor*\ **] -\\-recipient** *id_příjemce* **[-\\-recipient** *id_přijemce2*\ …] *vstupní_soubor* Příjemce lze zadávat pomocí e-mailové adresy či pomocí keyID. Přepínač ``--recipient`` má i krátkou variantu ``-r``. Lze zadat více příjemců, poté se klíč sezení zašifruje vícekrát – pro každého příjemce samostatně. Je dobrým zvykem zašifrovaný soubor také podepsat, tj. doplnit přepínač ``--sign``. V tomto případě musíte zadat i heslo ke svému privátnímu klíči (pokud není klíč nahraný v gpg-agent). .. code-block:: none :emphasize-lines: 1,2 :caption: Podepsání a zašifrování souboru s platným klíčem příjemce. gpg --encrypt --sign --recipient primus@bis.vse.cz soubor2.txt … dotaz na heslo k soukromému klíči … Pokud klíč příjemce není platný, tak je potřeba potvrdit zadání správného příjemce. Na následujícím obrázku šifruji soubor pro uživatele robot@bis.vse.cz s nepotvrzeným klíčem a též pro sebe (pavlicek@bis.vse.cz). .. code-block:: none :emphasize-lines: 1 :caption: Podepsání a zašifrování souboru pro dva příjemce. Příjemce robot@bis.vse.cz nemá platný klíč. gpg --encrypt --sign -r robot@bis.vse.cz -r pavlicek@bis.vse.cz soubor3.txt gpg: 53E9E0382F22902F: There is no assurance this key belongs to the named user sub rsa2048/53E9E0382F22902F 2016-03-08 Robot Primary key fingerprint: 5A4C EE4D 6FEA BAD3 916B 73EC 5082 CC38 651A 108C Subkey fingerprint: 5C78 FED7 FFAB 3ECE C4FA 1AE5 53E9 E038 2F22 902F It is NOT certain that the key belongs to the person named in the user ID. If you *really* know what you are doing, you may answer the next question with yes. Use this key anyway? (y/N) y Při zadání přepínače ``--armor`` se binární výstup převede do radix-64. Přepínač ``--output`` umožňuje zadat jméno výstupního souboru. Základní příkaz pro dešifrování je stejný jako pro rozbalení podepsaného souboru: **gpg** *zašifrovaný_soubor* Pro dešifrování musíte zadat heslo k soukromému klíči. .. code-block:: none :emphasize-lines: 1,2 :caption: Dešifrování souboru. gpg soubor3.txt.gpg … dotaz na heslo k soukromému klíči … gpg: encrypted with 2048-bit RSA key, ID 53E9E0382F22902F, created 2016-03-08 "Robot " gpg: encrypted with 2048-bit RSA key, ID EE058757E90BF9F5, created 2016-12-03 "Luboš Pavlíček " gpg: Signature made Sat 10 Dec 2016 06:23:49 PM CET gpg: using RSA key A169316E65B5F8F393AC9886531F3C9784EDED03 gpg: aka "Luboš Pavlíček " [ultimate] Výpis ukazuje dešifrování souboru soubor3.txt.gpg, který se zašifroval na předchozím výpisu. Všimněte si, že keyID klíče pro šifrování neodpovídá otisku klíče u podpisu – je to tím, že pro šifrování se používá podklíč, kdežto pro podepisování hlavní klíč. Obě id jsou vidět při editaci klíče – viz výpiš TODO. .. code-block:: none :emphasize-lines: 1,2 :caption: Pokus o dešifrování souboru bez odpovídacího soukromého klíče. gpg soubor2.txt.gpg gpg: encrypted with 2048-bit RSA key, ID F03A3750367220A6, created 2016-10-08 "Robot Primus (R.U.R.) " gpg: decryption failed: No secret key Již jsem uváděl, že při šifrování by se měla zpráva též podepsat. Průběh podrobně ukazuje následující obrázek. .. figure:: ./media/pgp_image7.png :width: 6.3in :height: 4.95139in Podepsání a zašifrování zprávy v OpenPGP. Šifrování pomocí sdíleného hesla ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ OpenPGP též podporuje šifrování pomocí sdíleného hesla – použije se přepínač ``--symetric``. **gpg -\\-symmetric** [**-\\-armor**] [**-\\-output** *výstupní_soubor*] *vstupní_soubor* Program se zeptá na heslo [8]_ a poté z něho vygeneruje klíč pro symetrickou šifru. Při generování klíče používá funkci podobnou PBKDF2 s náhodnou solí a vysokým počtem iterací odvozeným z rychlosti procesoru. Soubor mohou dešifrovat všichni, kdo znají heslo. Heslo lze hádat pomocí slovníků i pomocí hrubé síly. Útočník se též může snažit odchytit heslo při jeho výměně mezi účastníky. .. [8] I toto heslo se na omezenou dobu ukládá do paměti programu gpg-agent.