Algoritmus RSA Vilém Vychodil 4. břza 2002 Abstrakt Násldující podpůrý txt stručě shruj základí problmatiky při šifrováí algoritmm RSA. Sm spadá j samotý pricip algoritmu, al i základí mtody grováí vlkých prvočísl. Txt po čtáři vyžaduj prakticky žádé zalosti, můž být proto použit jako doplňkový matriál i v kursu Paradigmata programováí I. Autor můž být kotaktová prostřdictvím lktroické pošty a adrs <vilm.vychodil@upol.cz>. Základí pojmy V dalších úvahách vycházím z jdé algbraická struktury okruhu clých čísl (Z, +, ). Zvolím-li pvé číslo m N, pak můžm a možiě Z dfiovat biárí rlaci θ m přdpism θ m = { a, b ; a = b + t m, pro ějaké t Z}. (1) Sado lz ukázat, ž rlac θ m j kvivalc a Z. Podrobě, θ m j zcla jistě rflxiví, platí a = a + 0 m, odtud ply a, a θ m. Pokud a, b θ m, pak lz psát a = b + t m pro ějaké t Z. Tto výraz lz upravit a a t m = b. Odtud již z komutativity a z vlastostí opačého prvku ply b = a + ( t) m, to jst b, a θ m rlac j symtrická. Nyí stačí ověřit trasitivitu. Uvažujm a, b θ m, b, c θ m. Existují tdy vyjádří a = b + s m, b = c + t m. Dosazím za b dostávám a = c + t m + s m, to jst a = c + (t + s) m. Rlac θ m j vskutku kvivalc a Z. Rlac θ m dfiovaá vztahm (1) j kogruc a Z, to jst splňuj substitučí podmíky vzhldm k opracím okruhu (Z, +, ). To zamá, ž pro libovolé a, b θ m, c, d θ m platí a + c, b + d θ m a a c, b d θ m. Platost lz opět sado ověřit, vyjdm-li z vztahů a = b + t m, c = d + s m, pak lz vyjádřit a + c = b + d + (t + s) m. Odtud ply a + c, b + d θ m. Dál a c = b d + (b s + d t + t s m) m, to jst i a c, b d θ m. Pozámka. V litratuř bývá kogruc θ m azýváa obvykl kogruc modulo m. Fakt a, b θ m j obvykl zač a b (mod m). Toto začí by však v dalším txtu bylo přhldé, proto jj budm používat. Dál j dobré uvědomit si, co zamá přdpis (1). Čísla a a b jsou kogrutí modulo m, právě když m (a b), to ply rovou z dfiičího vztahu. Vzhldm k tomu, ž kogruc θ m j rlací kvivalc, lz dl í rozložit Z právě a m tříd rozkladu. Každá třída rozkladu rprstuj možiu čísl z Z, ktré dávají po vydělí číslm m stjý zbytk. Rozkladm okruhu (Z, +, ) j vytvoř faktorový okruh Z/θ m. Oprac pro třídy rozkladu lz dfiovat přirozě pomocí oprací okruhu (Z, +, ), díky substitučí podmíc avíc jsou výsldky oprací ovlivěy výběrm prvku z třídy rozkladu. 1
Dfiic 1. Nchť m N a θ m Z Z ozačuj kogruci dfiovaou vztahm (1). Ozačm a] m = {b; a, b θ m } třídu rozkladu do íž pad prvk a Z. Dál chť možia Z/θ m ozačuj systém všch tříd rozkladu dl θ m, to jst Z/θ m = {a] m ; a Z}. Na Z/θ m zavdm oprac ásldujícími přdpisy, Struktura (Z/θ m, +, ) s azývá faktorový okruh modulo m. a] m + b] m = a + b] m, (2) a] m b] m = a b] m. (3) Pozámka. Nulou okruhu (Z/θ m, +, ) j prvk 0] m. Opačým prvkm k a] m j m a] m, boť a] m + m a] m = a + m a] m = m] m = 0] m. Jdičkou okruhu j 1] m. V litratuř s můž začí opět odlišovat. Okruh (Z/θ m, +, ) j obvykl azývá okruh zbytkových tříd modulo m a zač (Z m, +, ), jho prvky bývají začy C 0 až C m 1. V ašm případě toto začí korspoduj s třídami 0] m až m 1] m. Dfiic 2. (Eulrova ϕ-fukc) Zobrazí ϕ: N N, ktré každé N zobrazuj a počt mších s ím soudělých čísl, to jst s azývá Eulrova ϕ-fukc. ϕ() = Card {k; k N, k <, sd (k, ) = 1}, (4) V ěktrých případch lz hodotu Eulrovy ϕ-fukc staovit vlmi rychl. Mtoda šifrováí RSA j založa právě a vhodých vlastostch Eulrovy ϕ-fukc. J-li prvočíslo, bo j v tvaru součiu dvou prvočísl, pak lz hodotu ϕ() staovit ihd. Lmma 1. Nchť p, q N jsou prvočísla. Pak platí ϕ(p) = p 1 a ϕ(pq) = (p 1)(q 1). Důkaz. J-li p prvočíslo, potom j každé číslo k N, k < s číslm soudělé. Těchto čísl j právě p 1. Nyí uvažujm číslo v tvaru = pq, kd p, q jsou prvočísla. Všcha čísla soudělá s jsou buďto v tvaru s p, bo t q. Soudělých čísl v tvaru s p mších jak j al právě q 1. Stjě tak soudělých čísl v tvaru t q mších jak j právě p 1. Dohromady dostávám ϕ(pq) = (pq 1) (p 1) (q 1) = pq p q + 1 = (p 1)(q 1). Lmma 2. Nchť a Z, N jsou soudělá čísla. Pak platí, (i) Všcha čísla p a] jsou s soudělá. (ii) J-li avíc q Z soudělé s, pak j i číslo q a soudělé s. (iii) Všcha čísla soudělá s tvoří právě ϕ() tříd rozkladu podl θ. Důkaz. (i) Uvažujm třídu rozkladu a] a libovolé číslo p a]. Platí p = a + t. Přdpokládjm, ž m, m p. Z přdpokladu platí m (a + t). Jlikož m, platí i m t. Rověž platí i m (p t). Podroběji, z t = m s 1, p = m s 2 ply p t = m(s 2 s 1 ), to jst m (p t). Z přdchozích zjištěí dál ply m a. Odtud dostávám m = 1. (ii) Uvažujm dvě čísla q, a Z soudělá s. To jst platí sd (q, ) = 1, sd (a, ) = 1. Chcm ukázat, ž i sd (a q, ) = 1. K úplě přsému důkazu by bylo třba dfiovat pojm asociovaé prvky, my s však pro zjdoduší omzím pouz a přirozé jvětší spolčé dělitl. Bz újmy lz vyjádřit sd (a q, ) = sd (a q, sd (, q)), z asociativity 2
dál ply sd (a q, ) = sd (sd (a q, q), ). Platí sd (a q, q) = q sd (a, ). Odtud dostávám sd (a q, ) = sd (q sd (a, ), ) = sd (q, ) = 1, což bylo dokázat. Důkaz bodu (ii) by správě potřbovat dtailější rozbor vlastostí dělitlosti v oboru itgrity, to al í cílm tohoto txtu. (iii) Existuj právě ϕ() vzájmě růzých přirozých čísl ostř mších ž a zárovň soudělých s. Ozačm tato čísla a 1,..., a ϕ(). Všchy prvky tříd a 1 ],..., a ϕ() ] jsou čísla s soudělá, to jst {a i ] ; 1 i ϕ()} j možiou všch čísl soudělých s. Navíc pro dvě třídy rozkladu a i ] = a j ] lz p a i ] vyjádřit jako p = a i + t = a j + s. Odtud dostávám a i a j = (s t). Jiak řčo a i a j, al a i, a j 1, tdy platí a i = a j. Třídy rozkladu jsou vzájmě růzé a j jich právě ϕ(). Věta 1. (Frmatova-Eulrova) Nchť q Z, N jsou soudělá čísla. Pak platí q ϕ()] = 1]. (5) Důkaz. Ozačm a 1,..., a ϕ() všcha růzá čísla soudělá s, pro ktrá platí a i < pro libovolé i = 1,..., ϕ(). Podl přdchozí lmmy jsou a 1 ],..., a ϕ() právě všchy ] třídy čísl soudělých s. J-li q číslo soudělé s, pak jsou rověž i qa 1,..., qa ϕ() čísla soudělá s, to opět ply z přdcházjící lmmy. Třídy qa i ], qa j ] jsou pro libovolá 1 i, j ϕ(), i j vzájmě růzé. Přdpokládám-li qa i ] = qa j ], pak lz libovolý p qa i ] vyjádřit v tvarch p = qa i + s a p = qa j + t. To jst platí qa i + s = qa j + t, odtud q(a i a j ) = (t s). Odtud dostávám, ž (a i a j ), protož q j s soudělé. Al čísla a i, a j 1, to jst a i = a j. Z přdchozího faktu ply, ž třídy a 1 ],..., ] a ϕ() a qa 1],..., ] qa ϕ() jsou až a pořadí totožé. Ozačm a] = a 1 ] a 2 ] a ] ϕ() = ] a 1 a 2 a ϕ(). Pak platí, a] = a 1 ] a 2 ] a ] ϕ() = qa 1] qa 2 ] qa ] ϕ() = q ϕ() a ] = q ϕ()] a]. Jlikož j a soudělé s, platí a] 0]. Tík pádm lz přdchozí vztah vykrátit a] a dostávám požadovaé tvrzí q ϕ()] = 1]. Z přdcházjícího tvrzí mimo jié ply, ž pro soudělá čísla q Z, N dělí číslo q ϕ() 1 bz zbytku, to jst q ϕ() 1. Další části txtu s věují využití vlastosti Eulrovy ϕ-fukc při asymtrickém šifrováí mtodou RSA. Pricip algoritmu RSA Algoritmus RSA j asi jzámějším rprstatm asymtrických mtod šifrováí. V roc 1977 jj avrhli Ro Rivst, Adi Shamir a Loard Adlma, algoritmus s jméo právě podl ich. Asymtrická kryptografi j založa a dvou od sb růzých klíčích. Jd z klíčů j používá výhradě k šifrováí a lz jj použít k dšifrováí. Druhý klíč j využívá výlučě pro dšifrováí a aopak jj lz použít k šifrováí. V praxi j pouz jd z dvojic klíčů vřjě dostupý, druhý j utaj. Aby byla asymtrická kryptografi skutčě robustí, musí být zaruča praktická možost výpočtu jdoho klíč z druhého. Asymtrické šifrovací algoritmy jsou aplikací tori složitosti, jdé z stěžjích disciplí iformatiky. Dvojic klíčů j vola tak, aby výpočt jdoho klíč z druhého byl sic algoritmicky řšitlý, al úosý z hldiska výpočtího výkou soudobých i budoucích počítačů. 3
Clý algoritmus j zhruba ásldující. Njprv jsou zvola dvě prvočísla p, q, jjich souči ozačm = pq. Jlikož j v tvaru součiu prvočísl platí ϕ() = (p 1)(q 1). Dál zvolím čísla, d aby platilo d] ϕ(). Dvojic čísl,, d, tvoří vřjý a soukromý klíč. Ozačm zdrojovou zprávu v a zakódovaou zprávu w. Pokud chc odsílatl zakódovat zdrojovou zprávu v, vychází z vztahu w] = v ]. Příjmc zprávy obdrží w a rozkóduj jj pomocí vztahu v] = w d]. Při použití algoritmu j uté vyřšit ěkolik zásadích problémů. Njprv j uté dokázat správost mtody uvdé v přdchozím odstavci. Navíc j potřba z vhodě zvolých a pomocí vztahu d] ϕ() vypočítat číslo d. Dál j potřba mít k disposici jdoduchý algoritmus grováí vlkých prvočísl s přijatlou časovou složitostí. Dalším problémm j fktiví implmtac mocěí modulo m, ktré s používá při šifrováí a dšifrováí. V posldí řadě hraj roli i volba kódováí zprávy. Slova v, w uvdá v přdchozím odstavci rprstují čísla 0 v, w 1. Přášé zprávy však mívají většiou charaktr skvc zaků. Na jdotlivé problémy s pokusím odpovědět v dalším txtu. Násldující tvrzí ukazuj správost algoritmu. Věta 2. (Správost algoritmu RSA) Nchť p, q jsou prvočísla, = pq. A chť, d jsou libovolá čísla splňující podmíku d] ϕ(). Dál ozačm v, w čísla 0 v 1 a chť platí w] = v ]. Potom platí v] = w d]. Důkaz. V důkazu správosti algoritmu vycházím z d] ϕ() a w] = v ]. Dokazujm platost v] = w d]. Z vztahu d] ϕ() ply, ž d, 1 θ ϕ(). Jiak řčo souči d dává po dělí ϕ() zbytk jda, to jst platí d = 1 + rϕ(). Pokud dál umocím vztah w] = v ] do tvaru w d] = v d], lz místo dokazovaého vztahu v] = w d] psát v] = v d]. Pro důkaz správosti algoritmu tdy stačí ověřit platost v] = v 1+rϕ()]. (6) Důkaz j dál vd rozborm případů. Kokrétě uvažujm číslo v buďto soudělé s, bo soudělé. V případě, ž v j soudělé s lz psát v 1+rϕ()] = v] v rϕ()], to jst stačí ověřit v rϕ()] = 1]. Dál z Frmatovy-Eulrovy věty ply v ϕ()] = 1]. Umocěím tohoto vztahu a z vlastostí kogruc dostávám v rϕ()] v = ϕ()] r = 1]r = 1r ] = 1]. (7) V případě, ž ž v j soudělé s = pq musí být v buďto v tvaru v = ap, bo v tvaru v = bq. Bz újmy lz přdpokládat, ž v = ap. V tomto případě j al v soudělé s q, jlikož q j prvočíslo. V okruhu (Z/θ q, +, ) můžm vyjádřit v rϕ()] v = ϕ()] r = v (p 1)(q 1)] r = v (q 1)] (p 1)r = 1] q. (8) q q q q Posldí rovost ply z faktu, ž q j prvočíslo a proto ϕ(q) = q 1. Navíc podl Frmatovy- Eulrovy věty j v (q 1)] q = v ϕ(q)] q = 1] q. Jlikož platí i v rϕ(q)] q = 1] q, lz tto fakt vyjádřit v tvaru v rϕ() = 1 r + tq, po vyásobí této rovosti v obdržím v 1+rϕ() = v + vtq, to jst v 1+rϕ() = v + atpq. Zárovň platí = pq, tdy v 1+rϕ() = v + (at), jiými slovy v] = v 1+rϕ()], což bylo dokázat. 4
Síla algoritmu RSA j patrá právě z tohoto důkazu. Odsílatl pošty můž z zalosti v, w, a jdoduš staovit hodotu d. K tomu by musl vyřšit kogruci d] ϕ(). Pro správé řší j jprv uté zát hodotu ϕ(). Pro vlké číslo lz hodotu ϕ() v dohldé době vypočítat. Rověž prvočíslý rozklad vlkého čísla trvá úosou dobu. Dosud í zám fktiví algoritmus rozkladu a prvočiitl. Příklad 1. Zvolm apříklad prvočísla p = 5437, q = 7331. Dál staovím, = pq = 39858647, ϕ() = (p 1)(q 1) = 39845880, = 25634761, d = 37458481. Dvojic,, d, tvoří vřjý a tajý klíč. Nyí můžm zakódovat apříklad v = 1234 pomocí vztahu w] = v ], dostávám w = 14807834. Naopak při rozkódováí vycházím z vztahu v] = w d], kd w = 14807834 a obdržím v = 1234. Pozámka. Na přdchozím příkladu jsou dobř vidět dvě úskalí. V prví řadě í jasé, jak byla čísla, d staova. Tato čísla vskutku splňují podmíku d] ϕ(). V případě malých čísl lz jjich volbu provést ad hoc. V případě vlkých čísl j uté vypočítat jd klíč pomocí druhého a čísla ϕ(). To jst a počátku j vhodě zvol apříklad pouz klíč a pomocí hodoty ϕ() j vypočt příslušý klíč d. Dalším, spíš tchickým problémm, j samotý výpočt w z v a obrácě. Na prví pohld s abízí umocit apříklad v a zjistit zbytk po dělí číslm. To by v přdchozím případě al zamalo vypočítat jprv číslo o log 10 (v ) = log 10 (v). = 79245126 cifrách, což j aprosto úosé. Navíc tto fakt j jště umocě vlmi prozřtlou volbou prvočísl p, q. Čísla byla z dmostračích důvodů zvola vlmi malá zlomí klíč by v jjich případě bylo příliš časově áročé. Věta 3. Nchť p, q jsou prvočísla, = pq. Dál zvolm prvočíslo 2 1 soudělé s číslm ϕ(). Přdpokládjm, ž pro čísla, d platí d] ϕ(). Potom d j v tvaru d = 1 + rϕ(), kd r] = ( 1)ϕ() 2]. (9) Důkaz. Pozamjm, ž d] ϕ() platí právě když platí d = 1 + rϕ(). To jst fakticky stačí ověřit, zdali j číslo r volo tak, aby platilo 1 + rϕ(). Pak lz staovit d a platost vztahů j tím dokázáa. Pro číslo platí 1 + rϕ() právě když 1 + rϕ(), 0 θ, to jst právě když zbytk po dělí výrazu 1 + rϕ() číslm j ula. Tuto podmíku lz kvivaltě vyjádřit v tvaru 1 + rϕ()] = 0], bo jiak 1] + r] ϕ()] = 0], dál jako r] ϕ()] = 1]. Opačý prvk k 1] má tvar 1]. Pomocí ivrs lz vyjádřit r] = 1] ϕ()] 1 Vztah (9) j tdy platý právě když j ϕ()] 1 rov ϕ() 2]. Platí, ϕ()] ϕ()] 1 = ϕ()] ϕ() 2] ϕ() = 1] = ϕ() ϕ()] = 1]. (10) Posldí vztah ply z přdpokladu soudělosti ϕ() s a užitím Frmatovy-Eulrovy věty. Samozřjmě platí ϕ() = 1, protož bylo volo jako prvočíslo. Tím j al důkaz hotov. Volba čísla r implikuj platost 1 + rϕ() a podmíka d = 1 + rϕ() j splěa.. 5
Příklad 2. Přdchozí tvrzí dává ávod, jak jdoduš staovit klíč. Uvažujm hodoty p, q z miulého příkladu. Dál přdpokládjm, ž jsm zvolili číslo. Číslo j v ašm případě prvočíslo a vidtě dělí ϕ(), to jst má požadovaé vlastosti. Z vztahů (9) vypočítám pomocé číslo r = 24098833, a potom i d = 37458481. Staovím klíčů s opět otvírá problém fktivího výpočtu zbytku po dělí umocěého čísla. Tímto problémm s budm zabývat yí. Ozačm pro přhldost Rs (a, m) zbytk po dělí čísla a číslm m, to jst pro a = bm + r j Rs (a, m) = r. Pro mocěí přirozých čísl a, j zám algoritmus s logaritmickou časovou složitostí. Platí totiž, a 2 a 2 pro sudé, > 1, a = a a 1 pro liché, > 1, (11) a pro = 1. Pokud bychom vyšli z tohoto algoritmu a počítali Rs (a, m), při mocěí vlkých čísl vlkými čísly bychom s záhy dostali do potíží. Například výsldkm umocěí dvou stocifrých čísl j víc jak (10 100 )-cifré číslo. Výpočt takové mociy j hluboko za hraicmi možostí jakéhokoliv byť i hypottického výpočtího systému. Díky vlastostm kogruc však můžm provádět opraci Rs (a, m) v každém kroku výpočtu. Ituitivě řčo, při výpočtu j využito vlastosti a ] m = a] m a v paměti počítač jsou udržováa čísla s stál stjým počtm cifr. Násldující kód v jazyku Schm dmostruj implmtaci fukc xpmod využívající tohoto pricipu. (dfi (xpmod x m) (dfi (v? ) (= (modulo 2) 0)) (dfi (sqr x) (* x x)) (cod ((= 0) 1) ((v? ) (modulo (sqr (xpmod x (/ 2) m)) m)) (ls (modulo (* x (xpmod x (- 1) m)) m)))) Výš uvdou procdurou lz fktivě kódovat, dkódovat i vypočítat klíč. Při výpočtu klíč j opět uté využít fukci xpmod při staoví pomocé hodoty r. Přdpokládjm, ž mám dfiováy hodoty pro p, q, a staovu hodoty ϕ() a rověž klíč. Klíč d lz fktivě vypočítat ásldujícím kódm. (dfi r (modulo (* (- 1) (xpmod phi- (- 2) )) )) (dfi d (/ (+ 1 (* r phi-)) )) (= (xpmod (xpmod 1234 ) d ) 1234) Symbol phi- rprstuj hodotu ϕ() = (p 1)(q 1). Výsldkm vyhodocí výrazu a třtím řádku j #t začící pravdu, to jst zkušbí zakódovaé slovo 1234 bylo správě dkódováo. Pozámka. Obrácou tchikou k šifrováí s vřjým klíčm j lktroický podpis. V podstatě s jdá o modifikaci problému. Pouz jd účastík můž zprávu zašifrovat, ostatí ji mohou pouz rozšifrovat tím s přsvědčí o pravosti zprávy. Vzhldm k tomu, ž dvojic klíčů,, d, j komplmtárí, lz ji vzájmě použít j k šifrováí v smyslu utají dat, al právě i k lktroickému podpisu šifrováí v smyslu ověří pravosti. Navíc j použit týž šifrovací a dšifrovací algoritmus, pouz s zaměěými klíči. 6
Probabilistické tstováí prvočíslosti Při implmtaci mtody j potřba vhodě volit počátčí prvočísla p, q. Složitost zlomí klíč j úměrá jjich vlikosti. Otázkou j, jak fktivě grovat vlká prvočísla s řádově stovkami cifr. Jlikož j xaktí tstováí prvočíslosti pro vlká čísla úosé, v aplikacích často stačí mít k disposici číslo, ktré j téměř jistě prvočíslm. Zcla dostačující pravděpodobost prvočíslosti j apříklad 1 10 20. Mzi základí probabilistické mtody tstováí prvočíslosti patří mtoda založá a platosti Frmatovy-Eulrovy 1 věty. J-li prvočíslo, pak pro každé a soudělé s platí a 1] = 1]. Čísla soudělá s mohou být pouz v tvaru t, pro t Z. Odtud dostávám, ž pro 1 a 1 j za přdpokladu prvočíslosti podmíka a 1] = 1] vždy splěa. Pokud í podmíka a 1 ] = 1] pro ějaké 1 a 1 splěa, číslo můž být prvočíslo. U vlkých čísl í možé tstovat všcha čísla splňující 1 a 1. Tst j provádě j kostatě moha pokusy při ichž j vola hodota a áhodě. Pokud j pokusů dostatčě moho a podmíka j při ich splěa, j vysoc pravděpodobé, ž j prvočíslo. Existují však čísla, pro ktré huristický tst založý a přdchozích úvahách částčě slhává. Dfiic 3. (Carmichalovo číslo) Nchť m j složé číslo a chť pro libovolé a Z soudělé s m platí a m 1] m = 1] m. Složé číslo m s azývá Carmichalovo číslo. To jst pokud j provdo k áhodých volb čísla a a ai v jdom případě dělí Carmichalovo číslo m, potom huristický tst prohlásí číslo m za prvočíslo, což í pravda. Njmším Carmichalovým číslm j 561, dál 1105, 1729,... Pouz šstáct Carmichalových čísl j mších ž 10 5 a pouz 2163 j mších ž 25 10 9. To j vzhldm k počtu 10 7 prvočísl mších ž 25 10 9 zadbatlé možství. Ačkoliv jsou Carmichalova čísla mzi ostatími přirozými čísly rozloža vlmi řídc, v roc 1994 bylo dokázáo, ž j jich kočě moho, viz 1]. Naštěstí při tstováí dostatčě vlkých kadidátů a prvočíslo lz zásah Carmichalova čísla prakticky vyloučit. Pozámka. Algoritmus grováí vlkých prvočísl j přímočarý. Njprv j vygrováo vlké číslo. V dalším kroku j číslo zpracováo huristickým tstm. Pokud tst slž, j vygrováo ové vlké číslo a tstovací procdura s opakuj. Grováí ových čísl probíhá dokud í alzo číslo, pro ktré j huristický tst splě. V většiě programovacích jazyků lz grovat vlká čísla přímo a j uté vytvářt j po jdotlivých cifrách. Násldující fukc gruj vlké číslo po cifrách. (dfi (slct-umbr digits) (dfi (itr i accum) (if (>= i (- digits 1)) accum (itr (+ i 1) (+ (* accum 10) (radom 10))))) (itr 0 (+ (radom 9) 1))) Fukc slct-umbr vrací áhodě vygrovaé číslo o zvolém počtu cifr. Při grováí j uté vhodě volit hodotu prví cifry. Prví cifra můž být ulová, jiak by byl zachová počt požadovaých platých cifr. Pro tstováí prvočíslosti a grováí vlkých prvočísl lz vytvořit další dvě fukc. 1 V litratuř j možé stkat s s ozačím Malá Frmatova věta. Pirr d Frmat ji vyslovil poprvé v roc 1640, avšak k tvrzí podal důkaz. Důkaz byl sstav až Lohardm Eulrm v roc 1736. 7
(dfi (fast-prim? tims digits) (dfi (frmat-tst ) (dfi a (+ 2 (slct-umbr (+ (radom digits) 1)))) (= (xpmod a (- 1) ) 1)) (cod ((= tims 0) #t) ((frmat-tst ) (fast-prim? (- tims 1) digits)) (ls #f))) (dfi (slct-prim digits) (dfi (itr cadidat) (if (fast-prim? cadidat 50 (- digits 2)) cadidat (itr (slct-umbr digits)))) (itr (slct-umbr digits))) Prdikát fast-prim? j pravdivý právě když vstupí číslo o digit cifrách splňuj podmíku huristického tstu. Počt opakováí tstu j dá argumtm tims. Fukc slct-prim postupě gruj vlká čísla a požadovaém počtu cifr dokud í alzo číslo splňující podmíku huristického tstu. Kódováí vstupí abcdy Až doposud byly kódovaé zprávy uvažováy jako čísla. V praxi s však kódují přdvším zprávy složé z zaků. Jdotlivé zaky jsou v počítači rprstováy rověž čísly zpravidla s osmibitovým rozsahm, to jst čísly 0,..., 255. Algoritmus RSA šifruj čísla s rozsahm 0 v 1. Obvykl bývá výrazě větším číslm ž 255, bylo by tdy úsporé kódovat vstupí zprávu po zacích. Z hldiska bzpčostího j to rověž vyhovující obsah zprávy by bylo možé dkódovat pomocí frkvčí aalýzy. Jdím z možých řší j kódovat vždy skupiu zaků. Zdrojová zpráva j jprv rozděla do bloků o kostatí délc l. Každý blok j samostatě zakódová. Uvažujm ji zaky kódovaé osmi bity, můžm jdotlivé zaky chápat jako cifry čísla zapsaého v číslé soustavě o základu 256. Problém kódováí bloku j tdy problémm přvdí l-cifrého čísla z soustavy o základu 256 do dkadické soustavy. Číslo v tomto tvaru již í problém zašifrovat pomocí algoritmu RSA. Po dšifrováí j potřba provést zpěté dkódováí, to jst přvod do soustavy o základu 256 a přvod a zaky. Otázkou zůstává, jak volit délku bloku l. Délka bloku musí rspktovat vlikost čísla 1. Pokud by ěktré l-cifré číslo zapsaé v soustavě o základu 256 mělo dkadické vyjádří větší jako 1, dkódováí zprávy po rozšifrováí by bylo jdozačé. Maximálí možá délka j cločíslá hodota l = log 256 ( 1). Například pro = 39858647 j log 256 ( 1) = 3.612, to jst bzpčá vlikost bloku j l = 3. Násldující fukc provádějí kódováí a dkódováí vstupí a výstupí zprávy. (dfi (cod-block block bas) (dfi (itr block aux) (if (ull? block) aux (itr (cdr block) (+ (* bas aux) (car block))))) (itr (map char->itgr (strig->list block)) 0)) 8
(dfi (dcod-block umbr bas) (dfi (dcod umbr) (if (< umbr bas) (list umbr) (appd (dcod (quotit umbr bas)) (list (modulo umbr bas))))) (list->strig (map itgr->char (dcod umbr)))) Argumty block, umbr rprstují vstupí řtězc zaků a vstupí číslo. Argumt bas j číslý základ. V drtivé většiě případů by měl být rov 256. Pokud by al uživatl chtěl kódovat apříklad pouz sdmibitové txty, můž použít hodotu 128. J-li ku příkladu zakódová řtězc Ahoj s základm 128, jho kódm j číslo a = 134836514, to jst kvivaltí zápis v dsítkové soustavě. Naopak přvdím čísla a zpět do soustavy o základu 256 a přvodm čísl a zaky obdržím řtězc Ahoj. Pozámka. Zvolé řší j spíš dmostrativí. Při fktiví implmtaci s používají odlišé mtody kódováí. Přdvším šifrovat lz přímo v dvojkové soustavě, a klíč mají zpravidla délku dělitlou osmi kódováí s tak výrazě zjdodušuj. Přd samotým šifrováím jsou obvykl data komprimováa ějakým slovíkovým komprsím algoritmm, apříklad algoritmm LZW. Rfrc 1] Alford, W. R. Gravill, A. Pomrac, C. Thr ar ifiitly may Carmichal umbrs. A. Math., 140 (1994) 703-722. 2] Gravill, A. Pomrac, C. Two cotradictory cojcturs cocrig Carmichal umbrs. Math. Comp., (2001) to appar i prit. 3] Pich, R. Th Carmichal umbrs up to 1015. Math. Comp., 61:203 (1993) 381-391. 4] Rivst, R. L. Shamir, A. Adlma, L. A mthod for obtaiig digital sigaturs ad public-ky cryptosystms. Commuicatios of th ACM, 21(2):120-126, Fbruary 1978. 9