Gli ingressi e le uscite delle funzioni hash crittografiche

Le funzioni hash sono uno dei pilastri fondamentali della tecnologia blockchain. In effetti, l’hashing conferisce da solo una delle proprietà più importanti alla blockchain: l’immutabilità.

Le funzioni di hash crittografiche in entrata e in uscita

In questo articolo, faremo conoscenza con alcune delle funzioni di hash crittografiche più comunemente utilizzate nelle criptovalute. Ma prima, capiamo cosa significa hashing.

Gli ingressi e le uscite delle funzioni hash crittografiche

Allora, cos’è l’hashing?

In termini semplici, l’hashing significa prendere una stringa di input di qualsiasi lunghezza e fornire un output di lunghezza fissa. Nel contesto delle criptovalute come bitcoin, le transazioni vengono prese come input ed eseguite attraverso un algoritmo di hashing (bitcoin utilizza SHA-256) che fornisce un output di lunghezza fissa.

Vediamo come funziona il processo di hashing. Inseriremo alcuni input. Per questo esercizio, utilizzeremo SHA-256 (Secure Hashing Algorithm 256).

Come puoi vedere, nel caso di SHA-256, non importa quanto grande o piccolo sia il tuo input, l’output avrà sempre una lunghezza fissa di 256 bit. Ciò diventa fondamentale quando si ha a che fare con un’enorme quantità di dati e transazioni. Quindi fondamentalmente, invece di ricordare i dati di input che potrebbero essere enormi, puoi semplicemente ricordare l’hash e tenerne traccia. Prima di andare oltre, dobbiamo prima vedere le varie proprietà delle funzioni di hashing e come vengono implementate nella blockchain.

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

Funzioni hash crittografiche

Una funzione hash crittografica è una classe speciale di funzioni hash che ha varie proprietà che la rendono ideale per la crittografia. Ci sono alcune proprietà che una funzione hash crittografica deve avere per essere considerata sicura. Analizziamoli uno per uno.

Proprietà 1: deterministico

Ciò significa che non importa quante volte analizzi un particolare input tramite una funzione hash, otterrai sempre lo stesso risultato. Questo è fondamentale perché se ottieni hash diversi ogni singola volta sarà impossibile tenere traccia dell’input.

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

Proprietà 2: calcolo rapido

La funzione hash dovrebbe essere in grado di restituire rapidamente l’hash di un input. Se il processo non è abbastanza veloce, il sistema semplicemente non sarà efficiente.

Proprietà 3: resistenza pre-immagine

Quello che afferma la resistenza pre-immagine è che dato H (A) non è possibile determinare A, dove A è l’input e H (A) è l’hash di output. Notare l’uso della parola “non fattibile” invece di “impossibile”. Sappiamo già che non è impossibile determinare l’input originale dal suo valore hash. Facciamo un esempio.

Supponiamo che tu stia lanciando un dado e l’output sia l’hash del numero che esce dai dadi. Come sarai in grado di determinare qual era il numero originale? È semplice tutto ciò che devi fare è scoprire gli hash di tutti i numeri da 1 a 6 e confrontarli. Poiché le funzioni hash sono deterministiche, l’hash di un particolare input sarà sempre lo stesso, quindi puoi semplicemente confrontare gli hash e scoprire l’input originale.

Ma funziona solo quando la quantità di dati fornita è molto inferiore. Cosa succede quando hai un’enorme quantità di dati? Supponi di avere a che fare con un hash a 128 bit. L’unico metodo che hai per trovare l’input originale è usare il “metodo della forza bruta”. Il metodo della forza bruta significa fondamentalmente che devi prendere un input casuale, hash e quindi confrontare l’output con l’hash di destinazione e ripetere fino a trovare una corrispondenza.

Quindi, cosa succederà se usi questo metodo?

Scenario migliore: ottieni la tua risposta al primo tentativo stesso. Dovrai seriamente essere la persona più fortunata del mondo perché questo accada. Le probabilità che ciò accada sono astronomiche.

