secp256k1

https://en.bitcoin.it/wiki/Secp256k1


p = 115792089237316195423570985008687907852837564279074904382605163141518161494337

je prvočíslo. ✔️

Používá se jako modul v eliptické křivce secp256k1,
která je definována právě nad konečným tělesem 𝔽ₚ, a proto musí být p prvočíslo, aby vzniklo těleso (ne jen okruh).

Toto p má speciální tvar:p=2256−232−977p = 2^{256} – 2^{32} – 977p=2256−232−977

Tento tvar je zvolen kvůli rychlé aritmetice modulo p (efektivní redukce). ⚙️

Modulus používaný v secp256k1

má tvarp=2256−232−977p = 2^{256} – 2^{32} – 977p=2256−232−977

To umožňuje rychlou redukci modulo p, protože každé číslo větší než 22562^{256}2256 lze přepsat pomocí identity

2256≡232+977(modp)2^{256} \equiv 2^{32} + 977 \pmod{p}2256≡232+977(modp)

To plyne přímo z definice p:p=2256−232−977=0(modp)p = 2^{256} – 2^{32} – 977 = 0 \pmod{p}p=2256−232−977=0(modp)

tedy2256=232+977(modp)2^{256} = 2^{32} + 977 \pmod{p}2256=232+977(modp)


Jak se používá při redukci

Mějme číslo větší než 256 bitů, např.x=a⋅2256+bx = a \cdot 2^{256} + bx=a⋅2256+b

pak modulo p:x≡a(232+977)+bx \equiv a(2^{32}+977) + bx≡a(232+977)+b

tedy x ≡ a ⋅ 232 + 977 a + b

→ místo dělení modulo p stačí

sčítání

posun o 32 bitů

pár násobení