Vlákno názorů k článku SHA-1 není bezpečná, Google ukázal kolizi od Vít Šesták - „Bezpečnost závisí na tom, že není možné najít...

  • Článek je starý, nové názory již nelze přidávat.
  • 24. 2. 2017 20:50

    Vít Šesták

    „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.

  • 24. 2. 2017 21:57

    lojzak (neregistrovaný)

    "Ehm… zašifrujete? Opravdu? V případě RSA to funguje přesně naopak, podepisuju rozšifrováním hashe."

    Zdroj?

    Pokud vím, tak RSA umožňuje šifrování i dešifrování jak s VK tak s PK.

  • 24. 2. 2017 22:11

    Filip Jirsák
    Stříbrný podporovatel

    Proč si to sám nepřečtete aspoň na Wikipedii? Při podepisování se podepisují hashe, protože šifrování/deši­frová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ží.

  • 24. 2. 2017 22:35

    lojzak (neregistrovaný)

    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.

  • 24. 2. 2017 22:35

    Filip Jirsák
    Stříbrný podporovatel

    Aha, vám šlo to to spojení podepisuju–rozšifrováním. Ano, to je opravdu divná představa, že bych začal s šifrovaným vstupem, ten bych následně dešifroval a po té jej zase zašifroval. Postup nejprve šifrovat a pak dešifrovat je tradičnější :-)

  • 24. 2. 2017 23:14

    Vít Šesták

    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í.

  • 25. 2. 2017 9:10

    Filip Jirsák
    Stříbrný podporovatel

    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).

  • 25. 2. 2017 11:14

    Vít Šesták

    Ší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.

  • 25. 2. 2017 12:23

    Filip Jirsák
    Stříbrný podporovatel

    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í.

  • 25. 2. 2017 13:09

    Vít Šesták

    > 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.

  • 25. 2. 2017 13:39

    Filip Jirsák
    Stříbrný podporovatel

    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“.

  • 25. 2. 2017 14:18

    Vít Šesták

    > 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ši­frování.

    A pokud nám jde o tyto detaily, tak podepisování pomocí RSA v podstatě odpovídá dešifrování.

  • 25. 2. 2017 15:49

    Filip Jirsák
    Stříbrný podporovatel

    Ta transformace se ale neprovádí ani proto, abych odkryl něco, co bylo skryté, takže pak je špatně i nazývat to dešifrování.

  • 25. 2. 2017 16:04

    Vít Šesták

    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ši­frová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…

  • 25. 2. 2017 16:57

    ebik

    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í.

  • 24. 2. 2017 22:13

    Vít Šesták

    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. )

  • 24. 2. 2017 22:18

    Filip Jirsák
    Stříbrný podporovatel

    Dešifrování veřejným klíčem se používá tam, kdy je potřeba (komukoli) dokázat, že jsem vlastníkem privátního klíče. Tedy např. právě u toho podpisu. Veřejným klíčem dešifruju hash zprávy, a pokud bude shodný s mnou vypočítaným hashem, mám jistotu, že hash zašifroval vlastník privátního klíče.

  • 24. 2. 2017 22:36

    lojzak (neregistrovaný)

    "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?"

    Tomu se, bobánku, říká elektronický/di­gitální podpis.