Scenario peggiore: ottieni la tua risposta dopo 2 ^ 128 – 1 volte. Fondamentalmente, significa che troverai la tua risposta alla fine di tutti i dati.

Scenario medio: lo troverai da qualche parte nel mezzo, quindi sostanzialmente dopo 2 ^ 128/2 = 2 ^ 127 volte. Per metterlo in prospettiva, 2 ^ 127 = 1,7 X 10 ^ 38. In altre parole, è un numero enorme.

Quindi, sebbene sia possibile rompere la resistenza pre-immagine tramite il metodo della forza bruta, ci vuole così tanto tempo che non importa.

Proprietà 4: L’effetto valanga.

Anche se apporti una piccola modifica al tuo input, le modifiche che si rifletteranno nell’hash saranno enormi. Proviamolo usando SHA-256:

Gli ingressi e le uscite delle funzioni hash crittografiche

Lo vedi? Anche se hai appena cambiato il caso del primo alfabeto dell’input, guarda quanto ha influenzato l’hash dell’output.

Questa proprietà è nota anche come effetto valanga.

Proprietà 5: resistente alle collisioni

Dati due diversi input A e B dove H (A) e H (B) sono i rispettivi hash, non è possibile che H (A) sia uguale a H (B). Ciò significa che, per la maggior parte, ogni input avrà il proprio hash unico. Perché abbiamo detto “per la maggior parte”? Per capirlo, dobbiamo sapere che cos’è “The Birthday Paradox”.

Qual è il paradosso del compleanno?

Se incontri uno sconosciuto a caso per strada, le possibilità che entrambi abbiate lo stesso compleanno sono molto basse. In effetti, supponendo che tutti i giorni dell’anno abbiano la stessa probabilità di avere un compleanno, le probabilità che un’altra persona condivida il tuo compleanno è 1/365, ovvero lo 0,27%. In altre parole, è davvero basso.

Tuttavia, detto questo, se raccogli 20-30 persone in una stanza, le probabilità che due persone condividano lo stesso identico compleanno aumentano astronomicamente. In effetti, c’è una probabilità del 50-50 per 2 persone di condividere lo stesso compleanno in questo scenario!

Gli ingressi e le uscite delle funzioni hash crittografiche

Perché succede? È a causa di una semplice regola di probabilità che è la seguente:

Supponi di avere N diverse possibilità di accadimento di un evento, quindi hai bisogno della radice quadrata di N elementi casuali per avere una probabilità del 50% di una collisione.

Quindi applicando questa teoria per i compleanni, hai 365 diverse possibilità di compleanni, quindi hai solo bisogno di Sqrt (365), che è ~ 23 ~, persone scelte a caso per il 50% di possibilità che due persone condividano i compleanni.

Qual è l’applicazione di questo nell’hashing?

Supponi di avere un hash a 128 bit che ha 2 ^ 128 diverse possibilità. Usando il paradosso del compleanno, hai il 50% di possibilità di rompere la resistenza alle collisioni al sqrt (2 ^ 128) = 2 ^ 64a istanza.

Come puoi vedere, è molto più facile rompere la resistenza alle collisioni che rompere la resistenza pre-immagine. Nessuna funzione hash è priva di collisioni, ma di solito ci vuole così tanto tempo per trovare una collisione. Quindi, se stai usando una funzione come SHA-256, è lecito ritenere che se H (A) = H (B) allora A = B.

Quindi, come si crea una funzione hash resistente alle collisioni? Per questo usiamo un paradigma chiamato paradigma Merkle-Damgard.

Qual è il paradigma Merkle-Damgard?

Il paradigma è molto semplice e funziona sulla seguente filosofia: data una funzione hash resistente alle collisioni per messaggi brevi, possiamo costruire una funzione hash resistente alle collisioni per messaggi lunghi.

Gli ingressi e le uscite delle funzioni hash crittografiche

