⚠️
NOTA EDUCATIVA: Questa pagina illustra la crittografia a curva ellittica in modo interattivo. Le chiavi generate negli step 6–7 sono a soli fini dimostrativi β€” non usarle per bitcoin reali. Nessun dato viene trasmesso a server esterni. Tutto gira nel tuo browser.
← Home
1
2
3
4
5
6
7
8
// matematica Β· crittografia Β· secp256k1 Β· ECDSA

La matematica dietro
ogni chiave Bitcoin

Esplora passo dopo passo la crittografia a curva ellittica: dalla geometria delle curve reali fino alla firma digitale ECDSA che protegge ogni transazione Bitcoin.

// step 01 / 08
La Curva Ellittica
La forma geometrica alla base di Bitcoin β€” yΒ² = xΒ³ + 7
// teoria
Cos'Γ¨ una curva ellittica?

Una curva ellittica Γ¨ definita dall'equazione generale:

Forma generale di Weierstrass
yΒ² = xΒ³ + ax + b

Bitcoin usa la curva chiamata secp256k1, dove a=0 e b=7:

secp256k1 β€” usata da Bitcoin
yΒ² = xΒ³ + 7

La curva Γ¨ simmetrica rispetto all'asse x: per ogni punto (x, y) sulla curva, esiste il suo simmetrico (x, βˆ’y). Questo significa che ogni valore di x positivo corrisponde a due punti: uno con y positivo e uno con y negativo.

Un punto sulla curva Γ¨ qualunque coppia (x, y) che soddisfa l'equazione. Nella crittografia Bitcoin, i punti vengono calcolati su un campo finito (modulo un numero primo enorme), ma la geometria di base rimane la stessa.

PerchΓ© questa curva? La forma yΒ² = xΒ³ + 7 Γ¨ scelta perchΓ© ha proprietΓ  matematiche che rendono le operazioni su di essa computazionalmente sicure. I parametri di secp256k1 sono stati scelti in modo trasparente e verificabile, senza "backdoor".
Curva y² = x³ + 7 su ℝ — clicca due punti per vedere P+Q
Clicca un punto della curva per selezionare P...
Come funziona: Clicca un punto sulla curva per selezionare P (azzurro), poi un secondo per Q (verde). Viene disegnata la retta P–Q con R = P+Q (oro).
// step 02 / 08
Addizione di Punti P + Q
La regola geometrica che dΓ  struttura di gruppo alla curva
// geometria
La regola della corda e della tangente

Per sommare due punti P e Q su una curva ellittica, si usa la regola della corda:

  1. Traccia la retta che passa per P e Q
  2. Trova il terzo punto di intersezione βˆ’R con la curva
  3. Rifletti βˆ’R rispetto all'asse x β†’ ottieni R = P + Q

Il risultato Γ¨ sempre sulla curva: questa Γ¨ la proprietΓ  magica che rende l'addizione ellittica un'operazione di gruppo chiusa.

Formule per P + Q (caso generico)
Ξ» = (yβ‚‚ βˆ’ y₁) / (xβ‚‚ βˆ’ x₁)
x₃ = λ² βˆ’ x₁ βˆ’ xβ‚‚
y₃ = Ξ»(x₁ βˆ’ x₃) βˆ’ y₁

Il caso speciale P = Q (raddoppio) usa la tangente alla curva nel punto P:

Raddoppio: 2P (tangente in P)
Ξ» = (3x₁² + a) / (2y₁) ← per secp256k1: a=0
x₃ = λ² βˆ’ 2x₁
y₃ = Ξ»(x₁ βˆ’ x₃) βˆ’ y₁
Caso tangente (2P): Quando P = Q, la retta diventa la tangente in P. La pendenza si calcola con la derivata: λ = 3x²/(2y) — per secp256k1 (a=0) questo semplifica il calcolo del raddoppio.
Perché la riflessione? La retta interseca sempre la curva in esattamente 3 punti (contati con molteplicità). Il terzo punto viene riflesso per garantire che l'operazione sia un omomorfismo di gruppo — ovvero che rispetti le proprietà associativa e commutativa.
P = (βˆ’1, √6) Β· Q = (1, √8) β€” premi il bottone per animare
Risultato
β€”
// step 03 / 08
Il Campo Finito Fp
yΒ² ≑ xΒ³ + 7 (mod p) β€” dalla geometria continua alla griglia discreta
// algebra modulare
PerchΓ© usare i numeri interi?

