diff --git a/01-intro/intro.tex b/01-intro/intro.tex index b8a6ce7964877e50c7c8fbe9921bdac1ba718907..782f26a8f59aab986825f29b58ba8ad187f2b049 100644 --- a/01-intro/intro.tex +++ b/01-intro/intro.tex @@ -137,6 +137,66 @@ slepením podepisovacího klíče se zprávou. \section{Náhodné generátory} -TODO +Kryptografické protokoly také často potřebují generátor náhodných bitů \em{(RNG -- random number +generator)}. Ten má být nejen statisticky rovnoměrný, ale pro vnějšího +pozorovatele kompletně nepředvídatelný -- i~pokud by pozorovatel znal celou +historii vygenerovaných bitů, nesmí mu to pomoci zjistit cokoliv o~následujícím bitu. + +RNG se používá zejména pro generování klíčů, ale má i jiné zajímavé aplikace. + +\examplen{hybridní šifra}{ +Zatímco symetrické šifry obvykle mají lineární časovou složitost, všechny známé asymetrické +šifry jsou asymptoticky pomalejší. Proto se používá konstrukce, která kombinuje oba druhy šifer. +Říká se jí \df{hybridní šifra} a funguje následovně: + +\tightlist{o} +\:Značení: + \tightlist{o} + \:Nechť $E_A$ a $D_A$ je šifrovací a dešifrovací funkce nějaké asymetrické šifry. + \:$K_E$ a $K_D$ je šifrovací a dešifrovací klíč pro tuto šifru vygenerovaný Bobem. + Klíč $K_E$ je veřejný a zná ho i~Alice. Klíč~$K_D$ je soukromý Bobův. + \:$E_S$ a~$D_S$ je šifrovací a dešifrovací funkce nějaké symetrické šifry. + \endlist +\:Alice chce poslat nějakou zprávu~$x$ Bobovi. +\:Alice vygeneruje náhodný klíč~$N$ pro symetrickou šifru. +\:Alice zašifruje zprávu symetricky: $y = E_S(N, x)$. +\:Alice zašifruje klíč~$N$ asymetricky: $z = E_A(K_E, y)$. +\:Alice pošle Bobovi $y$ a~$k$. +\:Bob použije asymetrickou šifru, aby získal klíč $N = D_A(K_D, z)$. +\:Bob použije symetrickou šifry, aby získal zprávu $x = D_S(N, y)$. +\endlist +} + +Všimněte si, že pomalou asymetrickou šifru používáme jen na krátký řetězec~$N$ fixní délky, +zatímco celou dlouho zprávu~$x$ šifrujeme symetricky. + +Útočník má následující možnosti: + +\tightlist{o} +\:zaútočit na symetrickou šifru +\:zaútočit na asymetrickou sifru +\:zaútočit na náhodný generátor: pokusit se uhodnout klíč~$N$ +\endlist + +\examplen{výzva a odpověď}{ +Alice je uživatel a Bob server. Alice chce Boba přesvědčit, že zná heslo, ale nechce mu ho posílat. +Udělají to následovně: Bob vygeneruje náhodný řetězec -- \em{výzvu (challenge).} Alice výzvu podepíše +pomocí svého klíče, například zahešováním výzvy spojené s~heslem, a~pošle to jako \em{odpověď (response).} +Bob také zná heslo, takže může provést stejný výpočet a ověřit, že mu vyšlo totéž. +} + +\examplen{přehrávací útok a nonce}{ +Zamysleme se nad vlastnostmi výzvy v~předchozím příkladu. Především se nesmí opakovat. Jinak by si totiž +útočník mohl zaznamenávat všechny Aliciny odpovědi a když by později od Boba dostal tutéž výzvu, mohl by +odpovědět zaznamenanou odpovědí. Tomu se říká \em{přehrávací útok (replay attack)} -- útočník použil +legitimní zprávu, ale v~jiném kontextu. + +To je v~kryptografii velmi typická situace: potřebujeme generovat nějaké řetězce \uv{na jedno použití}. +Těm se říká \em{nonce} z~anglického \uv{number used once}. My si toto slovo počeštíme a budeme ho skloňovat +podle vzoru \uv{růže}. Kde takovou nonci sehnat? Buďto si můžeme pořídit počítadlo a postupně ho zvyšovat; +jak uvidíme v~kapitole TODO, udržování stavu je v~praxi dost problematické. Proto bývá jednodušší nonci +generovat náhodně. Teoreticky se sice může zopakovat, ale jak uvidíme v~oddílu TODO, stane se to s~velmi +malou pravděpodobností. +} \endchapter