Credito immagine: Youtube

Tenendo presente il diagramma sopra, prendi nota di quanto segue:

  • Un messaggio più grande M è suddiviso in blocchi più piccoli di m [i].

  • La funzione hash H consiste di molte funzioni hash più piccole “h”.

  • “H” è una funzione hash più piccola, nota anche come funzione di compressione, che accetta un piccolo blocco di messaggio e restituisce un hash.

  • La prima funzione hash “h” (che è cerchiata nel diagramma sopra) accetta il primo blocco di messaggio (m [0]) e gli aggiunge un valore fisso IV e restituisce l’hash.

  • L’hash ora viene aggiunto al secondo blocco di messaggio e passa attraverso un altro hash

  • funzione he questo va avanti fino all’ultimo blocco di messaggi dove viene aggiunto anche un blocco di riempimento PB al messaggio.

  • L’output di ciascuna funzione di compressione h è chiamato variabile di concatenamento.

  • Il blocco di riempimento è una serie di 1 e 0. Nell’algoritmo SHA-256, il PB è lungo 64 bit.

  • L’output della funzione di compressione hash h è l’output del messaggio grande M.

Quindi, come segue la resistenza alle collisioni?

Per questo, seguiamo la semplice teoria: se “h” è resistente alle collisioni, anche “H” dovrebbe essere resistente alle collisioni.

Per dimostrare questo teorema, andremo nella direzione opposta. Cioè, se possiamo dimostrare che esiste una collisione su H, allora anche h dovrebbe avere una collisione.

Supponiamo che ci siano due messaggi M e M ‘e stiamo ottenendo una collisione sul significato di entrambi gli hash:

H (M) = H (M ’)

Quindi possiamo usare queste informazioni per dedurre la collisione in h. Per ora, deduciamo le variabili di concatenamento sia per H (M) che per H (M ‘).

Per H (M)

IV = H (0), H (1),…., H (t), H (t + 1) = H (M)

Per H (M ’)

IV = H ’(0), H’ (1),…., H ’(r), H’ (r + 1) = H (M ’)

Entrambe le funzioni hash potrebbero non avere lo stesso numero di variabili di concatenamento (t potrebbe non essere uguale a r). Tuttavia, in entrambi gli scenari:

H (t + 1) = H (M).

E

H ’(r + 1) = H (M’)

E poiché sappiamo che H (M) = H (M ’) poiché esiste la collisione, quindi H’ (r + 1) = H (t + 1).

Hmm … siamo a una congettura interessante qui. Torniamo al nostro diagramma sopra:

Gli ingressi e le uscite delle funzioni hash crittografiche

Ora, se H (t + 1) e H ‘(r + 1) sono gli ultimi hash delle rispettive funzioni hash, allora quale sarebbe il messaggio che sarebbe andato nell’ultima funzione di compressione di ciascuna funzione?

Per H (t + 1) sarebbe h (H (t), M (t) || PB)

Allo stesso modo, H ’(r + 1) = h (H’ (r), M ’(r) || PB’)

Ora, se H (t + 1) e H ‘(r + 1) sono gli ultimi hash delle rispettive funzioni hash, allora quale sarebbe il messaggio che sarebbe andato nell’ultima funzione di compressione di ciascuna funzione?

Per H (t + 1) sarebbe h (H (t), M (t) || PB)

Allo stesso modo, H ’(r + 1) = h (H’ (r), M ’(r) || PB’)

Quindi, in quali condizioni la funzione di compressione “h” dovrebbe essere non resistente alle collisioni? IFF dà lo stesso output a input che non sono simili significato:

  • H (t)! = H ’(r).
  • M (t)! = M ’(r).
  • PB! = PB ’.

Tuttavia, se questi risultati sono simili, dobbiamo andare un po ‘più a fondo. Se PB = PB ‘allora sappiamo che entrambi hanno lo stesso numero di blocchi di messaggi che significano t = r che significherebbe automaticamente che:

