„Bezpečnost závisí na tom, že není možné najít dva dokumenty se stejným otiskem jinak, než hrubou silou.“
Ne úplně. Jde o to, jestli není možné tyto dva dokumenty najít v použitelném čase, jedno, jestli hrubou silou, nebo jinak. Jinak by mohl být 32b hash bezpečnější než sha1, což exidentně není pravda. Ideální 32b hash možná nepůjde lousknout jinak než hrubou silou, ale hrubá síla bohatě stačí. Naopak modernější hashovací funkce mohou mít teoretické slabiny, které umožní najít kolizi rychleji než hrubou silou, ale to neznamená, že jsou prakticky použitelné.
„Zašifrujete otisk a získáte elektronický podpis konkrétního dokumentu.“
Ehm… zašifrujete? Opravdu? V případě RSA to funguje přesně naopak, podepisuju rozšifrováním hashe.
Proč si to sám nepřečtete aspoň na Wikipedii? Při podepisování se podepisují hashe, protože šifrování/dešifrování asymetricou šifrou je pomalé a šifrovat/dešifrovat jím původní zprávu by bylo zdlouhavé. Ze stejného důvodu se při šifrování zpráva šifruje symetrickou šifrou a asymetrickou šifrou se zašifruje pouze klíč, který se k zprávě přiloží.
Ty vole, Jirsák, o čem to blábolíte? Kde tvrdím, že se šifruje celá zpráva? Já jen říkám, že RSA je možné použít oba klíče jak pro šifrování, tak pro podpis a to jako reakci na výrok mistra šestáka, že "V případě RSA to funguje přesně naopak, podepisuju rozšifrováním hashe.".
To je samozřejmě blbost, protože hash se podepisuje zašifrováním privátním klíčem.
Ale matematicky vzato podpis pomocí RSA opravdu odpovídá dešifrování (až na padding). A ověření naopak odpovídá zašifrování (opět až na padding) a porovnání výsledku s hashem dat.
Ano, je to trošku kontraintuitivní, ale dává to smysl. Místo šifrování a dešifrování mluvme o transformaci a zpětné transformaci. Veřejný klíč dovolí komukoli provést transformaci, zatímco soukromý dovolí svému vlastníkovi provést zpětnou transformaci. Podstatné je, že zatímco transformaci může provést kdokoli, zpětnou transformaci může provést jen vlastník soukromého klíče. A nyní tento systém transformací můžeme využít:
a. Na šifrování, kdy transformace bude fungovat jako šifrování a zpětná transformace jako dešifrování.
b. Na podpisy, kdy zpětná transformace bude sloužit na podepsání a transformace bude sloužit na ověření.
Pokud přehodíte transformaci a zpětnou transformaci, ztratíte bezpečnost, protože najednou mohou podepisovat nebo dešifrovat všichni. A tady snad je jasné, v čem odpovídá RSA podepisování a RSA dešifrování. A ono to neodpovídá jen tím, že k tomu potřebuju privátní klíč, ona to je do jisté míry totožná operace. Rozdíl je jen v tom, že u podepisování vstup zahashuju, zatímco u šifrování doplním padding. Pak se ale postupuje stejně.
Sémanticky samozřejmě podepisování není šifrování ani dešifrování.
Při šifrování a dešifrování platí, že dešifrování musí být inverzní operace k šifrování. Od šifrování také obvykle chceme, aby výstup byl (až na případné zarovnání) stejně dlouhý, jako vstup, aby tedy jakákoli náhodná data byla potenciálním výstupem šifrování. Z toho plyne, že i šifrování musí být inverzní operací k dešifrování. U asymetrických šifer tedy platí, že když na vstupu provedete transformaci s pomocí privátního i veřejného klíče, přičemž nezáleží na pořadí (protože obě transformace jsou navzájem inverzní), dostanete opět vstup.
Vy za šifrování označujete vždy transformaci veřejným klíčem a za dešifrování vždy transformaci soukromým klíčem (proto vám pak podepisování vychází jako dešifrování). Obvyklejší je myslím označovat to podle pořadí operací, tj. první operaci označovat za šifrování a druhou za dešifrování. Už pro to, že tohle označení bude fungovat i pro případy, kdy šifrování nepokryje celý možný obor hodnot – kdybyste v takovém případě začínal dešifrováním, může se vám stát, že narazíte na vstup, kro který není dešifrování definováno. Třeba kdybyste šifrování definoval jako zdvojení každého písmena a dešifrování jako sloučení dvou stejných písmen na liché a následující sudé pozici (takže„A“ by se zašifrovalo jako „AA“), není pro vstup „AB“ dešifrování definováno.
Chápu vaši nechuť označovat za výsledek šifrování něco, co je veřejné, nicméně u podpisu jsou veřejné oba texty – jak vstupní text, tak výsledek transformace.
Bezpečnost je daná tím, že soukromý klíč nikdy nesmí být zveřejněn, teprve z toho je odvozené, kterou transformaci kdo může použít a z toho plyne pořadí těch transformací.
Šifrování a ověření podpisu hashe jsou matematicky vždy totožné operace, stejně jako dešifrování a vytvoření podpisu z hashe. To vyplňování při šifrování není striktně vzato součástí šifrování, je to příprava vstupu pro šifrování. A hashování vstupního dokumentu není součástí podepisování, podepisuje se vždy hash dokumentu, a podepisující někdy ani vstupní dokument nezná, zná jenom hash – např. při vystavování časových razítek (což, pravda, není jen podpis hashe, ale podpis hashe plus časové značky).
Šífrování je u mě operace, která útočníkovi prakticky nedovolí dostat se k původnímu obsahu. To bývá i účel šifrování. Naopak dešifrování je operace, kterou může provést pouze vyvolený, což rozhodně není vlastník veřejného klíče.
Přeneseně tak můzeme nazývat operace, které sice slouží k něčemu jinému (zde podpisy a jejich ověřování), ale matematicky tomu odpovídají.
> Vy za šifrování označujete vždy transformaci veřejným klíčem a za dešifrování vždy transformaci soukromým klíčem (proto vám pak podepisování vychází jako dešifrování).
Ve výsledku ano, z důvodu, který jsem uvedl výše.
> Obvyklejší je myslím označovat to podle pořadí operací, tj. první operaci označovat za šifrování a druhou za dešifrování.
Jenže pak to neodpovídá ani sémanticky (to ani u mě – podpis nemá sémanticky nic společného se (de)šifrováním) ani matematicky. Je to prostě operace prováděná jako první a operace prováděná jako druhá. Podobnou zkratku, jakou jsem tu kritizoval na Rootu, bych pochopil třeba na iDnes, kde je jiná skupina čtenářů i redaktorů.
> tohle označení bude fungovat i pro případy, kdy šifrování nepokryje celý možný obor hodnot
To vím. Však jsem úmyslně zmiňoval RSA, kde se to takto používá, a nepsal to obecně.
> Bezpečnost je daná tím, že soukromý klíč nikdy nesmí být zveřejněn, teprve z toho je odvozené, kterou transformaci kdo může použít a z toho plyne pořadí těch transformací.
Ano. Ale nemohu si vždy libovolně vybrat, který klíč bude soukromý a který veřejný. Odvodit veřejný klíč ze soukromého jít může, naopak ne. Provádět oba směry transformace soukromým klíčem jít může, veřejným ne.
> To vyplňování při šifrování není striktně vzato součástí šifrování, je to příprava vstupu pro šifrování. A hashování vstupního dokumentu není součástí podepisování, podepisuje se vždy hash dokumentu, a podepisující někdy ani vstupní dokument nezná, zná jenom hash
Jak se to vezme – záleží, jak moc highlevel/lowlevel pohled chceme. Pokud například chceme mít podepisovací schéma, které není náchylné na malleability, s čistým RSA si nevystačíme. Stejně tak u šifrování. Zmínkou o paddingu jsem chtěl vyhovět i těm, kteří mají více high-level pohled a mohli by namítnout, že to přece není úplně totožná operace – padding/hash tam potřebujeme nejen kvůli délce zprávy, ale i kvůli bezpečnosti, nelze to tedy vynechat. Ostatně tu námitku vznáší i autor článku, který jsem odkázal.
Ale jinak asi je fakt, že RSA by mělo odkazovat na čisté (samostatně nepoužitelné) primitivum RSA, zatímco pro šifrování budeme mluvit o RSA-OAEP, pro podepisování budeme mluvit o RSA-SHA256 apod. Problém je, že se často uvádí pouze RSA (popř. AES), i když jde o jeden z mnoha dílků skládačky.
Pokud šifrování používáte pro operaci, která znemožní útočníkovi dostat se k původnímu obsahu, pak nemůžete pojem „šifrování“ vůbec používat v kontextu elektronického podpisu – protože tam jsou z principu oba dva bloky dat veřejné, jak hash dokumentu tak jeho transformovaná podoba.
Vaše pojmenování transformace soukromým klíčem jako „šifrování“ sice má svou logiku, ale neodpovídá to tomu, jak se ta slova běžně používají. Běžný význam slov je ten, který jsem popsal – první transformace je vždy šifrování, druhá dešifrování. Když se někde píše o elektronickém podpisu a používá se pojem „šifrování“, většinou se píše o tom, že hash dokumentu jeho autor zašifruje privátním klíčem, při ověření podpisu se pak podpis dešifruje klíčem veřejným. I když je pravda, že třeba česká Wikipedie u popisu algoritmu RSA pro podpis píše jakoby „dešifrování“, takže tam je použitá vaše terminologie, ale aspoň je to zdůrazněné tím „jakoby“ a uvozovkami. Ale je to jediný případ, který jsem našel, jinak se v publicistických textech používá pro podpis „šifrování soukromým klíčem“, v odborných textech se to spíš popisuje přímo matematickými operacemi.
Jaké termíny použijete samozřejmě záleží na vás, ale když je bez upozornění použijete opačně, než jak je většinou zvykem, je to matoucí.
> protože tam jsou z principu oba dva bloky dat veřejné, jak hash dokumentu tak jeho transformovaná podoba
Znamená to, že když zašifruju veřejně známý text, a útočník se nějak dozví, že to je zrovna ten text, tak už nejde o šifrování? Ne. Pouze útočník má apriorní znalost a z ciphertextu se nedozvěděl o plaintextu nic, co by nevěděl už předtím. Ano, mohl jsem to tak rozepsat už předtím, ale příspěvek by byl s tímto přístupem dvakrát tak dlouhý: Útočník se z ciphertextu dozví maximálně délku plaintextu a všechno, co lze vyvodit z délky plaintextu v kombinaci s jeho apriorními znalostmi.* Byl by tak ale můj komentář srozumitelnější?
> neodpovídá to tomu, jak se ta slova běžně používají
Co mám považovat za běžné používání? Pokud spíše laickou veřejnost, kde na iDnesu označují SHA-1 za „šifru“ (byť v uvozovkách), tak tam to ještě chápu. Ale něco na základě takového textu pochopit mi pak přijde dost obtížné. Pokud ale jsme na odborném serveru, dá se čekat, že čtenáři takového článku budou vědět, že kryptografie není jen o šifrování. A tedy se budou věci nazývat pravými jmény, tedy místo „Zašifrujete otisk a získáte elektronický podpis konkrétního dokumentu.“ spíše něco jako „Do podepisování typicky vstupuje z praktických důvodů pouze otisk, takže dva dokumenty se stejným otiskem budou mít stejný podpis.“.
Zmínka o tom, že v RSA jde de facto o dešifrování, měla jen ilustrovat, jak je zmínka o šifrování nepřesná.
Co so vzpomínám na předmět Applied cryptography na MU FI, na první přednášce k terminologii bylo „Nešifrujeme soukromým klíčem“. Tehdy jsem si říkal, proč to vlastně zmiňuje.
*) Praktická ukázka: pokud útočník předem ví, že zpráva je buď „ano“, nebo „ne“, může z délky zprávy odvodit i celou původní zprávu.
V případě podepisování to ale není „útočník se nějak dozví“. Podepisování je založené na tom, že ověřovatel podpisu zná hash dokumentu. Takže tam se ta transformace neprovádí pro to, aby se něco skrylo před útočníkem. Ostatně při použití symetrické šifry zastává šifrování obě funkce – jak zabránit útočníkovi dozvědět se text zprávy, tak to zároveň pro příjemce ověřuje autenticitu zprávy, protože nikdo jiný než vlastník klíče nemohl zprávu správně zašifrovat.
V souvislosti s elektronickým podpisem se spojení „zašifrovat hash privátním klíčem“ běžně používá. Je to tedy rozhodně správnější vyjádření, než „rozšifrovat hash privátním klíčem“.
> Takže tam se ta transformace neprovádí pro to, aby se něco skrylo před útočníkem.
Ano, a navíc tento druh transformace to ani není schopen zajistit, proto tomu neříkám šifrování
> Ostatně při použití symetrické šifry zastává šifrování obě funkce – jak zabránit útočníkovi dozvědět se text zprávy, tak to zároveň pro příjemce ověřuje autenticitu zprávy, protože nikdo jiný než vlastník klíče nemohl zprávu správně zašifrovat.
To je (relativně rozšířený) omyl. Ano, útočník bez klíče nemohl zprávu zašifrovat, ale mohl zprávu pozměnit (vizte malleability). Proto se se symetrickými šiframi ještě používá MAC. Pripadně existují AEAD módy, ale to je v podstatě jen skrytý MAC.
> V souvislosti s elektronickým podpisem se spojení „zašifrovat hash privátním klíčem“ běžně používá.
Setkal jsem se s tím poprvé asi včera. A nemám pocit, že bych se kryptografií nezabýval.
> Je to tedy rozhodně správnější vyjádření, než „rozšifrovat hash privátním klíčem“.
Neodpovídá to ani sémantice ani matematické operaci. Nesedí to typově. Narozdíl od rozšifrování hashe.
Pokud nejde o matematické detaily, mluvme o podepisování a ověřování podpisu, ne o šifrování/dešifrování.
A pokud nám jde o tyto detaily, tak podepisování pomocí RSA v podstatě odpovídá dešifrování.
Záleží, co chci říct:
Pokud chci ukázat důvod, proč to provádím, pak je špatně psát o šifrování/dešifrování. Proto dávám přednost se slovům šifrovat/dešifrovat úplně vyhnout v takovém případě.
Pokud chci popsat, čemu to odpovídá matematicky, nevidím v tom problém.
P.S.: původně ta zmínka o dešifrování měla být jen tak na okraj. Hlavní sdělení mělo být, že nejde o šifrování. Možná jsem to měl jinak formulovat…
Já jsem se také doposud setkal s pojmem "šifrování" ve smyslu udělat ze známeho textu text nový, odvozený matematickou operací. Tedy první operace, ať už je dělaná soukromým, nebo veřejným klíčem. Dešifrování je pak získání původního textu, tedy operace druhá v pořadí.
Zmatení vzniká až díky tomu, že k "zašifrování" hashe pro podpis se používá stejná operace jako při "dešifrování" zprávy při normálním šifrování.
Dešifrovat pomocí veřejného klíče – tedy že si to bude moci přečíst kdokoli, kdo zná *veřejný* klíč? K čemu by to pak bylo?
To rozšifrování není 100% přesné, ale když si odmyslíme padding, je to vpodstatě ta stejná operace: https://www.cs.cornell.edu/courses/cs5430/2015sp/notes/rsa_sign_vs_dec.php (Podstatný je obsah, nejen titulek. )