La curva reale usa numeri in virgola mobile con precisione infinita β€” impraticabile per un computer. Invece, Bitcoin lavora su un campo finito: tutti i calcoli sono fatti modulo un numero primo enorme p.

L'equazione diventa:

Curva su F_p (p primo)
yΒ² ≑ xΒ³ + 7 (mod p)
dove x, y ∈ {0, 1, 2, ..., pβˆ’1}

I punti non formano piΓΉ una curva liscia, ma un insieme discreto di punti interi su una griglia p Γ— p. La struttura di gruppo Γ¨ tuttavia preservata: l'addizione di punti funziona esattamente come prima, ma con aritmetica modulare.

Nell'esempio interattivo a destra usiamo p = 23 (piccolo per visualizzare). In Bitcoin, p Γ¨ un numero a 256 bit.

Numero di punti su F_23
Trovati: ? punti
+ il "punto all'infinito" (elemento neutro)
La sicurezza viene da qui: su un campo finito con p β‰ˆ 2²⁡⁢, esistono circa 2²⁡⁢ punti. Trovare k dato kΓ—G Γ¨ computazionalmente impossibile β€” ci vorrebbero piΓΉ anni dell'etΓ  dell'universo anche con tutti i computer esistenti.
Clicca un punto (arancione) per selezionare P, poi Q — calcola P+Q
Istruzioni
Clicca un punto della curva per selezionare P, poi un secondo per Q.
Tutti i punti su F₂₃:
Calcolo...
// step 04 / 08
Moltiplicazione Scalare kΓ—G
Il cuore della crittografia β€” "saltare" su una griglia in modo imprevedibile
// algoritmo
Come si moltiplica un punto per uno scalare?

kΓ—G significa aggiungere il punto G a se stesso k volte: G + G + G + … (k volte). Con k = 2²⁡⁢ questo sarebbe impossibile direttamente, ma si usa l'algoritmo double-and-add:

Double-and-Add (pseudocodice)
R = ∞ (punto neutro)
per ogni bit di k (dal meno significativo):
  se bit = 1: R = R + G
  G = G + G (raddoppia)
ritorna R

Con soli logβ‚‚(k) operazioni si ottiene il risultato. Per k a 256 bit: massimo 512 operazioni.

La cosa affascinante Γ¨ che kΓ—G sembra saltare casualmente sulla griglia quando k cresce di 1. Non c'Γ¨ nessuna relazione visibile tra k e la posizione di kΓ—G β€” questo Γ¨ il nucleo matematico della sicurezza Bitcoin.

Il Problema del Logaritmo Discreto (ECDLP): Dato Q = kΓ—G, trovare k Γ¨ computazionalmente impossibile. Eppure calcolare kΓ—G dato k Γ¨ facile. Questa asimmetria Γ¨ ciΓ² che rende sicure le chiavi Bitcoin.
k corrente
1
kΓ—G β€” coordinate
β€”
yΒ² ≑ xΒ³ + 7 (mod 97) β€” trascina il cursore
Guarda come i punti appaiono: non c'è nessun pattern visivo. Ogni passo k×G salta in una posizione completamente diversa sulla griglia.
G k×G corrente Precedenti
// step 05 / 08
secp256k1: I Parametri Reali
I valori fissati pubblicamente che definiscono il sistema crittografico di Bitcoin
// standard
Parametri pubblici fissi

In Bitcoin, tutti usano esattamente gli stessi parametri per la curva ellittica. Questi valori sono definiti nello standard secp256k1 e sono completamente pubblici. La sicurezza non dipende dalla segretezza di questi parametri, ma dall'impossibilitΓ  matematica di invertire la moltiplicazione scalare.