M (t) = M ’(r)

AND H (t) = H ’(r)

In questo caso consideriamo H (t) e H ’(r) che possiamo riscrivere come H’ (t) poiché il valore di te r sono uguali.

Quindi quale sarebbe il valore di H (t) e H ’(t)?

H (t) = h (H (t-1), M (t-1)) e H ’(t) = h (H’ (t-1), M ’(t-1))

Poiché H (t) = H ’(t) allora h (H (t-1), M (t-1)) = h (H’ (t-1), M ’(t-1)).

Affinché la collisione possa resistere, è necessario osservare le seguenti condizioni:

H (t-1)! = H ’(t-1)

M (t-1)! = M ’(t-1),

Se queste condizioni sono vere, allora sappiamo che abbiamo trovato una collisione su he possiamo fermarci.

Ora cosa succede se queste condizioni sono vere?

Significato H (t-1) = H ’(t-1) e poiché sappiamo già che M (t) = M’ (t) allora M (t-1) = M ’(t-1).

Possiamo continuare i calcoli precedenti per H (t-1) e H ‘(t-1) fino a raggiungere l’inizio del messaggio. In tal caso deve sussistere una delle due seguenti condizioni:

  • Trova collisione per h.
  • Tutti i blocchi di messaggi di M e M ’sono gli stessi.

Poiché sappiamo già che la condizione principale per il verificarsi di una collisione è che il messaggio di input M e M ’non può essere lo stesso, l’unica altra condizione in cui si verifica la collisione di H è se anche la funzione di compressione h ha una collisione.

Quindi possiamo vedere che per sempre la funzione hash H che ha una collisione otteniamo una funzione di compressione h che ha anche la collisione e quindi Merkle-Damgard è vero.

Proprietà 6: Puzzle Friendly

Questa è una proprietà molto affascinante e l’applicazione e l’impatto che questa proprietà ha avuto sulla criptovaluta è enorme. Per prima cosa definiamo la proprietà, dopodiché esamineremo ogni termine in dettaglio.

Per ogni output “Y”, se k è scelto da una distribuzione con min-entropia alta non è possibile trovare un input x tale che H (k | x) = Y.

Probabilmente ti è passato per la testa! Ma va bene, ora capiamo cosa significa questa definizione.

Qual è il significato di “alta min-entropia”?

Significa che la distribuzione da cui viene scelto il valore è enormemente distribuita tanto che noi scegliendo un valore casuale lo ha trascurabile probabilità. Fondamentalmente, se ti viene detto di scegliere un numero compreso tra 1 e 5, questa è una distribuzione minima di entropia bassa. Tuttavia, se dovessi scegliere un numero compreso tra 1 e un miliardo di gazillion, questa è una distribuzione min-entropy elevata.

Cosa significa “k | x”?

Il “|” denota la concatenazione. Concatenazione significa aggiungere due stringhe insieme. Per esempio. Se dovessi concatenare “BLU” e “CIELO” insieme, il risultato sarà “BLUESKY”.

Quindi ora rivisitiamo la definizione:

Supponiamo di avere un valore di output “Y”. Se scegli un valore casuale “k” da un’ampia distribuzione, non è possibile trovare un valore X tale che l’hash della concatenazione di k e x darà l’output Y.

Ancora una volta, nota la parola “irrealizzabile”, non è impossibile perché le persone lo fanno sempre. In effetti, l’intero processo di mining funziona su questo (ne parleremo più avanti).

Esempi di funzioni hash crittografiche

  • MD 5: produce un hash a 128 bit. La resistenza alle collisioni è stata interrotta dopo ~ 2 ^ 21 hash.

  • SHA 1: produce un hash a 160 bit. La resistenza alle collisioni si è interrotta dopo ~ 2 ^ 61 hash.

  • SHA 256: produce un hash a 256 bit. Questo è attualmente utilizzato da bitcoin.

  • Keccak-256: produce un hash a 256 bit ed è attualmente utilizzato da Ethereum.

  • RIPEMD-160: produce un output di 160 ma e viene utilizzato dallo script Bitcoin (insieme a SHA-256).

  • CryptoNight: la funzione hash utilizzata da Monero.

