Funzioni di hash e crittografia asimmetrica

21 Apr 2023

Indice

  1. Funzioni di hash
  2. Crittografia asimmetrica o "a chiave pubblica"
  3. Crittografia in Bitcoin

Funzioni di hash

Le funzioni di hash sono ampiamente usate in Bitcoin: per gli indirizzi, negli script e nel PoW (Proof Of Work).

Quando una transazione viene condivisa con il network, la funzione SHA-256 viene usata per crittografare i dati durante il trasferimento.

Le funzioni di hash vengono utilizzate anche nella blockchain per verificare l'integrità dei blocchi e per stabilire l'ordine cronologico di ogni singolo blocco.

Abbiamo imparato che Bitcoin usa SHA-256 come funzione di hash.
L'output di questa funzione è lunga 256 bits (32 bytes). *

* 1 byte = 8 bits

L'hash generato da SHA-256 è solitamente rappresentato da una stringa di 64 caratteri esadecimali, ciò significa che ogni byte è rappresentato da 2 caratteri esadecimali.

Prova tu a crittografare la parola "Bitcoin" con SHA256

Ricorda che i caratteri maiuscoli non generano lo stesso risultato dei minuscoli!

# SHA256 (sha256sum)

Bitcoin = b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4

bitcoin = 6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b



Crittografia asimmetrica

La crittografia asimmetrica, anche conosciuta come crittografia a chiave pubblica, viene usata per condividere le informazioni tramite una coppia di chiavi.

Vengono usate 2 chiavi:

  • Chiave Privata (Kpriv), che deve essere mantenuta segreta dal proprietario.
  • Chiave Pubblica (Kpub), che è visibile a tutti.

Quando si cripta un messaggio, il mittente cripta il messaggio M usando la chiave pubblica del destinatario per produrre il messaggio C.

Il destinatario decripterà il messaggio criptato C usando la propria chiave privata per vedere il messaggio originale M.

  • M è il messaggio non ancora criptato / decriptato, chiamato anche plaintext.
  • C è il messaggio criptato, chiamato anche ciphertext.
C = encypt(M, Kpub);
M = decrypt(C, Kpriv);

⚠️ È praticamente impossibile trovare la chiave privata partendo dalla pubblica. Un giorno potrebbe diventare possibile tramite l'utilizzo dei computer quantistici

Questo tipo di crittografia, a chiave pubblica, viene usato in Bitcoin per generare le firme digitali tramite la crittografia ellittica (ECDSA), nello specifico la curva secp256k1.

In Bitcoin:

  1. La chiave privata, tenuta segreta dal proprietario, viene usata per firmare un' hash di una transazione che autorizza l'invio delle monete che possiede.
  2. La chiave pubblica, visibile da tutti una volta che le monete verranno inviate/spese, viene usata per verificare che la corrispondente chiave privata è stata usata per generare la transazione.



Crittografia in Bitcoin

L'ecosistema di Bitcoin usa una coppia di chiavi digitali privata-pubblica (relazionate matematicamente), create usando la crittografia ellittica (ECDSA: Elliptic Curve Digital Signature Algorithm

Chiave Privata (Privkey)

È essenzialmente un numero generato casualmente che deve essere mantenuto segreto. La Privkey viene usata per generare le firme digitali, confermare l'autenticità e autorizzare l'invio di bitcoins.

Chiave pubblica (Pubkey)

Viene generata dalla chiave privata con l'utilizzo della crittografia ellittica. Quando si inviano e ricevono bitcoins, la chiave pubblica è rappresentata dall'indirizzo bitcoin.

Immagina la chiave pubblica come il tuo numero del conto della tua banca e la chiave privata come il PIN per accederci che deve essere mantenuto segreto.

Indirizzo Bitcoin

Un indirizzo Bitcoin è quello che identifica la destinazione dei pagamenti in bitcoin. Viene generato dalla chiave pubblica tramite un algoritmo e fa riferimento ad essa.

È generalmente generato usando le funzioni di hash SHA256 e RIPEMD-160 in serie sulla chiave pubblica.

Questa serie di caratteri viene poi codificata usando la codificazione Base58 per renderlo più leggibile.
58 sono i caratteri alfanumerici di questa codificazione.

Perchè 58?

Ci sono 52 caratteri nell'alfabeto (26 maiuscoli e 26 minuscoli) + 10 numeri (da 0 a 9). Di questi 62, Satoshi ne rimosse 4 per non confondere numeri e lettere, cioè: la lettera 'O' e il numero 0, la lettera maiuscola 'I' (i) e la lettera minuscola 'l' (elle).


RECAP degli algoritmi usati

  • Chiave Privata: C4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9 afa73bd4e39a8a

⚙️ ECDSA (Chiave privata)

  • Chiave Pubblica: 0478d430274f8c5ec1321338151e927f4c676a008bdf8638d07c0b6be9ab35c71a1518063243acd4dfe96b66e3f2ec8013c8e072cd09b3834a1981659cc345

⚙️ RIPEMD-160 (SHA256 (Chiave pubblica))

  • Indirizzo bitcoin con scarsa leggibilità: c4c5d791fcb4654a1ef5e03fe0ad3d9c598f9827

⚙️ Base58 (Indirizzo)

  • ✅ Indirizzo bitcoin: 1JwSSubhmg6iPtRityqhUYYH7bZq3Lfy1T

Nella maggior parte dei casi sia la chiave privata che la chiave pubblica sono contenute nel wallet.

chiave privata e pubblica

La chiave privata collegata alla chiave pubblica (e quindi all'indirizzo BTC) è: L3nzYUMrpMua59tqgnR7Gk37nvr5458auGzXRWQnUWY5fuZCu6ab

La chiave pubblica (indirizzo bitcoin) è: 1aavsnddTKS3fWFiW83tOVWqHCZY+pFAd