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