Ora che abbiamo esaminato cosa significa hash e quali sono le proprietà delle funzioni di hash crittografiche, familiarizziamo con alcune delle funzioni di hash crittografiche più comunemente usate in Cryptocurrency.

Algoritmi di hash sicuro (SHA)

Algoritmi di hash sicuri, secondo la sua pagina Wikipedia, sono una famiglia di funzioni hash crittografiche pubblicate dal National Institute of Standards and Technology (NIST) come standard FIPS (Federal Information Processing Standard) degli Stati Uniti. Lo SHA è costituito dai seguenti algoritmi:

  • SHA-0: si riferisce alla funzione hash originale a 160 bit pubblicata nel 1993 con il nome “SHA”. È stato ritirato poco dopo la pubblicazione a causa di un “difetto significativo” non rivelato e sostituito dalla versione leggermente rivista SHA-1.

  • SHA-1: è stato inserito quando SHA-0 non è riuscito a consegnare. Questa è una funzione hash a 160 bit che assomiglia al precedente algoritmo MD5. Questo è stato progettato dalla National Security Agency (NSA) per far parte del Digital Firma Algoritmo. Tuttavia è stato scaricato poco dopo che le persone hanno notato debolezze crittografiche.

  • SHA-2: Ah, ora arriviamo a una delle categorie più popolari di funzioni hash là fuori. È stato progettato dalla NSA utilizzando il paradigma Merkle-Damgard. Sono una famiglia di due funzioni hash con diverse dimensioni di parola: SHA-256 e SHA-512. bitcoin utilizza SHA-256

  • SHA-3: precedentemente noto come keccak, è stato scelto nel 2012 dopo un concorso pubblico tra designer non NSA. Supporta le stesse lunghezze di hash di SHA-2 e la sua struttura interna differisce in modo significativo dal resto della famiglia SHA. Ethereum utilizza questa funzione hash.

Gli ingressi e le uscite delle funzioni hash crittografiche

Credito immagine: Wikipedia

Diamo uno sguardo più da vicino a SHA-256 e SHA-3.

SHA-256

SHA-256 è una funzione SHA-2 che utilizza parole a 32 ma anziché SHA-512 che utilizza parole a 64 bit. bitcoin utilizza SHA-256 in 2 modi significativi:

  • Estrazione.
  • Creazione di indirizzi.

Estrazione:

L’estrazione in bitcoin implica che i minatori risolvano complessi puzzle computazionali per trovare un blocco che viene poi aggiunto alla blockchain di Bitcoin. Questo è chiamato proof-of-work e implica il calcolo di una funzione hash SHA-256.

Creazione di indirizzi

La funzione hash SHA-256 viene utilizzata per eseguire l’hashing della chiave pubblica bitcoin per generare l’indirizzo pubblico. L’hash della chiave aggiunge un ulteriore livello di protezione all’identità della persona. Inoltre, un indirizzo con hash è semplicemente più corto di una chiave pubblica bitcoin che aiuta meglio nell’archiviazione.

SHA-256 in azione

Ingresso: Ciao

Produzione: 98EA6E4F216F2FB4B69FFF9B3A44842C38686CA685F3F55DC48C5D3FB1107BE4

SHA-3

Come accennato in precedenza, questo era precedentemente noto come keccak ed è utilizzato da Ethereum. È stato creato dopo un concorso pubblico da designer non NSA. SHA-3 utilizza la funzione spugna.

Qual è la funzione spugna?

Gli ingressi e le uscite delle funzioni hash crittografiche

Credito immagine: Wikipedia

