officinebitcoin.it

This project is maintained by valerio-vaccaro

Firma digitale in Bitcoin (ECDSA)

Introduzion

Le firme digitali xe na componente fondamentale de Bitcoin che permet de provar l’autenticità de le transazioni e l’identità del mittente. In questa lezion esploreremo come funziona ECDSA (Elliptic Curve Digital Signature Algorithm) in Bitcoin.

Concetto de firma digitale

Differenza da le firme fisiche

Proprietà

Criptografia a chiave pubblica

Chiave privata

Chiave pubblica

Funzionamento

Messagio + Chiave Privata → Firma
Messagio + Firma + Chiave Pubblica → Verifica

ECDSA in Bitcoin

Curva ellittica

Generazion de le chiavi

import hashlib
import secrets

# Genera chiave privata casuale
private_key = secrets.randbelow(2**256)

# Calcola chiave pubblica
# (semplificato - in realtà usa moltiplicazion de punto)
public_key = private_key * G  # G xe il punto generatore

Firma

def sign_message(message, private_key):
    # Hash del messagio
    message_hash = hashlib.sha256(message.encode()).digest()
    
    # Genera k casuale
    k = secrets.randbelow(2**256)
    
    # Calcola R = k * G
    R = k * G
    
    # Calcola S = k⁻¹ * (hash + private_key * R_x) mod n
    S = (pow(k, -1, n) * (int.from_bytes(message_hash, 'big') + private_key * R[0])) % n
    
    return (R[0], S)

Verifica

def verify_signature(message, signature, public_key):
    R, S = signature
    message_hash = hashlib.sha256(message.encode()).digest()
    
    # Calcola w = S⁻¹ mod n
    w = pow(S, -1, n)
    
    # Calcola u1 = hash * w mod n
    u1 = (int.from_bytes(message_hash, 'big') * w) % n
    
    # Calcola u2 = R * w mod n
    u2 = (R * w) % n
    
    # Calcola P = u1 * G + u2 * public_key
    P = u1 * G + u2 * public_key
    
    # Verifica che P_x = R
    return P[0] == R

SIGHASH flags

SIGHASH_ALL (default)

SIGHASH_NONE

SIGHASH_SINGLE

ANYONECANPAY

Firma de messagi arbitrari

Bitcoin Message Signing

def sign_bitcoin_message(message, private_key):
    # Formato Bitcoin
    bitcoin_message = f"\x18Bitcoin Signed Message:\n{len(message)}"
    bitcoin_message += message
    
    # Hash doppio
    hash1 = hashlib.sha256(bitcoin_message.encode()).digest()
    hash2 = hashlib.sha256(hash1).digest()
    
    # Firma
    return sign_message(hash2, private_key)

Verifica

def verify_bitcoin_message(message, signature, public_key):
    # Stesso processo de firma
    bitcoin_message = f"\x18Bitcoin Signed Message:\n{len(message)}"
    bitcoin_message += message
    
    hash1 = hashlib.sha256(bitcoin_message.encode()).digest()
    hash2 = hashlib.sha256(hash1).digest()
    
    return verify_signature(hash2, signature, public_key)

Sicurezza

Attacchi comuni

Best practices

Applicazioni in Bitcoin

Transazioni

Messagi

Smart contracts

Conclusione

Le firme digitali ECDSA xe na componente critica de Bitcoin che garantisce sicurezza e autenticità. La comprension de come funzionano xe essenziale par sviluppatori e utenti avanzati.