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 ∈ n. 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:
- Křivka nad konečným tělesem s charakteristikou tělesa p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f (tj. také 2256 − 232 − 977)
- Rovnice křivky: y2 = x3 + 7
- Generátor cyklické grupy bod A má souřadnice:
- Ax = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
- Ay = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
- Řád grupy n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
- Kofaktor h = 1
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.