Una funzione spugna è una classe di algoritmi con stato interno finito che accetta un flusso di bit in ingresso di qualsiasi lunghezza e produce un flusso di bit in uscita di una lunghezza predeterminata.

Prima di continuare, dobbiamo definire alcuni termini:

Sappiamo che in una funzione spugna, i dati sono “assorbito“Nella spugna, il risultato è”spremuto“Fuori.

Quindi c’è un “Assorbire“Fase e un”Spremere” fase.

Fase di assorbimento:

In questa fase, il messaggio viene suddiviso in blocchi e XOR’d in un sottoinsieme dello stato, che viene poi trasformato nel suo insieme utilizzando una funzione di permutazione f.

Gli ingressi e le uscite delle funzioni hash crittografiche

Fase di compressione:

Da Wikipedia. “I blocchi di uscita vengono letti dallo stesso sottoinsieme dello stato, alternato alla funzione di trasformazione dello stato f. La dimensione della parte dello stato che viene scritta e letta è chiamata “velocità” (indicata con r), e la dimensione della parte non toccata da input / output è chiamata “capacità” (indicata con c). La capacità determina la sicurezza dello schema. Il livello di sicurezza massimo è la metà della capacità. “

Gli ingressi e le uscite delle funzioni hash crittografiche

Ora per vedere come funziona, considera i seguenti elementi:

  • Una stringa di input N.

  • Una funzione di imbottitura “pad”.

  • Una permutazione funziona “f” che opera su blocchi di bit di larghezza b.

  • Un tasso “r”.

  • Lunghezza output = “d”.

  • Capacità “c” = b-r.

  • Costruzione spugna: spugna [f, pad, r] (N, d) che risulta in una stringa di bit Z della lunghezza d.

Quindi, come funzionerà ora il processo?

  • In primo luogo, la stringa di input viene riempita con “pad” che risulta nella stringa di bit imbottita P con una lunghezza divisibile per r.
  • La stringa imbottita P viene quindi suddivisa in n blocchi r-bit consecutivi da P [0] a P [n-1].
  • Quindi inizializziamo lo stato S su una stringa di b 0 bit.
  • Ora ogni blocco di corda imbottita P inizia ad essere assorbito usando il seguente processo:

    a) Ogni blocco p [i] viene riempito utilizzando una stringa di c “0 bit” fino a raggiungere la lunghezza “b”.

  1. b) La stringa risultante è XOR con “S”, ovvero lo stato proveniente dal blocco precedente.

    c) Infine la funzione di permutazione del blocco f viene applicata al risultato, ottenendo un nuovo Stato S.

    NOTA: ogni blocco risulta in un nuovo stato S. Come abbiamo visto nel passaggio 3, il valore inizializzato è “0”.

  • Il risultato Z viene inizializzato sulla stringa vuota.
  • SE la lunghezza di Z è inferiore a d:

    a) I primi r bit di S vengono aggiunti a Z.

    b) Se Z non è ancora della lunghezza richiesta, la funzione di permutazione f viene applicata a S per creare un nuovo stato e da lì i bit vengono aggiunti a Z.

  • Se Z è troppo lungo, viene troncato in d bit.

SHA-3 in azione:

Ingresso: Ciao

Produzione: 154013cb8140c753f0ac

358da6110fe237481b26c75c3ddc1b

59eaf9dd7b46a0a3aeb2cef164b3c82

d65b38a4e26ea9930b7b2cb3c01da

4ba331c95e62ccb9c3

Funzione hash RIPEMD-160

RIPEMD è una famiglia di funzioni hash crittografiche sviluppate a Lovanio, in Belgio, da Hans Dobbertin, Antoon Bosselaers e Bart Preneel presso il gruppo di ricerca COSIC presso la Katholieke Universiteit Leuven, e pubblicate per la prima volta nel 1996.

Sebbene RIPEMD si basi sui principi di progettazione di MD4, le sue prestazioni sono molto simili a SHA-1. RIPEMD-160 è la versione a 160 bit di questa funzione hash ed è comunemente usata per generare indirizzi bitcoin.

