Calcolatore di Firma Digitale Crypto
Passo 1: Hash della transazione
Passo 2: Firma ECDSA
Passo 3: Codifica DER e Sighash
Quando parliamo di firma digitale in criptovalute è un metodo crittografico che permette di dimostrare la proprietà di un indirizzo e di autorizzare una transazione senza rivelare la chiave privata, stiamo parlando del cuore della sicurezza delle blockchain.
Punti chiave
- La firma digitale parte da un hash SHA‑256 della transazione.
- Le firme crypto usano ECDSA su curva secp256k1 (Bitcoin) o altre curve (Ethereum).
- Il processo prevede quattro passaggi: hash, firma, calcolo dei valori r e s, codifica DER + sighash.
- Usare librerie provate (libsecp256k1, BitcoinJS, Web3.py) evita errori di sicurezza.
- Confronta ECDSA con RSA e Schnorr per scegliere la soluzione più adatta.
Cos’è una firma digitale?
In pratica, una firma digitale è una prova matematica che collega in modo inalterabile il mittente a una transazione. Grazie alla crittografia a chiave pubblica, chi possiede la chiave privata può generare una firma, mentre chiunque abbia la chiave pubblica può verificarla. Non c’è bisogno di autorità centrale: la rete stessa conferma la validità della firma.
Passo 1: hash della transazione con SHA-256
Il primo passo è trasformare i dati grezzi della transazione (input, output, importi, timestamp) in una stringa di 256 bit. Si usa l’algoritmo SHA-256 perché è resistente alle collisioni (2^128 operazioni per una collisione) e produce sempre 64 caratteri esadecimali. Nei contesti Bitcoin, BIP‑143 richiede il doppio SHA‑256 (hash‑hash) per le transazioni SegWit.
Passo 2: firma con ECDSA su secp256k1
L’algoritmo più usato è l’ECDSA (Elliptic Curve Digital Signature Algorithm). Satoshi Nakamoto lo scelse per la sua efficienza: una chiave di 256 bit fornisce lo stesso livello di sicurezza di una RSA da 2048 bit, ma con firme molto più piccole. La curva secp256k1 è definita dall’equazione y² = x³ + 7 e ha un punto generatore G con coordinate molto grandi (vedi specifiche SEC 2).
Passo 3: calcolo dei componenti r e s
Una firma ECDSA è composta da due numeri interi a 256 bit: r e s. Il valore r è la coordinata x del punto k·G, dove k è un numero casuale generato in modo deterministico secondo RFC 6979. Il valore s si calcola con la formula:
s = k⁻¹ (hash + r·privateKey) mod n
dove n è l’ordine della curva (115792089237316195423570985008687907852837564279074904382605163141518161494337). La generazione corretta di k è cruciale: se k si ripete, un attaccante può ricavare la chiave privata, come dimostrato nel caso Sony PS3 del 2010.
Passo 4: codifica DER e aggiunta del sighash
Una volta ottenuti r e s, la firma va codificata in Distinguished Encoding Rules (DER). La struttura è:
30 | len | 02 | len(r) | r | 02 | len(s) | s
Alla fine si aggiunge un byte di sighash (di solito 0x01 per SIGHASH_ALL) che indica quali parti della transazione sono coperte dalla firma. Una firma completa in Bitcoin occupa circa 72 byte.
Confronto tra ECDSA, RSA e Schnorr
| Algoritmo | Dimensione chiave | Dimensione firma | Malleabilità | Supporto blockchain |
|---|---|---|---|---|
| ECDSA (secp256k1) | 256 bit | ~72 byte | Presente (mitigata da BIP‑62) | Bitcoin, Litecoin, molte altcoin |
| RSA‑2048 | 2048 bit | ~256 byte | No | Usato poco in crypto |
| Schnorr (BIP‑340) | 256 bit | ~64 byte | Assente | Bitcoin (Taproot), future implementazioni |
Come vedi, Schnorr combina la compattezza di ECDSA con l’assenza di malleabilità, ma è ancora in fase di adozione più ampia. RSA è poco pratico per blockchain a causa delle firme ingombranti.
Errori comuni e consigli pratici
Molti sviluppatori inciampano nei primi mesi. Ecco le trappole più frequenti:
- Random non deterministico: usare
SecureRandomdifettoso porta a chiavi rubate (Android 2013). - DER errato: 78 % dei bug su GitHub riguarda la codifica DER; controlla sempre lunghezze e tag.
- Hash sbagliato: Bitcoin richiede double‑SHA256; Ethereum usa Keccak‑256.
- Valore s non «low‑S»: BIP‑62 richiede s < n/2; altrimenti la transazione può essere modificata da terzi.
- Endianess: 32 % degli errori è dovuto a byte in ordine inverso.
La regola d’oro è: non scrivere la crittografia da zero. Usa librerie testate e segui le linee guida di Bitcoin Core.
Strumenti e librerie consigliate
Ecco le opzioni più diffuse per creare firme senza reinventare la ruota:
- libsecp256k1: la libreria C ufficiale di Bitcoin, usata da tutti i wallet principali.
- BitcoinJS (npm): wrapper JavaScript che gestisce hash, firma e DER in pochi comandi.
- Web3.py: per Ethereum, usa
eth_account.Account.signTransactionche segue ECDSA su secp256r1. - PyCryptodome: fornisce SHA‑256, generazione di nonce RFC 6979 e codifica DER.
Un esempio rapido con BitcoinJS:
const bitcoin = require('bitcoinjs-lib');
const keyPair = bitcoin.ECPair.makeRandom();
const psbt = new bitcoin.Psbt();
psbt.addInput({ txid: '…', index: 0, nonWitnessUtxo: Buffer.from('…', 'hex') });
psbt.addOutput({ address: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', value: 15000 });
psbt.signInput(0, keyPair);
psbt.finalizeAllInputs();
const txHex = psbt.extractTransaction().toHex();
In meno di 30 secondi hai una transazione firmata correttamente.
Prospettive future: firme post‑quantistiche
Il consenso tra gli esperti è chiaro: entro i prossimi 15‑20 anni i computer quantistici potrebbero rompere ECDSA. NIST sta standardizzando firme basate su reticoli (CRYSTALS‑DILITHIUM) e combinazioni ibride. Per ora, la strategia più sicura è mantenere backup offline delle chiavi private e monitorare gli aggiornamenti dei protocolli (es. Taproot, Schnorr, MuSig2).
Domande frequenti
Perché non posso usare RSA per le firme nelle criptovalute?
RSA richiede chiavi da 2048 bit per una sicurezza simile a ECDSA 256 bit, il che genera firme di circa 256 byte. Questo appesantisce le transazioni e aumenta i costi di rete, mentre le blockchain puntano a essere il più leggere possibile.
Come garantisco che il valore k sia davvero casuale?
Usa la generazione deterministica definita in RFC 6979. Le librerie moderne (libsecp256k1, BitcoinJS) implementano già questo metodo, così non devi preoccuparti di fonti di entropia difettose.
Che differenza c'è tra SIGHASH_ALL e SIGHASH_NONE?
SIGHASH_ALL (0x01) firma l’intera transazione, impedendo modifiche a inputs e outputs. SIGHASH_NONE (0x02) firma solo gli inputs, permettendo a chiunque di cambiare gli output - utile in contratti multidevice ma rischioso se usato impropriamente.
Qual è il vantaggio principale delle firme Schnorr rispetto a ECDSA?
Schnorr elimina la malleabilità, permette l’aggregazione di firme (MuSig) e riduce la dimensione della firma a 64 byte. Questo porta a transazioni più piccole e costi di rete inferiori, specialmente per multisig.
Devo preoccuparmi della compatibilità tra ECDSA su secp256k1 e Ethereum?
Ethereum usa di default la curva secp256r1 (noto anche come NIST P‑256), ma la maggior parte dei wallet supporta ancora secp256k1 per compatibilità con tool come MetaMask. Controlla la documentazione della tua libreria e scegli la curva indicata dal network specifico.
Con queste informazioni sei pronto a generare firme sicure, a verificare transazioni e a scegliere l’algoritmo più adatto al tuo progetto crypto. Buona programmazione!