3.3. Š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ů.

3.3.1. 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).

_images/pgp_image3.png

Obr. 3.1 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.

Výpis 3.12 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.

Výpis 3.13 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.) <gall@bis.vse.cz>" [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

3.3.2. 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.

Výpis 3.14 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 <gall@bis.vse.cz>" [full]
gpg: Signature made Fri 09 Dec 2016 08:31:55 PM CET
gpg:                using RSA key 4CEB66E448C0187B
gpg: Good signature from "Robot Primus <primus@bis.vse.cz>" [full]

3.3.3. Š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.

_images/pgp_image5.png

Obr. 3.2 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).

Výpis 3.15 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).

Výpis 3.16 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 <robot@bis.vse.cz>
 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.

Výpis 3.17 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 <robot@bis.vse.cz>"
gpg: encrypted with 2048-bit RSA key, ID EE058757E90BF9F5, created 2016-12-03
     "Luboš Pavlíček <lubos.pavlicek@bis.vse.cz>"
gpg: Signature made Sat 10 Dec 2016 06:23:49 PM CET
gpg:                using RSA key A169316E65B5F8F393AC9886531F3C9784EDED03
gpg:                 aka "Luboš Pavlíček <pavlicek@bis.vse.cz>" [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.

Výpis 3.18 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.) <primus@bis.vse.cz>"
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.

_images/pgp_image7.png

Obr. 3.3 Podepsání a zašifrování zprávy v OpenPGP.

3.3.4. Š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.