La chiave pubblica bitcoin viene eseguita prima attraverso la funzione hash SHA-256 e poi attraverso RIPEMD-160. Il motivo per cui lo facciamo è perché l’output di 160 bit è molto più piccolo di 256 bit, il che aiuta a risparmiare spazio.

Insieme a ciò, RIPEMD-160 è l’unica funzione hash che produce gli hash più brevi la cui unicità è ancora sufficientemente garantita.

Gli ingressi e le uscite delle funzioni hash crittografiche

Credito immagine: Wikipedia

L’immagine sopra mostra un’istantanea di un sottoblocco dalla funzione di compressione dell’algoritmo hash RIPEMD-160.

RIPEMD-160 in azione:

Ingresso: Ciao

Produzione: 242485ab6bfd3502bcb3442ea2e211687b8e4d89

Funzione hash CryptoNight

Ora abbiamo la funzione hash CryptoNight che viene utilizzata da Monero. A differenza di bitcoin, Monero voleva che il loro mining fosse il più ostile possibile alla GPU. L’unico modo in cui potevano farlo era rendere difficile la memoria del loro algoritmo hash.

Entra in CryptoNight

CryptoNight è una funzione hash hard memory. È progettato per essere calcolabile in modo inefficiente su architetture GPU, FPGA e ASIC. La breve panoramica di come funziona CryptoNight è la seguente:

  • L’algoritmo inizializza prima un grande blocco appunti con dati pseudo-casuali.

  • Successivamente vengono eseguite numerose operazioni di lettura / scrittura su indirizzi pseudocasuali

  • contenuto nel blocco appunti.

  • Infine, l’intero blocco appunti viene sottoposto ad hashing per produrre il valore finale.

Il diagramma seguente mostra lo schema dell’algoritmo hash CryptoNight.

Gli ingressi e le uscite delle funzioni hash crittografiche

Credito immagine: Dave’s Data

NOTA: Tutti i dati e il codice presi da White paper di CryptoNight

Passaggio 1: inizializzazione di Scratchpad

Il primo passaggio della funzione hash CryptoNight è l’inizializzazione degli appunti. L’inizializzazione avviene in questo modo:

  • I dati di input vengono sottoposti ad hashing utilizzando Keccak con i parametri b = 1600 ec = 512.
  • I primi 32 byte dell’output di Keccak vengono interpretati come una chiave AES-256 [AES] ed espansi a 10 chiavi rotonde.
  • Viene allocato un blocco appunti di 2097152 byte (2 MiB).
  • I byte 64-191 vengono estratti dallo stato finale di Keccak e suddivisi in 8 blocchi di 16 byte ciascuno.
  • Ogni blocco viene quindi crittografato utilizzando la seguente procedura:

    per i = 0..9 fai:

    block = aes_round (block, round_keys [i])

  • La crittografia AES viene eseguita sui blocchi e il risultato è XOR con la chiave rotonda.
  • I blocchi risultanti diventano i primi 128 byte dello scratchpad. Successivamente i blocchi subiscono nuovamente la crittografia che diventa i secondi 128 byte dello scratchpad. Il processo continua finché non viene inizializzato completamente.

Gli ingressi e le uscite delle funzioni hash crittografiche

Immagine: presa da GitHub. Il diagramma mostra l’inizializzazione di Scratch Pad.

Passaggio 2: Hard Loop della memoria

Questo passaggio della funzione hash esiste per rendere l’hash il più difficile da estrarre possibile per GPUS.

  • In primo luogo, i byte 0..31 e 32..63 dell’output di Keccak sono XORed, ei 32 byte risultanti sono usati per inizializzare le variabili aeb, 16 byte ciascuna.
  • Le variabili aeb entrano quindi nel ciclo principale.
  • Il ciclo è iterato 524.288 volte.
  • Quando un valore di 16 byte deve essere convertito in un indirizzo nello scratchpad, viene interpretato come un numero intero little-endian e i 21 bit di ordine inferiore vengono utilizzati come indice di byte. Tuttavia, i 4 bit di ordine inferiore dell’indice vengono cancellati per garantire l’allineamento a 16 byte.
  • I dati risultanti vengono inseriti nello scratchpad in blocchi da 16 byte.