Il Punto Generatore G Γ¨ un punto speciale fisso sulla curva. Tutti i wallet Bitcoin del mondo derivano le loro chiavi moltiplicando G per una chiave privata diversa.

PerchΓ© "k1" nel nome? "sec" = Standards for Efficient Cryptography. "p" = campo primo. "256" = 256 bit. "k1" = tipo Koblitz, variante 1. Koblitz curves hanno la proprietΓ  di ammettere algoritmi di calcolo particolarmente efficienti.
~2²⁡⁢ punti β€” piΓΉ del numero stimato di atomi nell'universo osservabile (~10⁸⁰). Anche con tutti i computer del pianeta, cercare esaustivamente k sarebbe impossibile.
Chiave Privata
k
Γ—
Generatore
G
=
Chiave Pubblica
Q
β†’ Facile: calcola Q dato k (double-and-add, ~512 operazioni)
← Impossibile: trova k dato Q (ECDLP β€” problema su curva ellittica)
p β€” il primo campo (256 bit)
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
a β€” coefficiente quadratico
0x00  (curva semplificata: yΒ² = xΒ³ + b)
b β€” coefficiente costante
0x07
Gx β€” coordinata X del Punto Generatore
79BE667E F9DCBBAC 55A06295 CE870B07
029BFCDB 2DCE28D9 59F2815B 16F81798
Gy β€” coordinata Y del Punto Generatore
483ADA77 26A3C465 5DA4FBFC 0E1108A8
FD17B448 A6855419 9C47D08F FB10D4B8
n β€” ordine del gruppo (numero di punti)
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE
BAAEDCE6 AF48A03B BFD25E8C D0364141
// step 06 / 08
Chiave Privata β†’ Chiave Pubblica
Q = kΓ—G β€” la funzione a senso unico che protegge i tuoi bitcoin
// derivazione
Da un numero segreto a una chiave pubblica

La chiave privata k Γ¨ un numero casuale a 256 bit. Deve rimanere segreto β€” chi lo conosce controlla i bitcoin associati.

La chiave pubblica Q = kΓ—G Γ¨ il risultato della moltiplicazione scalare del Punto Generatore G per k. È completamente sicuro condividere Q pubblicamente β€” da Q Γ¨ impossibile ricavare k.

La chiave pubblica viene poi compressa: si conserva solo la coordinata X piΓΉ un prefisso (02 se Y Γ¨ pari, 03 se Y Γ¨ dispari) β€” questo funziona perchΓ© dalla x si puΓ² sempre ricostruire la y (±√(xΒ³+7 mod p)).

Chiave pubblica compressa
Se Y pari:  02 + X (33 byte totali)
Se Y dispari: 03 + X (33 byte totali)
Non compressa: 04 + X + Y (65 byte)
Algoritmo Double-and-Add su secp256k1: il calcolo usa BigInt JavaScript e le stesse costanti di secp256k1. Ci vogliono alcuni secondi perchΓ© la moltiplicazione su un campo a 256 bit richiede molte operazioni modulo un numero enorme.
Chiave Privata (64 caratteri hex)
Coordinata X (Qx)
β€”
Coordinata Y (Qy)
β€”
Chiave Pubblica Compressa (33 byte)
β€”
Prefisso
β€”
// step 07 / 08
ECDSA: Firma e Verifica
La prova matematica che possiedi una chiave privata β€” senza rivelarla
// crittografia
Cos'Γ¨ una firma digitale ECDSA?

Con ECDSA (Elliptic Curve Digital Signature Algorithm) puoi firmare un messaggio con la tua chiave privata k. Chiunque abbia la tua chiave pubblica Q puΓ² verificare che la firma sia tua β€” senza che tu abbia rivelato k.

In Bitcoin, ogni transazione contiene una firma ECDSA che prova che il proprietario della chiave privata ha autorizzato il trasferimento.

