Obsah
Co to?
Ahoj! Následující článek se týká programu GnuPG (GNU Privacy
Guard).
GnuPG (dále jen GPG) je skvělý GNU program na hybridní šifrování, odpovídající
standardu OpenPGP. Je to vlastně
free open-source program podobných vlastností jako PGP (Pretty Good Privacy),
ale IMHO lepší.
Ještě před popisem GPG je třeba trochu objasnit určité základní pojmy v
šifrování. Doufám, že následující odstavce nejsou jen prázdné plky.
Hašovací algoritmy
Hašování je jednocestné šifrování: můžu tedy zašifrovat, ale dešifrovat
už nikoli. Už vás slyším, jak se ptáte: "K čemu to?". Inu, ne vždy
potřebujete zašifrovaná data zpět, ne vždy se to hodí. Hašovací algoritmy
prostě z plaintextu udělají haš, tedy takový téměř jednoznačný popis.
Používá se to například pro hesla v linuxu (soubor
/etc/shadow
). Tam se ukládají hesla v hašované formě. Když se
vás systém zeptá na heslo, vytvoří se jeho haš a ta se následně porovná s
haší, co je v /etc/shadow
. To je docela šikovné kvůli tomu, že
i když někdo ví haš vašeho hesla, neví vaše heslo (které může být v mnoha
ohledech cennější...).
Haše se také používají k vytváření sumů souborů (např. stáhnete nějaký
.iso
soubor velký 700 MiB a chcete vědět, jestli se stáhl celý
v pořádku. Vystavovatel oněch .iso
souborů má obvykle soubor
obsahující sumy těchto souborů (obvykle soubot md5sums.txt
ap.). Na vás je jen, abyste si vytvořili haše stáhnutých souborů a
porovnali s vystavovanými. Pokud jsou stejné, jsou stáhnuté soubory v
pořádku. Nebo použijete md5sum a ten to udělá za vás :->.
/* Jen menší poznámka: haš MD5 už není nejnovější a je jen 128bitová
(neplést s bitovostí symetrických šifer), což v dnešní době není moc. Dnes
se spíš doporučují haše se 160 nebo více (256, 384, 512) bity - například
SHA1, RIPEMD-160, SHA256, SHA384, SHA512
. */
Symetrické šifrování
Symetrické (konvenční) šifrování je "to normální" šifrování, které si
každý dokáže normálně představit. Prostě se vezmou nešifrovaná data
(plaintext), vezme se klíč/heslo (to se ale většinou ještě předtím
zhašuje, aby funkci lépe chutnalo) a pomocí nějakých "zázračných" algoritmů
(jako DES, AES, blowfish, twofish...
) se to dovede do stavu
šifrovaného (ciphertext).
Celá bezpečnost závisí jen na hesle a kvalitě použitého algoritmu. Pokud
tedy znám heslo nebo umím cracknout daný algoritmus (jaká to náhoda),
dokážu plaintext získat.
Dnes se standardně používají 128bitové symetrické šifry a pokládají se
za bezpečné. Někdo (nechtějte ode mě vědět kdo) kdysi prohlásil, že na
rozluštění jediné zprávy zašifrované 128bitovou šifrou nebude stačit křemík
celého vesmíru. Já nevím, mně by stačilo, kdyby to vydrželo takových 20
let, pak už stejně asi budou má supertajná data k ničemu.
Výhoda symetrického šifrování je v tom, že je celkem dost rychlé
(dokonce se vyrábějí hardwarové karty do PC a pak je to šifrování fakt
móóóóc rychlé).
Tři pro mě nejznámější programy umožňující symetrické šifrování: mcrypt, GnuPG, OpenSSL (to je sice primárně na něco
trochu jiného, ale umí i samostatné symetrické šifrování - a to dokonce
nejrychleji, jsou tam šílené optimalizace v assembleru).
Asymetrické šifrování
Asymetrické šifrování na to šlo trošku jinak. Základem jsou dva různé
klíče: jedním šifruji a kontroluji podpisy, druhým dešifruji a podpisy
vytvářím.
Tím prvním je veřejný klíč, který je, už podle názvu, veřejný, a tím
pádem je šikovné ho umisťovat na své homepage; kdyby vám nějací paranoiou
posedlí lidé (toho jsem schopný i já ;->) chtěli poslat dopis, mohou
použít váš klíč. Veřejným klíčem se tedy šifruje a kontroluje podpis
(podpis viz dále). Tento nemusíte nikde
schovávat, neměl by útočníkovi bažícím po vašich datech nijak při
crackování ciphertextu pomoci.
Druhý klíč je soukromý. Ten si naopak hlídejte jako koule v trenkách.
Tímto klíčem se vytváří podpisy a dešifruje. Soukromý klíč se nesmí
dostat do nepovolaných rukou (tady ta analogie s koulem[ia] ;->). Pokud
by se tomu tak stalo, stálo by mezi útočníkem a plaintextem jen heslo pro
váš klíč (tj. nejslabší článek řetězu).
Takže se jmenuju Igor a chci se dopisovat se strýčkem Ivanem (samozřejmě
to jsou extradůležitá a supertajná data, jako že kamarádka Ira má
narozeniny a tak...). Oba musí mít vytvořený klíč. Ivan pošle Igorovi svůj
veřejný (!) klíč a ten mu na oplátku pošle ten svůj. Je důležité,
aby se přenos klíčů udál nějakým bezpečným způsobem (hrozí totiž metoda
man-in-the-middle, kde by útočník sledoval komunikaci a při výměně
klíčů podstrčil ty své "pravé"...).
Teď, když chce Igor Ivanovi napsat dopis, tak ho napíše, zašifruje
Ivanovým veřejným klíčem (popřípadě ještě podepíše svým soukromým
klíčem, aby potvrdil autenticitu) a pošle ho. Ivanovi dopis dojde,
rozšifruje ho svým soukromým klíčem (popřípadě ještě Igorovým
veřejným klíčem ověří podpis, pokud ho Igor vytvořil) a je to. Ivan už tedy
ví, že Ira má zítra narozeniny ;->.
Fingerprint?
Co to sem cpu? Něco okolo daktiloskopie? Ne-e! Fingerprint
(otisk prstu) v GPG se naprosto netýká prstů jako takových, ale
unikátnosti. Každý klíč (respektive keypair) má svou jednoznačnou
identifikaci, tzv. fingerprint. Znamená to, že by žádné dva klíče na
světě neměly nikdy mít stejný fingerprint. Neměly by mít - to neznamená
nemůžou mít! Jelikož fingerprint je číslo o pevné velikosti (pevný počet
bitů), je tudíž shora omezen.
Podle fingerprintu byste měli být schopni ověřit unikátnost klíče.
Například Igor pošle Ivanovi klíč. Potom mu zatelefonuje a nadiktuje
fingerprint svého klíče. Ivan jeho hlas pozná a zjistí, že udávaný
fingerprint a fingerprint přijatého klíče souhlasí. Komunikace tedy může
začít.
Co ten podpis?
V předešlém textu jsem se několikrát jemně otřel o termín podepsat
zprávu. Co to je? To jako napsat tam svoje jméno. NE! Elektronickým
podpisem si můžu ověřit, že zprávu (data), kterou podepsal Igor, opravdu
napsal Igor (nebo někdo, kdo má přístup k Igorovu soukromému klíči a zná
heslo; nebo někdo, komu se podařilo položit asymetrické šifrování na
kolena). Podpis je vlastně otisk zprávy (haš), který je nějakým
fatálním způsobem "zašifrovaný" soukromým klíčem a dá se dešifrovat
klíčem veřejným. Je to prostě nějaká fakt extrémní matematika, a protože já
matice moc nehovím, nebudu to objasňovat (nevím to...). Důležité je, že to
funguje.
Co je tedy GPG?
GnuPG je hybridní systém pro šifrování a elektronický podpis.
Hybridní proto, že využívá výhod obou druhů šifrování. Ze symetrického se
bere rychlost, z asymetrického oddělení na veřejný a soukromý klíč.
GPG vzniklo jako free (free jako freedom) alternativa k programu
PGP, který není možno zdarma používat pro komerční účely. PGP vzniklo někdy
kolem roku 1991 jako program Philla Zimmermanna, který si chtěl soukromě
dopisovat se svými přáteli. Tehdy to byl ještě dosový program, u kterého
byly dostupné zdrojáky. Postupně rostli nové verze, až PGP zkomerčnělo.
Tedy bylo volně (tj. zdarma) k dispozici pro nekomerční účely, pro ty
komerční se muselo platit.
To se pravděpodobně nelíbilo Werneru
Kochovi. Tak začal v roce 1998 pracovat na GPG. Teď z toho je jeden z
předních GNU programů a pracuje na něm celkem dost lidí (a má i české
locales...). Za svojí historii v sobě GPG nemělo nějak moc kritických chyb,
nyní se dá říct, že je to dost stabilní a ověřený program (alespoň z mého
pohledu).
GPG je command-line program - a to je dobře! Že se vám to nelíbí?
Nevím proč, jedině pomocí komandlajny můžete GPG dokonale ovládat. Na jeho
opšny se dá celkem rychle zvyknout a po několika dnech je budete psát po
paměti... Ale pro nenapravitelné klikaře snad už existují i klikací
rozhraní pro GPG, ale já o nich nic nevím - jsem věrný konzoli.
Existuje jistý standard jménem OpenPGP, který popisuje, co by každý
OpenPGP compliant program měl obsahovat, umět... GPG ho skoro do puntíku
dodržuje (ba co víc, dokonce rozšiřuje...). Ten puntík by mohla být
švýcarská (symetrická) šifra IDEA, která není pro komerční použití volně
dostupná, tudíž jí GPL program jako GPG samozřejmě nemůže obsahovat.
Existují ale moduly k GPG, které IDEU přidávají. Já jí nikdy nepoužil.
/* Podobný problém byl kdysi s asymetrickým algoritmem RSA, který
podléhal patentu. Ten ale 2000-09-20 vypršel (2000-09-06 ho ale firma RSA Data Security dala veřejnosti jako public
domain). */
GPG podporuje vytváření DH klíčů stejně jako RSA klíčů. DH klíčů je ale
na veřejnosti o dost víc. Ze symetrických šifer nabízí tyto: 3DES, CAST5,
BLOWFISH, AES, AES192, AES256, TWOFISH, DUMMY. Umí pracovat s následujícími
hašovacími algoritmy: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512 a zvládá
tři druhy komprese (komprese vlastně dva...): NONE, ZIP, ZLIB. V blízké
budoucnosti přibude ještě podpora BZIP2 komprese (ve verzi 1.2.4 je
testovací). DUMMY šifra nešifruje, což se může hodit pro developery, kteří
potřebují odladit část programu (nebo pro mě, protože se v takových věcech
rád šťourám).
Jedeme
Takže teď předpokládám, že jste si obstarali nějakou ne obstarožní verzi
GPG a nainstalovali ji (bývá ve většině linuxových distribucí a je dostupná
pro většinu free unixů jako OpenBSD, FreeBSD a dokonce je verze i pro win32
- docela se divím, že si s verzí pro winy někdo dává práci...).
Teď je potřeba vytvořit si svůj pár klíčů (keypair). Napište:
----------------------------------------
gpg --gen-key
----------------------------------------
Následně si s vámi bude program povídat (novější verze programu při
správně nastavených locales dokonce česky!) o tom, jaký druh klíče chcete
(doporučuji 1
), dále bude chtít vědět požadovanou délku klíče
(doporučuji 2048
, víc snad ani není potřeba). Teď už nastává
otázka na zamyšlení: délka platnosti klíče. Je to na vás. Pokud si myslíte,
že vám tento hlavní klíč vydrží fakt dlouho, dejte neomezeně (tj.
0
), jinak si můžete vybrat délku trvání.
Po potvrzení a zadání jména klíče, emailové adresy a případně komentáře
už bude chtít program heslo. Dobře si heslo rozmyslete. Pokud by se
někdo dostal k vašemu soukr. klíči, chrání vás před únikem dat už jen a
právě toto heslo. Takže mu věnujte extrémní pozornost (heslo k
soukromému klíči se dá i potom změnit). Po potvrzení hesla se už začne
keypair generovat. Pro generování klíče je potřeba entropie, není tedy na
škodu sběrači náhodných dat trochu pomoct lehkým laskáním klávesnice
něžnými údery do kláves :->.
Takže, teď mají Igor i Ivan vytvořené klíče. Teď musí Igor vyexportovat
svůj klíč a poslat ho Ivanovi.
----------------------------------------
gpg --export -a igor > igor_key.asc
----------------------------------------
Tento příkaz vytvořil textový soubor igor_key.asc
, který
obsahuje Igorův klíč. Teď ho musí Igor poslat Ivanovi (a Ivan samozřejmě
musí udělat to samé).
Takže, Igor se dostal k soubor ivan_key.asc
, těď potřebuje
klíč naimportovat.
----------------------------------------
gpg --import ivan_key.asc
----------------------------------------
Klíč byl naimportován. Teď není na škodu dát klíči určitou důvěru. GPG
se řídí systémem zvaným web of trust (česky pavučina důvěry). V
praxi to znamená, že šifrovat by se mělo klíčem, který má alespoň částečnou
důvěru (marginal trust). Částečnou důvěru má klíč, u kterého věřím,
že je pravý, ale nevěřím tímto klíčem podepsaných klíčům. Prostě pokud by
by Ivanův veřejný klíč podepsán kromě sám sebou třeba ještě Miguelovým
klíčem, a já Miguelovi nevěřím (jeho klíč má u mně částečnou nebo žádnou
důvěru), byl by pro mě Ivanův klíč nedůvěryhodný. Pokud bych ale Miguelovi
věřil (tj. jeho klíč by u mě měl plnou důvěru), byl by pro mě Ivanův klíč
důvěryhodný. Prostě, aby mohl Igor šifrovat Ivanovým klíčem je potřeba, aby
byl podepsaný někým důvěryhodným. Pokud není a Igor jeho klíči věří (tj.
např. po telefonu Ivan mu nadiktoval fingerprint jeho klíče), může
ho podepsat svým soukromým klíčem.
----------------------------------------
gpg --edit-key ivan
> sign
> 0
> y
> lskfr4nfs # ted proste zadejte heslo k vasemu klici
> save
----------------------------------------
Teď je klíč podepsaný Igorem, může mu být tedy udělena důvěra.
----------------------------------------
gpg --edit-key ivan
> trust
> 3 nebo 4 # ted se zada duvera
> save
----------------------------------------
Navrhuji dát Ivanovu klíči částečnou důvěru (tj. věřím jeho klíči, ale
nevěřím klíčům Ivanem podepsaným).
Předpokládám, že Ivan udělal předcházející analogicky s Igorovým klíčem.
Nic tedy Igorovi nebrání poslat svůj Ivanovi svá první šifrovaná data.
----------------------------------------
gpg -e -r ivan -o tajne.gpg tajne.txt
----------------------------------------
Toto zašifruje soubor tajne.txt
Ivanovým klíčem a
ciphertext uloží do souboru tajne.gpg
. Parametr
-e
znamená zašifrovat, -r
značí klíč použitý k
zašifrování, -o
specifikuje výstupní soubor.
Soubor tajne.gpg
teď může Igor Ivanovi poslat. Kvůli tomu,
že byl soubor zašifrován jen Ivanovým klíčem, nemůže ho dokonce ani Igor už
rozšifrovat. Pokud by chtěl, musel by soubor zašifrovat více klíči
najednou.
Šifrování více klíči
Jelikož je GPG hybridní šifrovací systém, mohou se jedna data zašifrovat
najednou více klíči. Např. Igor posílá dopis a zašifruje ho klíčem svým,
Ivanovým a Miguelovým:
----------------------------------------
gpg -e -r igor -r ivan -r miguel -o tajne.gpg tajne.txt
----------------------------------------
Jak je to možné? Jednoduše! U hybridního šifrování se totiž data samotná
šifrují symetrickou šifrou. Asymetricky se šifruje jen tzv. session
key (klíč sezení). Session key je vlastně dost velké náhodné číslo
(třeba 256bajtové). Toto číslo (vlastně klíč pro symetrickou šifru) se
zašifruje asymetricky. Pokud tedy zašifruju plaintext a zadám více
klíčů, bude stejný klíč klíč (heslo) zašifrováno i asymetrickou šifrou
klíči všech, kdo jsou vybráni. Jasné? Jestli ne, jednodušeji: náhodné číslo
(heslo pro symetrickou šifru, kterou je zpráva ve skutečnosti zašifrovaná)
se asym. zašifruje Ivanovým, Igorovým a nakonec i Miguelovým klíčem. Za
každý klíč naroste délka výstupního souboru přibližně o čtvrt kilobajtu (ať
už je vstupní soubor velký jakkoli...). Kdokoli z této trojice je schopen
zprávu rozšifrovat.
Takže, Ivanovi přišel od Igora soubor tajne.gpg
. Co s tím?
No přece rozšifrovat:
----------------------------------------
gpg -d -o tajne.txt tajne.gpg
----------------------------------------
Po zadání správného hesla se na něj usměje nový soubor
tajne.txt
, který obsahuje onu převelice tajnou zprávu.
Komunikace mezi Igorem a Ivanem proběhla úspěšně, až na takový malý
detail. Ivan si nemůže být jistý, že soubor, který obdržel, je opravdu od
Igora. Někdo přece mohl dopis podstrčit (to není tak těžké, Ivan mohl svůj
veřejný klíč vystavit a někdo to tím klíčem jen zašifrovat...) a simulovat
tím Igora. Co Ivan zmůže?
Teď už nic. Ale propříště Igor svůj dopis se šifrováním taky podepíše.
Tím pádem si bude moct být Ivan jistý, že soubor poslal opravdu Igor (nebo
ten, kdo má přístup k Igorovu soukromému klíči a ví heslo). Jak tedy na
to?
----------------------------------------
gpg -es -r ivan -u igor -o tajne.gpg tajne.txt
----------------------------------------
Jde z toho vidět, že parametr -s
znamená podpis. Klíč,
kterým se bude podepisovat, určuje buď konfigurační soubor
(~/.gnupg/gpg.conf
) nebo opšna -u
. U
podepisovacího klíče musí být samozřejmě dostupný soukromý klíč.
Když si později Ivan soubor rozšifruje, podpis se zkontroluje, a pokud
souhlasí, napíše to. Pak už si bude moci být Ivan jistý a bude moci klidně
spát ;->
Igor taky samozřejmě může soubor jen podepsat. To je v případech, kdy
nevadí, když to někdo uvidí, ale je důležité, aby se dala ověřit
pravost.
Jedeme dál
Maily
V tomto okamžiku už si Igor s Ivanem mezi sebou můžou posílat šifrované
(a podepsané) soubory (dopisy). Posílat ale dopisy tímto způsobem (jako
zašifrované soubory) není nejefektivnější. Skvělé by bylo, kdyby mohl
posílat šifrované maily. Proč ne? Nemálo mailerů už podporu GPG (nebo PGP)
má zabudovanou. Sám můžu mluvit jen za mutt
, což je mailer, u
kterého snad není nic, co by se nedalo konfigurovat. Pořádně ho sice
nepoužívám (na net se dostanu jen ze školy :-<), ale to, co jsem v něm
zkoušel, bylo skvělé. Zpět k GPG. Mutt má GPG podporu úplně v pohodě. Po
napsání dopisu se a následném stisku p
nabídne, jestli mail
chceme zašifrovat, podepsat, obojí, nebo nic. Prostě rychlovka. Taky když
vám dojde šifrovaný/podepsaný mail, hned nabídne rozšifrování/ověří podpis.
Pípa
Jako každý správně vychovaný unixový program umí i GPG pracovat s pípou
(pipe
). Například šifrování stdin
na
stdout
je dost intuitivní:
----------------------------------------
echo 'tady neco mas' | gpg -er ivan
----------------------------------------
Ukázka zašifrování a následného rozšifrování:
----------------------------------------
echo 'tady neco mas' | gpg -er igor | gpg -d
----------------------------------------
Komprese
Další fičurka je komprese. Její hlavní účel kupodivu (teď bez ironie)
není na snížení objemu dat. Jde tam o praktické zesílení síly šifrování,
protože komprese silně snižuje redundanci (opakování, nadbytečnost) dat.
Redundantní data lépe podléhají kryptoanalýze (postup pro zlomení šifry).
Takže zkomprimováním se zabijí dvě mouchy jednou ranou: sníží se redundance
a taky (obvykle) velikost dat.
Kompresi řídí opšna -z
, jejíž číselný parametr určuje
kompresní úroveň. Je to interval <0;9>. 0 znamená bez komprese.
Naopak 9 je maximální komprese.
Jen symetrické šifrování
GPG umožňuje šifrovat i pouze symetricky. Občas se může hodit zašifrovat
soubor a neplést do toho klíče. Od toho tady je volba -c
:
----------------------------------------
echo 'nejaky text' | gpg -c
----------------------------------------
Program se zeptá na heslo (samozřejmě dvakrát). Použitý algoritmus si
můžeme vybrat pomocí opšny --cipher-algo
:
----------------------------------------
echo 'nejaky text' | gpg -c --cipher-algo blowfish
----------------------------------------
Podobným způsobem se může měnit i na heslo použitý hašovací algoritmus
(--digest-algo
) nebo kompresní funkce
(--compress-algo
). Jejich seznam získáte příkazem gpg
--version
.
Hrátky s klíči
Seznam klíčů se dá získat příkazem gpg --list-keys
.
Editace klíče. Někdy se může hodit si svůj klíč trochu upravit. Používá
se k tomu gpg --edit-key jmeno_klice
. S tím už jste se
setkali, když jsme upravovali Ivanův klíč tím, že jsme ho podepisovali a
nastavovali mu důvěru.
Kromě toho se dají u klíče, jehož jsme majiteli (tj. máme celý
keypair), měnit i jiné věci. Například se můžou přidávat a ubírat
podklíče (subkeys).
Podklíče
Podklíč je je klíč patřící k hlavnímu keypairu. Můžete jich u jednoho
keypairu mít víc. Často se klíče dělají tak, že se vytvoří jeden nikdy
nekončící keypair a k tomu se postupně přidávají časově omezené
podklíče.
K čemu to? Čím více dat je šifrovaných jedním a tím samým klíčem
(podklíčem), tím větší je riziko prolomení šifry. Proto se často vytvářejí
podklíče s třeba dvouletou trvanlivostí a co dva roky se dělají nové.
Výhoda podklíče oproti normálnímu klíči je v tom, že masterkey (nikdy
nekončící klíč, kterým podepisujeme podklíče) je vždy stejný a proto se
podklíče distribuují dost jednoduše (prostě se znovu vyexpoertuje klíč, na
cílovém počítači se naimportuje a při šifrování se vždy vybírá nejnovější
podklíč).
Jak tedy vytvořit podklíč?
----------------------------------------
gpg --edit-key igor
> addkey # potom zadejte heslo
> 3 nebo 5 # chceme vytvorit sifrovaci podklic
> 2048 # mnou doporucena delka klice
> 1y # klic bude platit jeden ro(c)k
> y # potvrzeni
> y # dalsi potvrzeni
> save # aby se klic ulozil
----------------------------------------
Dále můžeme pomocí delkey
podklíč smazat.
Heslo
Příkazem passwd
můžeme změnit heslo k soukromému klíči nebo
dvojným zadáním prázdného hesla heslo zrušit (nedoporučuju!).
adduid
Pomocí adduid
a deluid
můžete vytvořit/smazat
"jména" klíče. Základní jméno už jste zadávali při vytváření klíče. Teď ale
třeba chcete přidat jméno s vaší alternativní mailovou adresou. K tomu se
právě používá adduid
. Dál se o tom rozepisovat nebudu, protože
to je fakt dost jednoduché.
Revokace
Nastala doba vysvětlit si, co je to revokace. Situace: vytvořili jste si
nový podklíč a už nechcete, aby vám někdo posílal data šifrovaná starým
podklíčem. Tady pomůže revokace. Pomocí key cislo_podklice
si
vyberete, se kterým podklíčem chcete pracovat a pak pomocí
revkey
a následných odpovědí a save
klíč
revokujete. Nyní musíte opět klíč exportovat a donutit své "dopisovatele",
aby upgradovaný klíč importovali.
pref, showpref, setpref a updpref
Tyto tři příkazy jsou už pro pokročilé. pref
vypíše
preference klíče (nebo uid...). showpref
udělá to samé,
akorát v lidštějším formátu. setpref
parametry klíče
nastavuje. a nokonec updpref
a následný save
změny do klíče promítají.
Preference nastavují prioritu šifrovacích algoritmů, haší a kompresních
algoritmů. Pokud třeba máte rádi blowfish
a chcete, aby, když
vám někdo bude posílat šifrovaný dopis, použil právě tento algoritmus,
musíte blowfishi (blowfishovi ;->) nastavit větší prioritu (teda spiš ho
postavit víc dopředu...).
Nejdřív si musíte zjistit čísla šifer, haší a kompresních algoritmů.
----------------------------------------
gpg -v --version
----------------------------------------
Čísla šifer (a haší...) jsou v závorkách. Zkusme se podívat, co nám
vypíše pref
.
----------------------------------------
S9 S8 S7 S3 S2 H2 H3 Z1 [mdc]
----------------------------------------
mdc
flag budeme proteď ignorovat. Jak vidno, je v tom
určitý systém. Předpona S
značí šifru. Tak jak jdou za sebou,
taková je jejich priorita (nejvyšší má tedy šifra 9
, což je
AES256
). H
znamená haš. No a Z
jsou
kompresní algoritmy.
Váš setpref ted může vypadat takto (pro milovaný blowfish):
----------------------------------------
setpref S4 S9 S8 S7 S3 S2 H2 H3 H1 Z1
----------------------------------------
Aby se změny na klíči opravdu promítly, musíte provést
updpref
(bude se ptát na heslo) a save
.
/* Btw, mdc
je šikovná věcička (u nových verzí GPG
implicitně zapnutá). Ke každým zašifrovaným datům přidá malý otisk
(haš) těchto šifrovaných dat (něco jako CRCčko). Při rozšifrovávání
se pak dá poznat, jestli se soubor cestou nezměnil (buď chybou či úmyslem
někoho ne zrovna hodného...). */
Armor
gpg --enarmor
nešifruje, pouze kóduje. Prostě z binárky
udělá textový soubor (ve formátu radix), který se pak dá bezpečně poslat
jako součást mailu (nemyslím přílohu!). Přesně opačnou funkci má gpg
--dearmor
.
print-md
Zajímavá je též funkce print-md
, což vypíše haš zadaaného
soubor[uů]. Použití:
----------------------------------------
gpg --with-colons --print-md sha1 nejaky_soubor
----------------------------------------
Vypíše to otisk souboru (použitá byla haš SHA1
). Opšna
--with-colons
ovlivní výstup: ten bude lépe strukturovaný a
tím pádem jednodušeji parsovatelný. Samozřejmě se dají udělat skripty na
automatizaci tohoto postupu, na ověřování...
Textový výstup
Ať už šifrujete nebo podepisujete, může se vám hodit, aby byl výstup
(šifrovaná data) textový. To se dá zařídit opšnou -a
(jako
armor). Malý příklad:
----------------------------------------
echo 'nejaky text' | gpg -ear igor
----------------------------------------
Toto zašifruje stdin
a vybleje šifrovaný výstup textově na
stdout
.
Konfigurace GPG
GPG má konfigurační soubor ~/.gnupg/gpg.conf
. Může
obsahovat předvolené hodnoty, které byste jinak zadávali jako parametry
(třeba cipher-algo
, prostě stejné jméno, akorát bez úvodních
--
).
Nejčastější volby
- no-greeting
- při spuštění nebude psát obvyklou hlášku o licenci a
tak.
- default-key
- impicitní podepisovací klíč (obvykle váš soukromý)
- cipher-algo
- implicitní symetrický šifrovací algoritmus
- s2k-cipher-algo
- implicitní symetrický šifrovací algoritmus pro
chránění soukromého klíče.
- default-recipient
- implicitní přijemce (tímto klíčem budou data
zašifrována, pokud zadáte jen
gpg -e
bez udání klíče)
- default-recipient-self
- pokud
default-recipient
není
nastaveno a toto ano, použije se při šifrování implicitně klíč definovaný v
default-key
)
- digest-lago
- implicitní hašovací algoritmus
- s2k-digest-algo
- implicitní hašovací algoritmus pro chránění
soukroumého klíče (heslo pro soukromý klíč se zhašuje právě touto haší)
- compress-level
- úroveň komprese (0..9)
- compress-algo
- použitý kompresní algoritmus (default je ZLIB
(
2
), další možnosti jsou ZIP (1
) a
0
[0 znamená bez komprese])
Vybral jsem jen ty podle mně nejčastější. Popis všech lze zíkat v
manuálové stránce gpg(1)
.
Potom ještě existuje volba group. Příklad:
----------------------------------------
group all = igor ivan miguel
----------------------------------------
Pokud teď dám něco jako: gpg -er all
, tak se data dle
očekávání zašifrují klíči všech tří chlapů (Igora, Ivana a Miguela). Group
tedy vytvoří skupinu, kterou potom můžete použít jako jméno klíče, pro koho
chcete data zašifrovat. Skupin můžete mít samozřejmě víc.
Fatalita pro pokročile paranoidní
Inspirován loop-AES
vám tu předkládám návod, jak zvýšit
sílu vašeho hesla.
GPG si heslo pro klíč (i při konvenčním šifrování) vezme, zhašuje a pak
s ním provádí různé kejkle (například se heslo hodněkrát zašifruje nějakou
symetrickou šifrou, pak se prohodí pořadí bitů...). Tyto kejkle mají za
úkol snížit efektivní dobu prolomení hesla. Normálně GPG tyto operace
provádí sice relativně hodněkrát, ale nám, pokročile paranoidním toto
nestačí (standardně je brána střední hodnota, aby to i na starších
mašinkách bylo obstojně rychlé). Pokud vám to ale nestačí, je možno
jednoduše aplikovat následující patch:
----------------------------------------
--- gnupg-1.2.4/g10/passphrase.c.old Wed Jul 30 19:16:55 2003
+++ gnupg-1.2.4/g10/passphrase.c Thu Jan 8 18:18:49 2004
@@ -1209,7 +1209,7 @@
if( create && !pass ) {
randomize_buffer(s2k->salt, 8, 1);
if( s2k->mode == 3 )
- s2k->count = 96; /* 65536 iterations */
+ s2k->count = 208; /* 8388608 byte count */
}
if( s2k->mode == 3 ) {
----------------------------------------
Samozřejmě následuje kompilace GPG (tu popisovat nebudu ;->).
Teď, když budete vytvářet nový klíč nebo šifrovat symetricky, bude po
zadání hesla následovat celkem znatelná pauza. Je to tou spoustou operací,
které se musí po zadání hesla provést - vy to ale vždy zadáte jednou,
útočník bažící po vašich datech to bude muset zkoušet mnohokrát (mnoho =
hóóóóódně moc ;->). Tím mu dokážete dobře zkazit náladu.
Co ale, když už máte klíč a chcete naň toto též aplikovat? Pohoda, stačí
změnit heslo (samozřejmě můžete heslo "vyměnit" za stejné, nyní už
bezpečnější...). Jak tedy na to:
----------------------------------------
gpg --edit-key igor
> passwd
> stare_heslo
> nove_heslo
> nove_heslo
> save
----------------------------------------
Tož tak.
Závěr
Tento článek měl za úkol trochu vás vnést do atmosféry GPG. Neměl to být
vyčerpávající popis všech možností. Měl vás nalákat na používání tohoto
bezesporu skvělého programu. Pokud se mi tak podařilo, je to jen dobře.
Pro detaily (např. další konfigurační volby) se mrkněte do manuálu, je
sice dlouhý, ale čte se dobře. Pokud přece jenom budete chtít s něčím
poradit, klidně mi napište, ale jak už jsem upozorňoval, má reakční doba
není zrovna nejkratší... Takže GPG zdar...
[Tiskni] [Přidat komentář] [Skrýt komentáře] Napsal sweetux 12. 4. 2004 v 16:4 Téma: dikyPresne tohle jsem potreboval, diky za clanek. [Reagovat]
|
Napsal foton2 13. 4. 2004 v 1:36 Téma: Moc hezké + pár chybičekMoc pěkný článek. A ne jednou sem se i zasmál :-)
Ale měl bych tyto dvě výtky :
1.kdyby vám nějací paranoiou posedlý lidé....
To mě trochu praštilo do očí :-)
2.Ivanovi dopis dojde, rozšifruje ho svým soukromým klíčem(popřípadě ještě svým veřejným klíčem ověří podpis, pokud ho Igor vytvořil) a je to.
Mělo by tam být : popřípadě ještě IGOROVÝM veřejným klíčem ověří podpis, pokud ho Igor vytvoříl.
Pěkný den, David. [Reagovat]
|
|
Napsal Nipo 13. 4. 2004 v 8:11 Téma: SkveléSuper článok, len tak ďalej ;-) [Reagovat]
|
Napsal ondrej 13. 4. 2004 v 16:53 Téma: hezke, ale ...Clanek je to pekny, deailni kucharka pro zacatecnika, ovsem nasel jsem nejake chybky:
1. Soubor tajne.txt teď může Igor Ivanovi poslat.
- to je jen technicka - tady bychom asi posilali plaintext, coz jsme asi nechteli
2. Komunikace mezi Igorem a Ivanem proběhla úspěšně, až na takový malý detail. Ivan si nemůže být jistý, že soubor, který obdržel, je opravdu od Igora. Někdo přece mohl dopis podstrčit(to není tak těžké, Igor mohl svůj veřejný klíč vystavit a někdo to tím klíčem jen zašifrovat...) a simulovat tím Igora.
- tady melo byt patrne "... Ivan mohl svuj verejny klic vystavit..." - nebot se snad sifruje verejnym klicem prijemce, nebo ne? a veta simulovat tim igora je trochu matouci (asi vyplyva z predchozi chyby), protoze zmast ivana muze odesilatel jenom tim, ze napise na konec zpravy igor.
a dalsi chybu s verejnym klicem vyse uz nekdo zminil
Mozna se pletu, moc tomu nerozumim (proto jsem si clanek precetl ;), ale myslim, ze vzhledem k zamereni clanku na uplne zacatecniky to jsou chyby fatalni.
Snad jsem to nepoplet ja ;) [Reagovat]
|
- Napsal Michal Marek 14. 4. 2004 v 23:24
Téma: re:hezke, ale ...> Snad jsem to nepoplet ja ;)
Myslim ze mate pravdu... Oni ti fousati panove asi vedi proc jako jmena komunikujicich pouzivaji Alice a Bob -- Pouzitim dvou jmen zacinajicich na I v tom autor udelal zmatek (a zmatl sam sebe :-)).
Ale jinak moc penky clanek, jenom by bylo dobre, kdyby ty 2 chyby nekdo rychle opravil. [Reagovat]
- Napsal sweetux 15. 4. 2004 v 12:34
Téma: re:re:hezke, ale ...Tak jsem tak trochu zkoumal jak na to a take se primlouvam za prepsani jmen (Ivan,Igor) -> (Alice,Bob). Mozna by neskodily i obrazky a nejlepe (alespon z meho pohledu) i posloupnosti akci. Vice bych rozdelil akce "sifrovani" a "podpis" - muzou se pouzivat spolecne i samostatne (nebo vubec).
Asi takhle, PGP/GPG zajistuje:
1) Autentizaci (overeni identity) odesilatele - "akce podpis"
2) Kryptovani (zajisteni proti neopravnenemu cteni) zpravy - "akce sifrovani"
3) Integritu (overeni neporusenosti) dosle zpravy - tato vlastnost je soucasti kryptovacich protokolu pouzitych v GPG/PGP, deje se tak automaticky ve chvili, kdy pouzijeme akci "sifrovani"
Pak jsou tu nejake veci s "S/MIME", PGP/MIME, atd., ktere jsem zatim nepochopil :( Jdu dal zkoumat. [Reagovat]
- Napsal Michal Marek 16. 4. 2004 v 16:32
Téma: re:re:re:hezke, ale ...> 3) Integritu (overeni neporusenosti) dosle zpravy - tato vlastnost je soucasti kryptovacich protokolu pouzitych v GPG/PGP, deje se tak automaticky ve chvili, kdy pouzijeme akci "sifrovani"
Tu nam zajisti hlavne podpis, jinak by byl na dve veci :-) Ale pokud chci jenom integritu, staci mi hash bez podpisu. [Reagovat]
- Napsal Pichi 22. 4. 2004 v 9:44
Téma: re:re:re:hezke, ale ...> 2) Kryptovani (zajisteni proti neopravnenemu cteni) zpravy - "akce sifrovani"
No já bych do žádných krypt kvůli tomu nelozil. Co takhle to prostě zašifrovat, provádět šifrování, prostě šifrovat. [Reagovat]
|
|
|
|
|
|
[Tiskni] [Přidat komentář] [Skrýt komentáře]