Faktorizace Dvě čísla za 200 000 dolarů (2) Současný rekord ve faktorizaci čísla typu n = p*q je 155 dekadických číslic (512 bitů). V tomto povídání o problémech faktorizace vás seznámíme s metodou, které za to vděčíme. A odpovíme také na otázku, jak velké číslo bychom byli schopni faktorizovat, kdybychom měli všechny znalosti současné vědy a veškerou výpočetní techniku na Zemi. Nejúspěšnější je GNFS Nejlepší současnou metodou faktorizace je tzv. metoda prosévání neboli General Number Field Sieve (GNFS). Její popis je velmi složitý, proto je vynecháván i v kvalitních kryptografických příručkách - dílem kvůli rozsahu potřebných pojmů, dílem kvůli složitosti a teoretickým nárokům na čtenáře. Pokusíme se ale vysvětlit alespoň základní ideu tak, jak je popsána v monografii [LL]. GNFS se skládá ze čtyř fází. Hlavním cílem je opět nalézt čísla y, x tak, že y2 ? x2 (mod n), viz minulý díl. Změnou oproti jiným metodám je kombinované využití čísel a polynomů. Označme tedy Z celá čísla a Z[(] okruh polynomů do stupně d-1 včetně, které mají celočíselné koeficienty, tj. jedná se o polynomy ad-1(d-1 + ad-2(d-2 + ... + a0. 1. fáze - skloubení čísel s polynomy V první fázi se nejprve vybere ireducibilní polynom f(() stupně d > 1. Jeho pomocí vytvoříme těleso Z[(]/f((), což je množina uvedených polynomů, s nimiž se pracuje modulo f((); f(() je tedy v tomto tělese nulový prvek. Každý polynom si zde můžeme reprezentovat vektorem jeho koeficientů a sčítání polynomů pak provádíme jako sčítání odpovídajících si koeficientů (sčítání koeficientů je běžné sčítání celých čísel). Násobení polynomů zde provádíme jako běžné násobení polynomů, ale výsledek na závěr modulujeme polynomem f((). Tento popis nám zatím pro další použití Z[(]/f(() stačí, jinak o těchto pojmech podrobněji pojednává jeden z článků T. Rosy (viz infotipy). Nyní uvažujme Zn, okruh celých čísel modulo n (není to těleso, protože n je naše složené číslo, které chceme faktorizovat) a celé číslo m takové, že f(m) ? 0 (mod n). Operace modulo n je zde významná, protože f je ireducibilní a m by neexistovalo. Nyní v okruhu celých čísel Zn máme f(m) ? 0 (mod n) a v okruhu (dokonce tělese) polynomů Z[(]/f(() je f(() nulový prvek. To nám napovídá, že mezi oběma okruhy můžeme definovat homomorfismus ?: Z[(]/f(() (r) Zn tak, že ? (q(()) = q(m) mod n pro libovolný polynom q, neboli ?(ad-1(d-1 + ad-2(d-2 + ... + a0) = (ad-1md-1 + ad-2md-2 + ... + a0) mod n a také ?(() = m mod n. V dalším využijeme té vlastnosti homomorfismu, že platí ?(polynom1 * polynom2) = ?(polynom1) * ?(polynom2). 2. fáze - prosévání Nejprve si řekněme hlavní myšlenku GNFS. V této fázi hledáme cílově množinu S párů vzájemně nesoudělných čísel (a, b) tak, aby: (A) součin čísel ((a,b) (S (a + bm) byl čtvercem v Z, // = x2; (B) součin polynomů ((a,b) (S (a + b() byl čtvercem v Z[(] // = (2. Pokud jsou uvedené výrazy čtvercem, existuje číslo x ( Z, které je odmocninou prvního výrazu, a existuje polynom ( ( Z[(], který je odmocninou druhého výrazu. Nyní můžeme uvažovat x:= x mod n, aby x < n (x ( Zn) a (:= ( mod f((), aby stupeň polynomu ( byl menší než stupeň polynomu f(() (( ( Z[(]/f(()). Protože homomorfismus ? převádí součinitele prvního výrazu na součinitele druhého výrazu, neboť podle definice platí ?(a + b() = (a + bm) mod n, převádí se oba dva celé součiny homomorfismem na sebe. Tudíž platí (R) ?((2) = x2 mod n pro vhodná x ( Zn a ( ( Z[(]/f((). Označme y ten prvek ze Zn, který je obrazem polynomu ( ze Z[(]/f((), tj. ? (() = y. Potom díky homomorfismu platí také ? ((*() = y2 mod n. Odtud a z rovnosti (R) plyne y2 ? x2 (mod n), což bylo naším cílem! Hledaný faktor n se pak vypočte známým trikem jako gcd(x - y, n). Poznamenejme ještě, že pravděpodobnost, že x ± y ? 0 (mod n), je malá, takže faktor n se určí skoro vždy. Samozřejmě zde vzniká mnoho otázek, například jak volit polynom f((), číslo m, jak najít odmocninu ( aj. Tyto otázky musíme nechat nezodpovězené, neboť co otázka, to problém na samostatnou kapitolu odborné knihy. Nyní se vraťme k vlastnímu prosévání. Je to příhodný název, protože (ai, bi) vyhledáváme v "mříži" celých čísel <-A, A> x < 0, B>, a navíc chceme, aby (ai + bim) a (ai + bi() byly hladké a (ai, bi) co nejmenší. Množinu všech takto nalezených dvojic (ai, bi) označme D. O pojmu hladké číslo (p-smooth) a o prosévání si můžete podrobněji počíst v článcích [ROSA], viz infotipy. Protože nalezená čísla (ai + bim) jsou hladká, je možné je zapsat ve tvaru (pj(F pjeij, kde F je zvolená faktorová báze - co nejmenší množina co nejmenších prvočísel pj (p1 < p2 < p3 < ....). Každé z čísel (ai + bim) je tedy součinem nějakých mocnin nějakých prvočísel z množiny F. Prosévání končí nalezením množiny D. 3. fáze - zpracování matice V této fázi potom hledáme takovou podmnožinu S ( D všech nalezených párů (ai, bi), aby se exponent u každého prvočísla pj v jim odpovídajícím součinu (A) poskládal z exponentů eij jednotlivých činitelů (ai + bim) tak, aby byl sudý. Jakmile se to podaří, číslo (A) je součinem sudých mocnin prvočísel, tedy je to čtverec, který můžeme odmocnit (k čemuž směřujeme). Podobně se postupuje i u polynomů. Hledání podmnožiny S vůči číslům a hledání podmnožiny S vůči polynomům musí být ale koordinované, protože vztahy (A) a (B) musí platit současně. Výsledkem fáze prosévání je množina D; nyní si povšimněme, jak se zpracuje, tj. jak se nalezne její podmnožina S. Vysvětlíme to na číslech, tj. na vztahu (A). Z každého čísla (ai + bim) = (pj(F pjeij vytvoříme jeden řádek výsledné matice, který obsahuje exponenty (ei1, ei2, ei3 ...) prvočísel p1, p2, p3, ... Přitom ve skutečnosti nezapisujeme eij, ale jen eij mod 2, a později s maticí pracujeme také v modulu 2, protože nás koneckonců zajímá jen to, je-li ej sudé nebo liché. Pro každou dvojici čísel (a, b) z D tedy vznikne jeden řádek výsledné binární matice. V ní pak hledáme takovou podmnožinu řádků, aby součet jejich prvků po sloupcích byl vždy sudý (ve skutečnosti 0 modulo 2). Množinu S pak tvoří ty dvojice (a, b), které odpovídají vybraným řádkům. Poznamenejme, že toto úsilí musí být koordinováno s podobným postupem pro polynomy. Jak je vidět, třetí fáze GNFS je náročná na paměť, protože musíme vyhledávat lineární závislosti řádků a příslušné operace provádět v celé matici. 4. fáze - výpočet faktorů V poslední fázi se pak už jen objevené závislosti využijí k výpočtu hledaných prvočinitelů faktorizovaného čísla n. Jak právě uvedené myšlenky ukazují, faktorizace velkých čísel metodou GNFS je rozhodně netriviální záležitost. Jestliže jsme u Pollardových metod mohli napsat faktorizační program "na koleně" a pro domácí počítač, tady to už nepůjde. Pokud máte zájem o podrobnosti, v infotipech naleznete souhrnnou monografii o GNFS. Praktické možnosti GNFS Výhodou fáze prosévání je, že může být uskutečňována nezávisle a paralelně na různých strojích - například na internetu. Každý stroj pak nalezenou dvojici (a, b) posílá do centrálního počítače. Naproti tomu zpracování matice je většinou prováděno na jednom centrálním (super)počítači, protože vyžaduje velké množství operační paměti na uložení matice. Dnes je ještě nejužším hrdlem strojový čas na prosévání, v budoucnu - při faktorizaci větších čísel - se jím může stát paměť tohoto superpočítače, pokud nebudou nalezeny efektivní metody paralelního zpracování matice. Možnosti faktorizace metodou GNFS, jak je odhaduje společnost RSASI, ukazuje tabulka 1. Vycházejí z předpokladu, že jsou využity současné schopnosti GNFS a že řešení by mělo být nalezeno do jednoho roku, a zcela se zde zanedbává fáze zpracování matice (tj. časové i paměťové nároky této fáze). Kvadratické síto Metodou, která předcházela GNFS, a která je pro čísla do 110 až 120 cifer dokonce úspěšnější než GNFS, je metoda Quadratic Sieve (QS). Byla v Chipu už popsána v článcích o TWINKLE (viz infotipy, [ROSA]). Nebudeme ji už proto znovu celou popisovat, ale přiblížíme si ji ve formě algoritmu a příkladu. Vlastní algoritmus sledujeme na obrázku 1, přičemž na obrázku 2 vidíme postup na konkrétním čísle. Podstatný je krok 3, v němž hledáme t + 1 (co nejvíce) párů čísel (ai, bi) tak, aby ai2 ( bi (mod n). V kroku 4 z nich vybíráme takovou podmnožinu T, aby součin čísel bi obsahoval jen sudé mocniny prvočísel, tj. aby to byl nějaký čtverec (y2). Součin odpovídajících čísel ai2 bude samozřejmě také čtverec (x2), viz krok 5, a bude platit hledaná rovnost x2 ( y2 (mod n). V kroku 7 pak pomocí x, y určíme faktor čísla n. V kroku 3.1 algoritmu nejprve vytváříme čísla b a poté zjišťujeme, zda jsou hladká. Metoda QS to dělá trochu rafinovaněji - čísla b s touto vlastností nám zůstanou jako výsledek prosévání. QS je trochu podobná vyhledávání prvočísel pomocí tzv. Eratosthenova síta, které ukazuje obrázek 3; možná si na ně vzpomenete ještě z dětství. Napsali jsme prostě do řádku přirozená čísla a vyškrtli jsme z nich všechna dělitelná dvojkou (kromě dvojky samé, která je nejmenším prvočíslem). První zbylé číslo (trojka) je další nejmenší prvočíslo. Ze zbývající množiny jsme tedy vyškrtli všechna čísla dělitelná trojkou, poté pětkou atd. Čísla, která zůstala nepřeškrtnuta, jsou prvočísla. U QS nevyšetřujeme pochopitelně všechna přirozená čísla, ale jen omezenou množinu (přesněji posloupnost) čísel, kterou označíme Q = {q(x); x = (1, (2, (3, ... (M}, kde q(x) je zvolený kvadratický polynom a M je vhodná hranice. Účelem je zjistit, která čísla z Q jsou hladká, tj. rozložitelná na součin prvků z určené faktorové báze F. Princip QS si můžeme vysvětlit jako analogii Eratosthenova síta následovně. Prvky z Q nevyškrtáváme, ale postupně dělíme nalezenými prvočíselnými děliteli. F je předem určená množina prvočísel, opět menších než nějaká stanovená hranice. Proséváme tak, že pro každé prvočíslo p ( F vytvoříme síto Sp = {x1,2 + k*p; |x1,2 + k*p| ( M, k = (1, (2, (3, ...}, kde x1,2 jsou kořeny rovnice q(x) ( 0 (mod p). Pointa je v tom, že pro prvky síta x ( Sp jsou odpovídající prvky q(x) ( Q dělitelné číslem p. Je tomu tak proto, že q je kvadratický polynom, a pokud ke kořenu x1,2 rovnice q(x) ( 0 (mod p) připočteme násobek čísla p, dostaneme opět q(x1,2 + k*p) ( 0 (mod p), neboť zde přibudou navíc jen členy dělitelné p a p2. Čísla q(x1,2 + k*p) - ještě nemodulovaná - jsou tedy dělitelná číslem p. Vlastní prosévání pak konkrétně provedeme tak, že ta čísla q(x) z Q, jejichž index x je ze síta Sp, vydělíme číslem p (resp. jeho nejvyšší možnou mocninou p, kterou je dané číslo dělitelné). Pak pokračujeme v "prosévání" dalším prvočíslem z faktorové báze F. Nakonec nám z některých čísel množiny Q zůstane pouze jednička, což znamená, že původní číslo, které bylo na tomto místě, bylo dělitelné prvočísly z faktorové báze neboli je to hladké číslo. Kdyby všechny počítače světa... Nyní se pokusme odpovědět na otázku z minulého dílu, jak velké číslo bychom právě teď byli schopni faktorizovat, kdybychom měli všechny znalosti současné vědy, hodně peněz a veškerou výpočetní techniku na Zemi. Abychom mohli odpovědět, musíme si ujasnit složitost této úlohy. Složitost úlohy faktorizace Složitost úlohy faktorizace je shora omezená číslem L(N) = exp((c + o(1))*(log N)1/3*(log log N)2/3), kde c = 1,923 a o(1) je veličina jdoucí k nule, když N jde do nekonečna. Nároky na čas jsou proporcionální číslu L(N) a na paměť odmocnině z L(N). Tyto nároky na paměť i čas se týkají jak fáze prosévání, tak fáze řešení matice. Čísla L(N) pro různá N = 2n, která nás zajímají, ukazuje tabulka 2. Z ní je možné odvodit, že faktorizace 768bitového modulu je cca 6135krát časově a 78krát paměťově náročnější než faktorizace 512bitového modulu. Zabývejme se nyní úlohou faktorizace 768bitového modulu. V nejnovější práci Lenstry a Shamira (konstruktér TWINKLE), přednesené společně s výsledky faktorizace 512bitového modulu na konferenci Eurocrypt v minulém roce, se odhaduje, že k řešení úlohy prosévání by bylo potřeba cca 90 000 PC (každý s 5 GB RAM) a po roce jejich práce bychom obdrželi asi jednoterabajtovou matici, řešitelnou na jednom PC s odpovídajícím 1 TB paměti RAM asi 4000 let... Jediným východiskem je proto paralelizovat také úlohu zpracování matice, k čemuž slouží tzv. blokový Lanczosův paralelizační algoritmus (BLPA). Podle něj se matice rozdělí na k částí, které paralelně zpracovávají různé stroje, a ty pak díky vzájemné komunikaci mohou ve velké matici nalézt lineární vztahy (znamená to tedy propojení všech těchto počítačů). Dosud nebyl BLPA vyzkoušen pro k > 16, zatímco v naší úloze potřebujeme k = 80 000, abychom mohli úlohu řešit do tří měsíců (zde použijeme pochopitelně 80 000 PC z první fáze). Zda je něco takového vůbec uskutečnitelné, je předmětem velkého sporu Silvermana na jedné straně (BLPA není vyzkoušen, nebude fungovat pro k = 80 000, problém rychlého vzájemného propojení 80 000 PC vytvářejících ve skutečnosti jeden stroj s prostorově oddělenou pamětí a procesory...) a Lenstry na straně druhé, který žádnou z uvedených námitek za problém nepovažuje. (Fakt ale je, že oba pánové jsou sice odborníky na faktorizaci, ovšem nikoli na paralelní architektury.) Ale dejme tomu, že by se to podařilo. Pak bychom k vyřešení úlohy potřebovali 15 měsíců (12 měsíců prosévání + 3 měsíce řešení matice) a cca (90 000 PC)*(2000 USD/PC) = 180 000 000 USD. Pokud se vám nelíbí odhad 2000 USD za PC s 5GB RAM, dosaďte si sem své číslo; v tomto okamžiku jde však především o to, zda obdržená čísla jsou vůbec ("pro lidstvo") dosažitelná nebo ne. Druhá cesta řešení Další možností řešení jsou specializovaná zařízení. Zatím známe jednoho představitele - TWINKLE, není však vyloučeno, že tajné služby mají něco lepšího, a kdyby lidstvu opravdu "teklo do bot", nenechaly by si to pro sebe... Ale zanechme "kdyby" a dejme slovo prof. Shamirovi. Společně s Lenstrou odhadují na fázi prosévání při faktorizaci 768bitového modulu potřebu 5000 zařízení TWINKLE podporovaných 80 000 počítači (Pentium II s minimální pamětí RAM, cena cca 100 USD), které ve fázi prosévání (6 měsíců) pro TWINKLE připravují data (na jeden TWINKLE cca 16 PC). Cena za upravený TWINKLE je cca 5000 USD, takže za fázi prosévání zaplatíme 5000*5000 + 80 000*100, tj. 33 milionů dolarů (6 měsíců výpočtů). Jak vidíte, TWINKLE může fázi prosévání zlevnit, což je výborné. K druhé fázi můžeme využít počítače z první fáze, ale problém, zda algoritmus BLPA pro k = 80 000 je realizovatelný, zůstává otevřený jako v předchozím případě. Jinak řečeno - zařízení TWINKLE nám trochu zlevnilo první fázi, ale s hlavním problémem nám nijak nepomohlo. Je ohrožen 1024bitový modul? Z tabulky 2 lze odvodit, že faktorizace 1024bitového modulu je 7491286/6135 = 1221krát časově a 35krát paměťově náročnější než faktorizace čísla 768bitového. Tentokrát však TWINKLE na fázi prosévání použít nepůjde, protože úloha přesahuje jeho technické možnosti. Se zvyšováním modulu totiž roste i velikost faktorové báze neboli počet diod. Ten je u TWINKLE omezen na 200 000 (střízlivěji, vzhledem k chybovosti, se uvažuje 100 000 funkčních diod), což je pro 1024bitový modul málo. Nemusí nás to ale nijak zvlášť mrzet - jak dovozují Lenstra se Shamirem, TWINKLE oproti použití PC může fázi prosévání nanejvýše zlevnit. Zlevnění by bylo maximálně o jeden řád a peníze nás v tomto případě tak nezajímají, takže můžeme tuto cestu opustit. Co budeme potřebovat, kdybychom nasadili PC, ukazuje tabulka 3. Nejprve si řekněme, jak tabulka vznikla. První řádek tabulky je převzat z originálního článku Factorization of a 512-Bit RSA Modulus, Eurocrypt 2000, pp. 1 - 17 kolektivu autorů (Lenstra, Montgomery a další), kteří faktorizovali 512bitový modul RSA-155. Všechna ostatní čísla vznikla pouhým násobením koeficientem složitosti, odvozeným z čísel L(N) a L(512) jako L(N)/L(512) u časové náročnosti a jako odmocnina z tohoto koeficientu u paměťové náročnosti. Číslo L(N) i uvedené koeficienty složitosti jsou uznávány v táborech optimistů i pesimistů. Zdůrazňujeme to, protože v různých výpočtech různých autorů se berou v úvahu různé předpoklady. Například údaje o počtu PC z tabulky 1 (Silverman) byly vypočteny na základě úlohy RSA-155, kde počítače nebyly využity pro faktorizaci na 100 %. Proto (a také z důvodu jiného taktování) je jich více, než je uváděno v tabulce 3, kde se předpokládá plné využití a vyšší výkon. Dále poznamenejme, že jako referenční počítač uvádíme PC/450MHz, který je sice už obstarožní, ale slouží jako etalon v různých pracích. Jak tedy vypadá 1024bitový modul podle tabulky 3? Postačí vyrobit desítky milionů PC (například 139 milionů PC/450MHz nebo ekvivalentně 13,9 milionu PC/4500MHz), každý disponující 175 GB RAM. Poznamenejme jen, že to musí být už PC se 64bitovými procesory, aby takovou paměť mohly přímo adresovat. S tímto vybavením pak budeme za rok hotovi s fází prosévání. Nebo investujeme dvojnásobek a výsledek bude za půl roku atd. Pak ale opět přijde na řadu problém umístění a zpracování matice, tentokrát zabírající 5500 GB RAM. Pokud bychom tuto paměť soustředili do jednoho PC, řešení by nám na něm trvalo 75 milionů dní. Takže budeme muset úlohu paralelizovat. Jenže jak by fungoval algoritmus BLPA pro k = 139 000 000 paralelních počítačů, když jsme ještě nevyzkoušeli ani k = 16? Jak by asi fungovalo propojení takového množství počítačů zpracovávajících matici paralelně po blocích? To nevíme a pro tak velké počty nikdo o takovém postupu neuvažuje. Jsou tu sice čistě teoretické předpoklady, že by mohl existovat pokrok, který tyto problémy překoná, ale pokud zůstaneme v realitě, nemáme po ruce nic. Proto se osobně domnívám, že v tento okamžik na 1024bitový modul prostě nestačíme a případní luštitelé 1024bitového modulu RSA budou muset přijít s nějakým nápadem, jak se vyrovnat s druhou fází, nebo s něčím úplně jiným, než je GNFS. Třeba s kvantovými počítači, viz například [VESMIR] v infotipech. Jak to vidí optimisté (nebo ignoranti?) Zcela jiný dojem musí člověk získat při čtení práce [LV], jejíž závěry jsou v zásadním rozporu se Silvermanovými úvahami a také s úvahami v článku, který čtete. Podle [LV] 1024bitový modul RSA nebude - zjednodušeně řečeno - poskytovat příliš velkou bezpečnost už v příštím roce (i když přesná interpretace vyslovených závěrů je trochu složitější). [LV] je velmi sugestivně napsána, takže pokud ji člověk čte jen letmo, snadno připustí několik dílčích rafinovaných extrapolací. Pokud se zkombinují dohromady, celkový závěr práce je dost zdrcující. Na malém prostoru není možné rozvíjet hlubší kritiku, ale za závažnou považuji Silvermanovu výhradu, že [LV] nebere v úvahu paměťové nároky faktorizace. S těmi se [LV] vyrovnává na straně 26 takto: "...protože současné procesory mají dostatek paměti pro problémy řešené metodou NFS v současnosti, můžeme předpokládat, že budoucí procesory budou mít více než dost paměti k řešení budoucích problémů...". Vážným zájemcům ale doporučuji seznámit se s oběma názory, vzhledem k tomu, že autoři [LV] jsou uznávaní odborníci. Závěr Jak velké číslo bychom tedy nyní dokázali faktorizovat, kdybychom měli všechny znalosti současné vědy, hodně peněz a veškerou výpočetní techniku na Zemi? Tabulka 2 dává každému dost možností na vlastní odpověď. Pokroky ve faktorizaci jsou zatím velmi skromné. Faktem zůstává, že nejlepší současnou metodou faktorizace je metoda GNFS, jejíž pomocí bylo v roce 1999 faktorizováno 512bitové číslo (155 desítkových číslic). Další pokroky lze sice očekávat, ale pokud nebude učiněn zásadní objev, praktickým limitem GNFS se zdá být 768 bitů (což je také moje osobní odpověď na vznesenou otázku). Názory na možnosti se ovšem různí - paradoxně přímo diametrálně u největších odborníků pracujících v oblasti teorie čísel. Vlastimil Klíma | vlastimil.klima@i.cz infotipy Monografie o GNFS: [LL] Lenstra, A. K., Lenstra, H. W.: The development of the number field sieve, Springer-Verlag, Berlin, 1993 O faktorizačních metodách: Menezes, A. J., Oorschot, P. C., Vanstone, S. A.: Handbook of Applied Cryptography, CRC Press, New York, 1997 O problematice těles polynomů: Rosa, T.: V klidu a bezpečí, díl 8, Chip 6/00, str. 178 - 180 Vše o nové soutěži: http://www.rsasecurity.com/rsalabs/challenges/factoring/index.html O faktorizaci a zařízení TWINKLE: [ROSA] Rosa, T.: Na to vezmi LED!, Chip 8/99 a 9/99; Jde to i bez Twinklu, Chip 10/99 Bezpečnost a faktorizace podle Silvermana: http://www.rsasecurity.com/rsalabs/bulletins/bulletin13.html Bezpečnost a faktorizace podle Lenstry a Verheula: [LV] Lenstra, A. K., Verheul, E. R.: Selecting Cryptographic Key Sizes, PKC2000, Australia, January 2000, nyní aktualizováno na http://www.cryptosavvy.com/joc.pdf O kvantových počítačích: [VESMIR] Biskup, M., Cejnar, P., Kotecký, R.: Kvantové počítače, Vesmír, roč. 76, květen 1997, str. 250 - 254 Archiv článků: Zmíněné články z Chipu naleznete také v elektronické podobě na http://www.decros.cz/bezpecnost/_kryptografie.html