Bitcoinový slovník naučný

Anatomie křivky

Jak je možné vidět na stránce anatomie transakce a skriptu, standardní p2(w)pk transakce uzamyká (prostřednictvím scriptPubKey) určitý obnos satoshi ve prospěch určitého hashe veřejného klíče (který zakódovaný v Bech32 či starší Base58Check představuje adresu). Prostřednictvím scriptSigu lze pak poskytnutím veřejného klíče a podpisu tento výstup odemknout a utratit v další transakci. To je umožněno díky tzv. asymetrické kryptografii, kterou v případě Bitcoinu představuje kryptografie eliptických křivek.

Asymetrická kryptografie se od té běžné – symetrické – liší tím, že na místo jednoho a toho samého klíče (použitého pro zašifrování i dešifrování) používá pár klíčů – veřejný a soukromý. Pokud si příjemce zprávy vygeneruje takový pár klíčů a ten veřejný publikuje, kdokoliv může tímto veřejným klíčem zašifrovat zprávu, kterou bude moci dešifrovat jen a pouze příjemce pomocí svého soukromého klíče. Asymetrická kryptografie však umožňuje, kromě šifrování za účelem skrytí tajné zprávy, také šifrování za účelem podpisu zprávy. Pokud původce zprávy tuto zprávu (v praxi stačí pouze její hash) zašifruje svým soukromým klíčem, každý může jeho publikovaným veřejným klíčem zprávu dešifrovat a tím ověřit, že původce zprávy je právě držitel soukromého klíče náležícímu k publikovanému veřejnému. Tomuto se říká kryptografický podpis a v Bitcoinu je jím prokazováno, že výstup je utrácen právě držitelem soukromého klíče přislušícího k veřejnému klíči, ve prospěch jehož hashe byl výstup uzamčen. (Že je výstup uzamčen ve prospěch nikoliv přímo veřejného klíče, nýbrž jeho hashe, je jen dalším stupněm ochrany.)

Asymetrická kryptografie eliptických křivek je založena na tzv. problému diskrétního logaritmu:

Nechť G = ⟨a⟩ je cyklická grupa řádu n s generátorem grupy a. Každý prvek b ∈ G lze zapsat jako b = ax pro jediné x ∈ Zn. Toto x se nazývá diskrétní logaritmus o základu a z prvku b v grupě G.

Přičemž v Bitcoinu je užita eliptická křivka popsaná standardem secp256k1:

Máme tedy eliptickou křivku nad konečným tělesem a zvolený bod na křivce, kterým si můžeme vygenerovat cyklickou grupu s operací sčítání bodů na křivce. Když jsme pro opakované sčítání bodu se sebou samým zavedli operaci násobení bodu skalárem, máme vše, co potřebuje pro využití problému diskrétního logaritmu. Z vřídla chaosu (nebo seedu) si vytáhneme přirozené číslo v intervalu ⟨1, n). To bude náš soukromý klíč. Provedeme násobení skalárem – soukromým klíčem vynásobíme generátor grupy; výsledkem bude bod na křivce – náš veřejný klíč. Přestože se operace naší aditivní grupy jmenuje součet bodů a opakovanému sčítání bodu sebou samým říkáme násobení skalárem, můžeme si tyto operace představit v multiplikativní notaci jako násobení a opakované násobení jako umocňování. Pak náš postup přesně zapadne do výše uvedené definice diskrétního logaritmu – prvkem b je veřejný klíč, zatímco x je klíč soukromý. Neexistuje polynomiální algoritmus, který by se znalostí veřejného klíče a generátoru grupy vypočítal soukromý klíč. Můžeme jít podepisovat.

secp256k1
Takto by vypadalo zobrazení bitcoinové eliptické křivky nad množinou reálných čísel.

Anatomie podpisu

Současným podpisovým schématem Bitcoinu je ECDSA. Připravíme si náš soukromý klíč (a označíme ho jako číslo d), náhodné číslo k z intervalu ⟨1, n) (číslo k musí být opravdu náhodné a různé pro každý podpis, jinak hrozí vyzrazení soukromého klíče) a nějakou zprávu, resp. její hash.

V Bitcoinu prokazujeme podpisem to, že jsme držiteli soukromého klíče náležícího k veřejnému klíči, ve prospěch jehož hashe jsou uzamknuty satoshi na výstupu předcházející transakce. Podepisovanou zprávou tedy bude dvojitý SHA256 hash jakéhosi předobrazu naší výsledné transakce. Výrobě tohoto předobrazu se věnuje bonusová část anatomie transakce. Výsledný hash si označíme jako číslo e.

Výpočet podpisu je pak již jednoduchý:

Dvojice čísel r, s je naším podpisem zprávy e. Zakódováním čísel r, s do formátu DER (Distinguished Encoding Rules) získáme podpisový element použitelný v sigScriptu.

K ověření si musíme opět sestavit předobraz podepisované transakce a vypočíst jeho dvojnásobný SHA256 hash, tj. číslo e, dále nám již stačí z scriptSigu získaný podpis (dvojice r, s) a veřejný klíč. Ten je v scriptSigu zakódován ve formátu SEC (Standards of Efficient Cryptography) zpravidla pouze jako x‐ová souřadnice a příznak sudosti – v takovém případě dopočítáme y‐ovou souřadnici.

Postup ověření je pak:

Pokud se x‐ová souřadnice vypočteného bodu X rovná číslu r, pak je dvojice r, s platným podpisem zprávy e.

Anatomie Schnorrova podpisu

Schnorrův podpis by v budoucnu mohl nahradit ECDSA schéma. Oproti němu má několik výhod, z nichž ta klíčová je možnost kombinovat více podpisů té samé zprávy do podpisu jednoho.

Při podepisování začneme stejně jako s ECDSA, připravíme si soukromý klíč d, náhodné číslo k a hash předobrazu transakce e. Oproti ECDSA budeme ovšem navíc potřebovat veřejný klíč:

Podpisem je tedy nikoliv dvojice čísel, ale dvojice bod R a číslo s. Tento podpis pak může být ověřen postupem:

Podpis je platný, pokud se body X a Y shodují.