Firma (sign)
z = SHA256(messaggio)
k_nonce = random()
R = k_nonce Γ— G
r = R.x mod n
s = k_nonce⁻¹ Γ— (z + rΒ·privKey) mod n
firma = (r, s)
Verifica (verify)
w = s⁻¹ mod n
u1 = zΒ·w mod n
u2 = rΒ·w mod n
P = u1Γ—G + u2Γ—Q
valida se P.x ≑ r (mod n)
Il nonce k_nonce Γ¨ critico: deve essere sempre un nuovo numero casuale per ogni firma. Se si riusa lo stesso nonce due volte, la chiave privata puΓ² essere estratta matematicamente dalle due firme. Questo Γ¨ esattamente ciΓ² che accadde alla PlayStation 3.
Coppia di chiavi generata automaticamente
privKey: β€”
pubKey:  β€”
Messaggio da firmare
⚠ Attacco PS3 (2010) — Nonce Riutilizzato
⚠ Cosa succede se il nonce k viene riutilizzato

Nel 2010, Sony PS3 usava lo stesso nonce k per tutte le firme ECDSA del firmware. Questo permise di estrarre matematicamente la chiave privata di Sony. Non era un bug nel codice — era una violazione fondamentale di ECDSA.

Dimostrazione: due messaggi firmati con lo stesso k rivelano la chiave privata.

// step 08 / 08
Schnorr e Taproot: Bitcoin dopo 2021
BIP340/341 — firme lineari, MuSig e indirizzi bc1p...
// sezione A
Schnorr: la firma lineare

Da novembre 2021 (attivazione di Taproot, BIP341), Bitcoin supporta le firme Schnorr (BIP340). Tutti i nuovi indirizzi P2TR (bc1p...) usano Schnorr invece di ECDSA.

La differenza fondamentale: s = k + e·priv — un'equazione lineare. Questo sblocca la aggregazione di firme e chiavi (MuSig).

ECDSA vs Schnorr
ECDSA
R = k×G, z = hash(msg)
s = k⁻¹(z + r·priv) mod n
Firma = (r, s) — 72 byte DER

Verifica: R' = s⁻¹·(z·G + r·Q)
valida se R'.x ≡ r
Schnorr (BIP340)
R = k×G, e = hash(R.x‖P.x‖msg)
s = k + e·priv mod n
Firma = (R.x, s) — 64 byte fissi

Verifica: R' = s×G - e×P
valida se R'.x == R.x
MuSig: multisig invisibile
MuSig semplificato
P₁ = priv₁×G   P₂ = priv₂×G
P_agg = P₁ + P₂
s₁ = k₁ + e·priv₁   s₂ = k₂ + e·priv₂
s_agg = s₁ + s₂ — 64 byte, identica a single-sig
Taproot e bc1p

Taproot (BIP341) usa una chiave x-only (32 byte) e un TapTweak: Q = P + t×G dove t = hash_TapTweak(P.x). Gli indirizzi usano Bech32m (costante 0x2bc830a3) e iniziano con bc1p.

Chiave privata (hex 64)
Messaggio da firmare
Demo semplificata: due partecipanti firmano insieme. La firma aggregata e' indistinguibile da single-sig on-chain.
Genera un indirizzo Taproot (bc1p...) via BIP341: x-only key + TapTweak + Bech32m.
Chiave privata (hex 64)
✓ Tour completato: secp256k1 + Schnorr + Taproot!

La conoscenza
dovrebbe essere libera

Bitcoin Report School Γ¨ un progetto open source completamente gratuito. Nessuna pubblicitΓ , nessun tracker, nessun paywall. Se questi strumenti ti sono stati utili, considera una donazione in bitcoin.

Manifesto: La crittografia che protegge i tuoi bitcoin Γ¨ matematica pubblica, accessibile a tutti. Capire come funziona non Γ¨ solo istruttivo β€” Γ¨ un atto di sovranitΓ  digitale. Verifica, non fidarti.
7 Strumenti
100% Open Source
0 Tracker
Bitcoin QR Donazione
⚑ Powered by BTCPay Server β€” self-hosted