Ogni iterazione può essere espressa con il seguente pseudo-codice:

Gli ingressi e le uscite delle funzioni hash crittografiche

  • Nel codice sopra, la funzione 8byte_add rappresenta ciascuno degli argomenti come una coppia di valori little-endian a 64 bit e li somma insieme, per componenti, modulo 2 ^ 64. Il risultato viene riconvertito in 16 byte.
  • D’altra parte, la funzione 8byte_mul, tuttavia, utilizza solo i primi 8 byte di ogni argomento, che vengono interpretati come interi little endian a 64 bit senza segno e moltiplicati insieme. Il risultato viene convertito in 16 byte e infine le due metà da 8 byte del risultato vengono scambiate.

Gli ingressi e le uscite delle funzioni hash crittografiche

Immagine: Questo è un diagramma del segmento Memory Hard Loop.

Passaggio 3: il calcolo dei risultati

Infine, abbiamo il calcolo del risultato.

  • Quando la funzione memory-hard loop viene eseguita, i byte 32-63 dell’output di Keccak vengono espansi in 10 tasti circolari AES nello stesso modo della prima parte.
  • I byte 64..191 vengono estratti dallo stato Keccak e XOR’d con i primi 128 byte del blocco note.
  • Lo stato risultante viene quindi crittografato nello stesso modo della prima parte, ma utilizzando le nuove chiavi.
  • Il risultato è XOR con i secondi 128 byte dallo scratchpad, crittografato di nuovo e così via.
  • Dopo aver eseguito lo XORing con gli ultimi 128 byte del blocco appunti, il risultato viene crittografato l’ultima volta e quindi i byte 64..191 nello stato Keccak vengono sostituiti con il risultato.
  • Lo stato di Keccak viene quindi passato attraverso Keccak-f (la permutazione di Keccak) con b = 1600.
  • I 2 bit di ordine inferiore del primo byte dello stato vengono utilizzati per selezionare una funzione hash: 0 = BLAKE-256 [BLAKE], 1 = Groestl-256 [GROESTL], 2 = JH-256 [JH] e 3 = Matassa-256 [SKEIN]. La funzione hash scelta viene quindi applicata allo stato di Keccak e l’hash risultante è FINALMENTE l’output di CryptoNight.

Gli ingressi e le uscite delle funzioni hash crittografiche

Gli ingressi e le uscite delle funzioni hash crittografiche

Immagine: Diagramma della generazione del risultato finale.

A differenza dell’algoritmo di Scrypt Hashing, l’algoritmo di Cryptonight dipende da tutti i blocchi precedenti per ogni nuovo blocco. CryptoNight è elegantemente semplice e il suo uso intelligente della crittografia AES nativa e dei veloci moltiplicatori a 64 bit mantiene l’algoritmo compatibile con la CPU, rendendolo il più ostile possibile alla GPU.

CryptoNight in azione:

Ingresso: Questo è un test

Produzione: a084f01d1437a09c6985401b60d43554ae105802c5f5d8a9b3253649c0be6605

Conclusione

Così il gioco è fatto! Quattro degli algoritmi di hashing più comunemente usati nelle criptovalute. Avere una comprensione di base e fondamentale di come funzionano ti aiuterà a rispettare l’enorme quantità di calcoli che avvengono dietro le quinte. In futuro potrebbero ancora arrivare algoritmi di hashing più recenti, il che rende quelli sopra menzionati completamente obsoleti. Tuttavia, questa innovazione costante non è la parte più eccitante dell’ecosistema crittografico?

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me