Funzionalità di decrittazione e mining Sha256. Spiegazione degli algoritmi di mining di criptovalute Cos'è l'algoritmo sha 256

Alessandro Marcov

L'abbreviazione SHA 256 sta per Secure Hashing Algorithm, un popolare meccanismo di hashing creato da specialisti della NSA. Il compito chiave dell'algoritmo è la trasformazione di informazioni casuali in valori con una lunghezza fissa, che verranno utilizzati in futuro per identificare queste informazioni.

Storia dell'apparenza

Notiamo subito che si tratta di un algoritmo di seconda generazione creato sulla base del suo predecessore, SHA-1, che a sua volta è stato sviluppato nel 1995 esclusivamente per uso civile. Una versione aggiornata dell'ormai popolare algoritmo è stata creata dalla National Security Agency nel 2002.

Tre anni dopo, apparve un brevetto che consentiva l'uso dell'algoritmo per scopi civili. La terza versione del popolare meccanismo è apparsa nel 2012, è stata sviluppata da specialisti della National Standards Agency. Nel tempo, SHA-3 ha completamente sostituito i suoi predecessori.

È impossibile decifrare i dati convertiti perché l'hash sum non è considerato un processo di crittografia nell'interpretazione classica di questo processo. L'algoritmo di crittografia unidirezionale elabora una quantità illimitata di informazioni.

Vale la pena notare che assolutamente tutte le versioni esistenti del Secure Hashing Algorithm sono state create secondo il principio Merkle-Damgard: le informazioni sono suddivise in categorie uniformi. Ogni gruppo è soggetto a compressione unilaterale, di conseguenza la lunghezza dei dati viene notevolmente ridotta.

Questo metodo di crittografia ha molti vantaggi:

  • la compressione dei dati viene eseguita rapidamente;
  • è impossibile ripristinare il processo di conversione senza chiavi;
  • la probabilità di collisioni è ridotta a zero.

Specifiche tecniche

Il protocollo è progettato per i dati divisi in parti, il volume di ciascuna è di 64 byte. L'algoritmo fornisce il consolidamento, a seguito del quale viene visualizzato un codice a 256 bit. La tecnologia di crittografia si basa su un ciclo relativamente semplice, il cui ciclo è di 64 volte.

  • Dimensione del blocco di 64 byte.
  • La lunghezza massima del codice crittografato è di 33 byte.
  • Parametri digest del messaggio - 32 byte.
  • La dimensione della parola predefinita è 4 byte.
  • Il numero di ripetizioni in un ciclo è 64.
  • La velocità dell'algoritmo è di 140 Mbps.

Come accennato in precedenza, il protocollo SHA-256 si basa sul concetto Merkle-Damgard, il che significa che viene prima suddiviso in blocchi e solo successivamente in singole parole.

L'insieme di informazioni passa attraverso un intervallo di ripetizioni: 64 o 80. Ogni ciclo è accompagnato da una trasformazione di un blocco di parole. Il codice hash finale viene generato sommando i valori iniziali.

Criptovalute con algoritmo SHA-256

Considera le valute digitali, che vengono estratte secondo i principi dell'algoritmo SHA-256:

  • Bitcoin, una valuta che non ha bisogno di ulteriori presentazioni, è ancora la criptovaluta più popolare.
  • Peercoin - l'unicità sta nel fatto che il codice è basato su Bitcoin, ma il meccanismo viene utilizzato per proteggere la rete e PoW viene utilizzato per distribuire le monete.
  • Namecoin è una tecnologia open source che migliora notevolmente la sicurezza, la privacy, il decentramento.
  • Unobtanium - caratterizzato da un'esposizione minima all'inflazione. Ci vorranno circa 300 anni per estrarre monete di Unobtanium.
  • Deutsche eMark è una rete digitale per il trasferimento di vari asset, come il denaro. Lo scambio avviene senza intermediari.
  • BetaCoin è un mezzo di pagamento internazionale che funziona secondo lo stesso principio del sistema Bitcoin.
  • Joulecoin: fornisce la conferma più veloce delle transazioni, basata su Bitcoin.
  • IXCoin è un altro progetto open source basato sul principio della rete peer-to-peer.
  • – Piattaforma Blockchain che premia gli utenti per la pubblicazione di contenuti unici.

Vale anche la pena notare che l'algoritmo SHA-256 è utilizzato nel sistema Litecoin, ma esclusivamente nella subroutine. Per il mining viene utilizzato il protocollo Scrypt.

Mining di criptovalute sull'algoritmo SHA-256

Cominciamo dal fatto che ci sono tre modi per estrarre monete i cui sistemi funzionano secondo questo protocollo:

  • ASIC.

La complessità del mining dipende direttamente dal tipo di criptovaluta di cui stiamo parlando. Tuttavia, in ogni caso, sono i dispositivi ASIC a essere più efficienti, il cui principale svantaggio è il loro costo eccessivamente elevato.

In media, un minatore ASIC costa circa 100 mila rubli (Asic Miner AVALON 821), ma puoi anche acquistare modelli più costosi, il cui prezzo raggiunge mezzo milione di rubli (Asic Miner BITFURY B8 16NM 50 TH/S).

Per quanto riguarda l'estrazione di criptovaluta sui processori, questo metodo è considerato il meno efficace. Soprattutto quando si tratta della valuta digitale Bitcoin.

La soluzione più adeguata è dalle schede video. In media, il costo di una fattoria redditizia varia da $ 1000-2000. Quale scheda video scegliere per il mining di criptovalute sull'algoritmo SHA-256?

Se parliamo di Nvidia, allora la soluzione migliore sarebbe una scheda video (1400 MH/s). Naturalmente, anche il diretto concorrente di fronte ad AMD non è da meno, assolutamente tutte le carte della serie Vega sono adatte al mining. L'adattatore video Radeon RX Vega fornisce mining a una velocità di 1200 MH/S. È questa attrezzatura che dovrebbe essere data la preferenza.

Se stai cercando un'opzione più economica, in questo caso puoi acquistare la Radeon 7970, tale attrezzatura è in grado di fornire fino a 800 MH / s. Non dimenticare che oltre alle schede video, per far funzionare la fattoria sono necessarie altre apparecchiature, ad esempio radiatori di raffreddamento, un alimentatore, RAM, ecc.

Conclusione

Questo è tutto ciò che i minatori devono sapere sull'algoritmo SHA-256. Ovviamente molte criptovalute moderne utilizzano il protocollo Scrypt, ma il mining della moneta più popolare (BTC) viene comunque effettuato secondo questo principio.

Oggi molti hanno già sentito parlare di criptovalute, bitcoin e altri concetti correlati, ma solo una conoscenza superficiale per comprendere la stessa infrastruttura del denaro digitale non sarà sufficiente. Dietro il guscio esterno ci sono meccanismi più interessanti e complessi che rendono uniche le criptovalute. Uno di questi elementi è l'algoritmo SHA-256, che è alla base di Bitcoin e della maggior parte delle altcoin moderne. Considera i principi di base del suo lavoro.

Come funziona l'algoritmo SHA-256?

Non è un segreto che durante il processo di mining i miner risolvano alcuni problemi matematici che consentono loro di verificare le transazioni e aggiungerle alla blockchain, ma come viene implementato questo processo dall'interno? È qui che entra in gioco l'algoritmo SHA-256.

Per essere precisi, SHA-256 non è tanto un algoritmo quanto una funzione di hash crittografica sviluppata dalla US NSA (National Security Agency). Il suo compito principale è trasformare un insieme arbitrario di dati in valori che hanno una lunghezza fissa. Cioè, se hai un array di dati composto da decine, centinaia o migliaia di elementi, può essere ridotto a una forma generale di una dimensione specifica.

La particolarità del valore finale è che può essere confrontato con l'array originale, ma non può essere convertito nella sua forma originale.

Che cosa ha a che fare l'algoritmo SHA-256 con il mining?

Quando si estraggono monete su schede grafiche o processori, nella console vengono visualizzati messaggi nel seguente formato: "Accepted 0aef41a3b". 0aef41a3b è l'hash che tutti i miner cercano, ovvero una copia ridotta di un array di dati di grandi dimensioni. Questi pochi caratteri sono essenzialmente un blocco di centinaia, migliaia e milioni di righe simili.

Il compito principale dei minatori e delle loro apparecchiature informatiche è trovare un hash per un blocco con un certo numero di zeri iniziali. Ciò richiede un'enorme quantità di potenza di calcolo, perché l'enumerazione di tutte le opzioni possibili richiede la potenza corrispondente di un computer.

Inoltre, la complessità dell'attività mineraria è rafforzata dalla concorrenza naturale. Coloro che hanno computer o minatori più potenti selezionano le opzioni più velocemente, trovando l'hash. Pertanto, sperare che oggi si possa "svelare" almeno 1 hash utilizzando il processore centrale è semplicemente stupido. La probabilità di un tale evento è 1 su diversi milioni o addirittura decine di milioni.

Quali monete usano l'algoritmoSHA-256?

Oggi, oltre al bitcoin, altre criptovalute funzionano su SHA-256, ad esempio:

  • Zetacoin.
  • moneta.
  • peercoin.
  • emercoin.

Nonostante alcune delle sue carenze nel contesto del segmento delle criptovalute, le monete basate sull'algoritmo SHA-256 continuano a mantenere le loro posizioni. Quello che vale solo bitcoin, che oggi viene venduto a un prezzo di circa 7,5mila dollari a moneta, e si colloca anche al primo posto nella classifica per capitalizzazione.

Molti sono interessati alle basi tecniche delle criptovalute, ma pochi hanno familiarità con la crittografia. Per andare a fondo di ciò che sta accadendo nel protocollo Bitcoin, bisogna guadare nella giungla di termini crittografici, acronimi criptici e scomodi come SHA-256, Scrypt, base58check, RIPMD-160, ecc. Ne abbiamo già trattati alcuni in precedenza. In questo articolo cercheremo di parlare di uno dei suoi aspetti più importanti: i cripto-algoritmi.

Classico: SHA-256

Iniziamo la nostra recensione, ovviamente, con il classico SHA-256, con cui tutto è iniziato: è su questo algoritmo che si basa il mining di bitcoin, così come il mining della stragrande maggioranza dei cloni di bitcoin ().

Quindi cos'è questo SHA-256? Questa è una funzione di hash crittografica che è stata sviluppata dai nostri "amici" - l'Agenzia per la sicurezza nazionale degli Stati Uniti. Aspetta, non correre in prostrazione, non c'è nulla di cui preoccuparsi. Sii paziente un po', ti prometto che sicuramente non ti annoierai.

Il compito principale di qualsiasi funzione hash è trasformare (o eseguire l'hash) un insieme arbitrario di elementi di dati in un valore di lunghezza fissa ("impronta digitale" o "digest"). Questo valore caratterizzerà in modo inequivocabile l'insieme dei dati iniziali (funge da firma), senza la possibilità di estrarre questi dati iniziali. Questa è la spiegazione ufficiale di Wikipedia, meravigliosa e scientificamente valida, ma io, per esempio, non parlo una lingua del genere. E sono sicuro che anche la maggior parte di voi lo fa. E quindi, lasciate che vi spieghi il significato di questo "fenomeno", a modo nostro, in modo semplice.

Come tutti sappiamo, quando estraiamo monete crittografiche SHA-256, risolviamo il compito con l'aiuto di una CPU, una GPU o un processore specializzato. I processi di conversione vengono visualizzati nell'interfaccia del programma destinato al mining, ad esempio come stringa "Accepted 0aef41a3b". Il valore 0aef41a3b è l'hash. È, per così dire, la firma di un grande set di dati (in effetti, il prossimo blocco di transazioni con un numero casuale aggiunto ad esso). Questa linea corta è, per così dire, un blocco composto da diverse migliaia, se non milioni, di linee simili.

Questo spiega anche perché devi forzare molti problemi prima di poter trovare l'hash giusto per un nuovo blocco. Dopotutto, non stiamo cercando alcun hash, ma uno che inizi con un certo numero di zeri. Hai una possibilità su mille, decine, centinaia di migliaia, milioni di decisioni che un hash casuale avrà il giusto numero di zeri iniziali. Quanto esattamente? Determinato dal parametro di difficoltà impostato dal pool di mining. È impossibile capire in anticipo se otterrai un "bellissimo hashish" o meno. È come giocare alla lotteria, ma con macchine in grado di calcolare la combinazione vincente più velocemente e meglio di chiunque altro.

Pensi di aver bisogno di un potente? C'è un senso in questo. Maggiore è la potenza di elaborazione utilizzata, meglio è, poiché aumentano le possibilità di estrarre monete. Ma tieni presente che non sei l'unico mining. Ci sono persone che ne hanno di più. Non preoccuparti, hai tutte le possibilità di vincere. È come giocare alla lotteria, non sai mai quando sei fortunato!

Ora torniamo all'algoritmo SHA-256. La criptovaluta non è l'unico esempio in cui viene utilizzato SHA-256. Ci sono diversi protocolli di cui probabilmente hai sentito parlare che utilizzano questo algoritmo. Questi protocolli sono SSL, SSH, PGP e molti altri. Ogni volta che accedi a un sito Web sicuro utilizzando un certificato SSL, viene utilizzato SHA-256. Scommetto che non ci hai pensato, vero? Impariamo tutti qualcosa di nuovo nel tempo!

È l'algoritmo SHA-256 implementato in tutti i miner ASIC specializzati rilasciati fino ad oggi, l'attrezzatura ASIC per altri algoritmi di mining è ancora in fase di sviluppo. Oltre a Bitcoin, il mining basato su SHA-256 viene utilizzato in una serie di altre valute digitali clone. Ad esempio, le altcoin come Peercoin e Namecoin lo usano. Di recente, c'è stata un'ondata di nuove monete SHA-256: Zetacoin, Ocoin, Tekcoin e dozzine di altre.

Puzzle più difficili: Scrypt

L'algoritmo SHA-256 non è l'unico algoritmo di interesse per i minatori. Il secondo algoritmo di mining più popolare nel mondo delle criptovalute è Scrypt. La storia di Scrypt è legata al fatto che già nelle prime fasi dell'esistenza di bitcoin, è diventato ovvio che la semplicità della funzione SHA-256 consente di realizzare soluzioni hardware che eseguiranno tali calcoli in modo molto più efficiente rispetto a un processore per computer convenzionale (CPU). In effetti, il mining di bitcoin è migrato molto rapidamente dalla CPU alle unità di elaborazione grafica (GPU), quindi ai dispositivi hardware programmabili (FPGA), dopodiché sono usciti microcircuiti (ASIC) appositamente personalizzati. il potere ASIC specializzato è una sfida per una valuta decentralizzata.

La funzione di hashing Scrypt è stata progettata specificamente per complicare le implementazioni hardware aumentando la quantità di risorse necessarie per il calcolo. Pertanto (almeno in teoria) una tale concentrazione di risorse minerarie come in bitcoin non dovrebbe verificarsi, e rimarrà decentralizzata.

In sostanza, il mining di Scrypt non è molto diverso dal mining di Bitcoin. Viene fornito un blocco di dati come input, ad esso viene applicata una funzione hash, in output stiamo cercando di ottenere un "bellissimo hash". Ma la funzione hash stessa è molto più difficile da calcolare. Questo algoritmo utilizza più RAM (memoria ad accesso casuale) rispetto a SHA-256. La memoria in Scrypt viene utilizzata per memorizzare un grande vettore di sequenze di bit pseudocasuali generate proprio all'inizio dell'algoritmo. Una volta creato un vettore, i suoi elementi vengono interrogati in un ordine pseudo-casuale e combinati tra loro per ottenere la chiave finale.

Poiché l'algoritmo di generazione del vettore è noto, in linea di principio è possibile implementare scrypt, che non richiede molta memoria, ma calcola ogni elemento al momento dell'accesso. Tuttavia, il calcolo di un elemento è relativamente complesso e ogni elemento viene letto molte volte durante la funzione scrypt. Scrypt ha un tale equilibrio tra memoria e tempo che le implementazioni non di memoria sono troppo lente.

Questa complessità creata artificialmente, tutto questo processo computazionale che richiede tempo e requisiti di memoria portano al fatto che qualsiasi attrezzatura specializzata per il mining di Scrypt non sarà di ordini di grandezza più efficiente dei dispositivi generici (GPU, CPU).Idealmente, le monete basate su Scrypt dovrebbero essere estratte su uno (o più) computer con molta memoria. Qui, le schede video sono di grande importanza. Se stai pensando di acquistare schede video per il mining utilizzando il protocollo Scrypt, l'opzione migliore sarebbe acquistare un prodotto da ATI. A causa delle differenze architettoniche, le prestazioni di mining sulle schede grafiche ATI sono ora molto più elevate rispetto a Nvidia, anche se questo potrebbe cambiare in futuro.

In definitiva, tutto si riduce a questo: i protocolli SHA-256 e Scrypt funzionano per lo stesso scopo: ottenere un "grazioso hash" con la forza bruta, che ci darà (o meglio, il pool per cui lavoriamo) il diritto di allungare la blockchain e ricevere ricompense per essa. . Risolvono semplicemente il problema in diversi modi: in SHA-256, l'enfasi è sulle capacità tecniche dell'hardware: maggiori sono le prestazioni, migliore è il risultato. E Scrypt richiede una grande quantità di memoria per funzionare. Di conseguenza, le prestazioni dipendono direttamente dalle dimensioni della memoria ad accesso casuale (RAM) e dalle schede video installate nel computer.

Litecoin è l'altcoin più famoso utilizzato nel mining di Scrypt. Ci sono anche Dogecoin, Digitalcoin, Franco, Bottlecaps e molti altri. La popolarità delle monete Scrypt, in particolare Litecoin, è aumentata in modo significativo dopo che il mining di bitcoin è migrato in modo massiccio su ASIC e gli ex minatori con schede video sono stati lasciati senza lavoro: le loro apparecchiature non possono competere con le mietitrebbie specializzate. Quindi hanno adattato i loro video all'estrazione di monete leggere, o all'estrazione di altri esotici, che possono ancora essere venduti a investitori ingenui e sfortunati, .

Criptodanza: Scrypt-Jane


Incontra Jane! No, no, lei e Scrypt non sono sposati, anche se c'è ancora qualche legame familiare tra loro. A Scrypt-Jane piace divertirsi proprio come qualsiasi altra ragazza. E le sue capacità di mescolare i dati e i suoi compagni di algoritmi ti porteranno nei luoghi più esotici! Non capire? Ora ti spiego tutto.

Scypt-Jane supporta almeno tre diversi sistemi di cifratura a flusso. Prima di tutto, abbiamo Salsa20/8. No, questa non è una danza latinoamericana, anzi, è una funzione abbastanza semplice. Il suo compito principale è ricevere una stringa di 192 byte (di lettere o numeri) e quindi convertirla in una stringa Salsa20 (x) di 64 byte.

Non è chiaro, vero? Ok, cercherò di usare meno teoria. Salsa20 è costituito da due parti: un codice di flusso per crittografare i dati (questo deve suonare più familiare) e una funzione di compressione (chiamata algoritmo Rumba20) per comprimere una stringa di 192 byte in un valore di 64 byte. Per usare il lessico "teiera", puoi dire questo: la tua stringa può essere più lunga di 64 byte fino a raggiungere il valore di 192 byte, nel qual caso la stringa verrà compressa (leggi: convertita) in una stringa di 64 byte.

Ora che ci siamo riscaldati un po' dopo la salsa e la rumba, è tempo di introdurre la seconda caratteristica: ChaCha20. Onestamente, non sono io che invento questi nomi. ChaCha20 è molto simile a Salsa20: è lo stesso codice di flusso. Eppure, offre alcuni servizi aggiuntivi, come una maggiore resistenza alla crittoanalisi. Migliora anche il mescolamento dei dati per round. Cioè, se stai estraendo criptovaluta come parte di un pool di mining, puoi vedere che un round di mining (il periodo di tempo durante il quale il pool trova un blocco) può essere un periodo di tempo lungo o breve. La durata di questi round dipende anche in parte dal miglioramento del missaggio offerto da ChaCha20 di Scrypt-Jane. Ci sono altri fattori che influenzano la riduzione del tempo di rotazione, ma ne parleremo più avanti.

E infine, ultimo ma non meno importante, la terza funzione di mixaggio dei dati è Salsa6420/8. Titolo sexy, vero? Salsa6420/8 è un proof of concept per la versione a 64 byte di Salsa20/8. È solo una versione migliorata di Salsa20/8 che ti consente di lavorare con blocchi di byte più alti. Potrei continuare così con informazioni tecniche dettagliate, ma temo che metà di voi, miei cari lettori, si sia già addormentata e il resto abbia iniziato a giocare ai giocattoli sui propri smartphone, quindi non soffermiamoci su questo. Ricorda solo che Scrypt-Jane ha tre grandi "partner di mixaggio".

Ma torniamo alla realtà! Scrypt-Jane supporta anche diverse funzioni hash. Uno di questi è già molto noto a tutti noi: questo è SHA-256. Supporta anche il più avanzato SHA-512. Altre funzioni hash supportate includono BLAKE256/512, Skein512 e Keccak256/512 (o solo SHA -3).

BLAKE256-512 ha un design molto semplice da utilizzare e si basa sui componenti che abbiamo già analizzato: la struttura HAIFA (non la considereremo al momento) e la funzione principale di ChaCha (di cui abbiamo parlato prima). Le caratteristiche più caratteristiche di BLAKE sono un alto margine di sicurezza (una caratteristica piuttosto importante, ma non se ne parla ora) e versatilità ad alte prestazioni (che è molto importante anche per i minatori). La cosa da ricordare di BLAKE è che può e sarà più veloce di SHA-2(56) su un certo numero di piattaforme.

D'altra parte, abbiamo Skein512. Coloro che escogitano nomi così grandi dovrebbero ricevere una medaglia... Skein ("Lalka" in russo) è una funzione hash presentata a una competizione di algoritmi hash crittografici. Unisce velocità, sicurezza, semplicità e flessibilità. Lo amiamo tutti molto, vero? È anche molto efficace su più piattaforme sia in ambienti hardware che software. Puoi anche trovare l'algoritmo Skein su piccole smart card, con cui la maggior parte di noi ha molta esperienza.

Sì, la terminologia danza-crittografica qui è semplicemente furiosa. Ma basta teoria, diamo un'occhiata a cosa può fare Scrypt-Jane per noi. Scrypt-Jane ha il suo modo di ridimensionare la complessità dei problemi. Scrypt-Jane usa un fattore N (che è un numero) e questo numero determina la quantità di memoria necessaria per risolvere i problemi. Il valore del fattore N aumenta a determinati intervalli. Questo di solito accade quando nella blockchain si trova un certo numero di blocchi. Ogni volta che questo numero di fattore N aumenta, l'efficienza del mining di criptovalute diminuisce, poiché è necessaria sempre più memoria per eseguire le stesse attività. In parole povere, diminuirà il numero di attività completate, ovvero diminuirà anche la probabilità di trovare una soluzione.

Scrypt-Jane è stato originariamente progettato per il mining di sole CPU come sostituto ancora più contorto di Scrypt. Ma ahimè, anche qui il predominio del mining della CPU non è durato a lungo. I minatori della GPU giravano come corvi attorno alle monete Scrypt-Jane, cercando di aumentare l'efficienza del mining e, di conseguenza, il profitto. Pensi che anche se il profitto diminuisce, sarai in grado di minare con la GPU per un tempo più lungo rispetto al mining su CPU? Temo che lei stia sbagliando. Alla fine, il fattore N sarà così alto che le GPU saranno meno efficienti delle CPU per il mining su Scrypt-Jane. Per questo motivo, Scrypt-Jane non è così facile da tradurre in un mining ASIC specializzato come SHA-256 o persino Scrypt.

Una delle prime monete Scrypt-Jane a guadagnare una certa popolarità è stata Yacoin (sì, Sì, Yet Another Coin - "un'altra moneta"), tuttavia, la popolarità di questa moneta è diminuita rapidamente insieme a una diminuzione dell'interesse dei minatori per essa. Più recentemente, abbiamo visto apparire monete come Copperbars (anche l'efficienza del mining della GPU è diminuita) e le aggiunte più recenti all'elenco sono le valute TIX e Cryptonerd.

Venendo ovunque

I tre algoritmi descritti coprono oltre il 90% dell'intero zoo delle criptovalute, ma, ovviamente, ce ne sono altri. Quasi ogni settimana ci sono proposte per algoritmi di mining sempre più nuovi e intelligenti: è impossibile coprire tutto. Tra quelli relativamente nuovi, possiamo citare un algoritmo particolarmente "resistente agli ASIC", che verrà utilizzato in una piattaforma di criptovaluta di nuova generazione.

Speriamo che questo articolo ti abbia dato un'idea migliore di quali sono gli algoritmi crittografici di mining più comuni. Se stai estraendo, ora hai una migliore comprensione di cosa sta succedendo esattamente nelle viscere della tua macchina mineraria ronzante e surriscaldata e per cosa esattamente viene spesa la tua elettricità.

, "Secure Hash Standard (SHS)", Stati Uniti Dipartimento del Commercio, marzo 2012

Termini:
Standard federale per l'elaborazione delle informazioni FIPS.
SHA Secure Hash Algorithm (algoritmo di hash potente).
La parola è una variabile senza segno lunga 32 bit (4 byte) o 64 bit (8 byte), a seconda dell'algoritmo SHA selezionato.

SECURE HASH STANDARD (una famiglia di funzioni crittografiche SHA-1 e SHA-2)

La famiglia SHA di funzioni crittografiche è divisa in due sottoinsiemi: l'algoritmo stesso SHA-1(pubblicato nel 1995 - FIPS PUB 180-1) e una serie di algoritmi sotto il nome generale SHA-2(pubblicato nel 2002 - FIPS PUB 180-2, aggiornato nel 2008 - FIPS PUB 180-3): SHA-224, SHA-256, SHA-384, SHA-512; algoritmi aggiunti a FIPS PUB 180-4 nel 2012 SHA-512/224 e SHA-512/256. Esamineremo lo standard FIPS PUB 180-4, che combina l'intera famiglia di funzioni hash SHA-1 e SHA-2.

Questo standard definisce i seguenti algoritmi hash: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 e SHA-512/256, che calcolano una rappresentazione compressa di dati digitali (messaggi). Se l'input dell'algoritmo hash è un messaggio di qualsiasi lunghezza, ma inferiore a 2 64 bit (per SHA-1, SHA-224 e SHA-256) o inferiore a 2128 bit (per SHA-384, SHA-512, SHA-512/224 e SHA-512/256), quindi il risultato saranno dati chiamati il valore digest o hash del messaggio. La dimensione del valore hash del messaggio è nell'intervallo da 160 a 512 bit (o da 20 a 64 byte), a seconda dell'algoritmo scelto. Gli algoritmi SHA sono comunemente usati insieme ad altri algoritmi crittografici, come gli algoritmi di firma digitale o quando si esegue l'hashing con una chiave per l'autenticazione dei messaggi (HMAC) o quando si generano numeri casuali (bit).

Gli algoritmi hash specificati in questo standard sono detti sicuri perché è impossibile calcolare quanto segue da un determinato algoritmo: 1) recuperare un messaggio da un digest di messaggi specifico o 2) trova due messaggi diversi che hanno lo stesso digest dei messaggi (trova collisione). Qualsiasi modifica al messaggio comporterà, con una probabilità molto alta, valori hash diversi. Questa proprietà è utile durante la creazione e la verifica di firme digitali, durante l'autenticazione dei messaggi e durante la generazione di numeri casuali.

Ogni algoritmo è composto da due fasi: Elaborazione preliminare e calcolo hash. La pre-elaborazione include completamento del messaggio, suddividere il messaggio integrato in M-blocchi di bit, e impostazione dei valori di inizializzazione Il usato nel calcolo dell'hash. Il calcolo dell'hash è iterativo, elaborando ciascuno M-bit blocco del messaggio riempito e utilizza funzioni, costanti e operazioni sulle parole per ottenere il valore hash. Il risultato della procedura di calcolo dell'hash è un digest del messaggio.

Gli algoritmi differiscono per le dimensioni dei blocchi e delle parole dei dati hash e dei valori hash - vedere la tabella 1.

Algoritmo Dimensione del messaggio (in bit) Dimensione blocco (in bit) Dimensione parola (in bit) Dimensione digest del messaggio (in bit)
SHA-1 < 2 64 512 32 160
SHA-224 < 2 64 512 32 224
SHA-256 < 2 64 512 32 256
SHA-384 < 2 128 1024 64 384
SHA-512 < 2 128 1024 64 512
SHA-512/224 < 2 128 1024 64 224
SHA-512/256 < 2 128 1024 64 256
Funzioni

SHA-1 utilizza una sequenza di funzioni non lineari f 0 , f 1 ,…, f 79. Ogni funzione f t, dove 0 ≤ t< 79 , opera su tre variabili a 32 bit: X, y, e z, risultando in una singola parola a 32 bit. L'algoritmo SHA-1 utilizza il seguente insieme di funzioni non lineari f t (x, y, z):
00 ≤ t ≤ 19Ch(x, y, z)
20 ≤ t ≤ 39Parità(x, y, z)= x XOR y XOR z
40 ≤ t ≤ 59Maj(x, y, z)
60 ≤ t ≤ 79Parità(x, y, z)= x XOR y XOR z

Algebra booleana.
Si noti che, ad esempio, la funzione cap può essere espresso in altro modo:
z XOR (x AND (y XOR z))
Il risultato non cambierà. In varie implementazioni dell'algoritmo, è possibile trovare tali opzioni.

SHA-224 e SHA-256 utilizzano sei funzioni non lineari:

Ch(x, y, z)= (x E y) XOR (NON x E z)
Maj(x, y, z)= (x AND y) XOR (x AND z) XOR (y AND z)

Sigma0(x)= ROTR(x, 2) XOR ROTR(x, 13) XOR ROTR(x, 22)
Sigma1(x)= ROTR(x, 6) XOR ROTR(x, 11) XOR ROTR(x, 25)

Delta0(x)= ROTR(x, 7) XOR ROTR(x, 18) XOR SHR(x, 3)
Delta1(x)= ROTR(x, 17) XOR ROTR(x, 19) XOR SHR(x, 10)


n morso:
ROTR(x, n) = (x » n) | (x "(32-n))
SHR - spostati a destra vicino n morso:
SHR(x, n) = x » n

SHA-384, SHA-512, SHA-512/224, SHA-512/384 utilizza sei funzioni non lineari:

Ch(x, y, z)= (x E y) XOR (NON x E z)
Maj(x, y, z)= (x AND y) XOR (x AND z) XOR (y AND z)

Sigma0(x)= ROTR(x, 28) XOR ROTR(x, 34) XOR ROTR(x, 39)
Sigma1(x)= ROTR(x, 14) XOR ROTR(x, 18) XOR ROTR(x, 41)

Delta0(x)= ROTR(x, 1) XOR ROTR(x, 8) XOR SHR(x, 7)
Delta1(x)= ROTR(x, 19) XOR ROTR(x, 61) XOR SHR(x, 6)

Operazioni sulle parole (64 bit).
ROTR - spostamento ciclico a destra di n morso:
ROTR(x, n) = (x » n) | (x "(64-n))
SHR - spostati a destra vicino n morso:
SHR(x, n) = x » n

Costanti

Costanti Kt
00 ≤ t ≤ 19 0x5a827999
20 ≤ t ≤ 39 0x6ed9eba1
40 ≤ t ≤ 59 0x8f1bbcdc
60 ≤ t ≤ 79 0xca62c1d6

(Se sei interessato alla domanda da dove provengono questi numeri, indicheremo la loro fonte:
0x5A827999 = $\sqrt(2) / 4$ , 0x6ED9EBA1 = $\sqrt(3) / 4$ , 0x8F1BBCDC = $\sqrt(5) / 4$ , 0xCA62C1D6 = $\sqrt(10) / 4$ ; tutto si moltiplica per 232).

64 costanti (parole a 32 bit): K 0 , K 1 ... K 63. (Per i curiosi, queste costanti rappresentano i primi 32 bit delle radici frazionarie del cubo dei primi 64 numeri primi.)

K = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
]

80 costanti (parole a 64 bit): K 0 , K 1 ... K 79. (Per i curiosi, queste costanti rappresentano i primi 64 bit delle radici frazionarie del cubo dei primi 80 numeri primi.)

K = [
0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,
0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
]

Elaborazione preliminare
1. Completamento del messaggio

L'obiettivo è rendere il messaggio un multiplo di 512 o 1024 bit, a seconda dell'algoritmo SHA scelto. Il riempimento può essere eseguito prima della procedura di calcolo dell'hash, oppure durante l'esecuzione dell'hash, ma prima dell'elaborazione del blocco/i che conterrà il riempimento.

Mè uguale a l "uno" K- in modo che la dimensione del messaggio ricevuto sia 64 bit inferiore a un multiplo di 512 ( l+1+k = 448 mod 512). Successivamente, al risultato viene aggiunta una rappresentazione a 64 bit della dimensione l messaggio originale M "abc" "uno", quindi 448 - (24 +1) = 423 bit «0» e infine una rappresentazione a 64 bit di dimensione 24 = 00…011000. Di conseguenza, otteniamo un messaggio a 512 bit del modulo:

Assumiamo che la lunghezza del messaggio Mè uguale a l morso. Prima aggiunta alla fine del messaggio "uno", e poi zeri - nell'importo K- in modo che la dimensione del messaggio ricevuto sia 128 bit inferiore a un multiplo di 896 ( l+1+k = 896 mod 1024). Successivamente, al risultato viene aggiunta una rappresentazione a 128 bit della dimensione l messaggio originale M. Ad esempio, (testo ASCII) abbiamo un messaggio "abc", lunghezza 8 * 3 = 24 bit. Aggiunta a un messaggio "uno", quindi 896 - (24 +1) = 871 bit «0» e infine una rappresentazione a 128 bit di dimensione 24 = 00…011000. Di conseguenza, otteniamo un messaggio a 1024 bit del modulo:

2. Suddividere il messaggio aumentato in M-blocchi di bit.

N M-blocchi di bit.

Il messaggio esteso è suddiviso in n. 512-Blocchi di bit: M(1) , M(2) ... M(N). Perché 512 bit possono essere espressi come 16 (sedici) parole a 32 bit, quindi i primi 32 bit io M 0 (i), i prossimi 32 bit M 1 (i), e così arriviamo M 15(i).

Il messaggio esteso è suddiviso in N 1024-Blocchi di bit: M(1) , M(2) ... M(N). Perché 512 bit possono essere espressi come 16 (sedici) parole a 64 bit, quindi i primi 64 bit io del esimo blocco di messaggi, denotare M 0 (i), i prossimi 64 bit M 1 (i), e così arriviamo M 15(i).

3. Impostazione dei valori di inizializzazione

Prima della procedura di calcolo dell'hash, l'algoritmo imposta i valori iniziali H. Dimensione e numero di parole H dipende dall'algoritmo scelto

Quattro parole a 32 bit.
H0 = 0x67452301
H1 = 0xefcdab89
H2=0x98badcf
H3 = 0x10325476
H4 = 0xc3d2e1f0

Otto parole a 32 bit.

0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4)

Otto parole a 32 bit.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19)

(Per i curiosi: questi valori rappresentano i primi 32 bit delle parti frazionarie della radice quadrata dei numeri primi - numeri seriali dei numeri: i primi 8).

Otto parole a 64 bit.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17,
0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511,
0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4)

(Per i curiosi: questi valori rappresentano i primi 64 bit delle parti frazionarie della radice quadrata dei numeri primi - numeri seriali dei numeri: dal 9° al 16°).

Otto parole a 64 bit.
H0, H1, H2, H3, H4, H5, H6, H7 = (


(Per i curiosi: questi valori rappresentano i primi 64 bit delle parti frazionarie della radice quadrata dei numeri primi - numeri seriali dei numeri: i primi 8).



H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b, 0x5be0cd19137e2179)











Otto parole a 64 bit.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x8C3D37C819544DA2, 0x73E1996689DCD4D6, 0x1DFAB7AE32FF9C82,
0x679DD514582F9FCF, 0x0F6D2B697BD44DA8, 0x77E36F7304C48942,
0x3F9D85A86A1D36C8, 0x1112E6AD91D692A1)

"SHA-512/t" è un nome generico per una funzione hash t-bit basata su SHA-512 il cui risultato è troncato a t bit. Ciascuna versione della funzione hash t-bit richiede un valore di inizializzazione diverso. Per questo è stata introdotta una procedura speciale per la determinazione dei valori iniziali per SHA-512/t di una particolare variante t.

Procedura per la determinazione dei valori iniziali per SHA-512/t.
1. Prendiamo i valori iniziali di H dall'algoritmo SHA-512.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b, 0x5be0cd19137e2179)

2. Facciamo i seguenti calcoli:
H0' = H0 XOR 0xA5A5A5A5A5A5A5A5
H1' = H1 XOR 0xA5A5A5A5A5A5A5A5
H2' = H2 XOR 0xA5A5A5A5A5A5A5A5
H3' = H3 XOR 0xA5A5A5A5A5A5A5A5
H4' = H4 XOR 0xA5A5A5A5A5A5A5A5
H5' = H5 XOR 0xA5A5A5A5A5A5A5A5
H6' = H6 XOR 0xA5A5A5A5A5A5A5A5
H7' = H7 XOR 0xA5A5A5A5A5A5A5A5

3. Calcolare l'hash dalla stringa SHA-512("SHA-512/t") (dove t può essere "224" o "256") con i valori iniziali H'. Il valore hash saranno i valori iniziali per l'algoritmo SHA-512/t:
H per SHA-512/224 = SHA512(H', "SHA-512/224")
H per SHA-512/256 = SHA512(H', "SHA-512/256")

Otto parole a 64 bit.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x22312194FC2BF72C, 0x9F555FA3C84C64C2, 0x2393B86B6F53B151,
0x963877195940EABD, 0x96283EE2A88EFFE3, 0xBE5E1E2553863992,
0x2B0199FC2C85B8AA, 0x0EB72DDC81C52CA2)

Calcolo hash

Nell'algoritmo di addizione "+" si verifica modulo 2 32 .

Per i = da 1 a N:
{
1. io
M 0 (i) Su M 15 (i))
in 80 parole di 32 bit (con W0 Su W 79):
W t = M t, per t = 0..15
W t = ROTL(W t-3 XOR W t-8 XOR W t-14 XOR W t-16 , 1), per t = 16..79
(È interessante notare che la specifica SHA originale (l'algoritmo SHA-0) non lo faceva
spostamento ciclico a sinistra ROTL(x, 1))

2. Inizializzeremo le variabili a,b,c,d,e.
a = H0(i-1)
b=H1(i-1)
c = H2(i-1)
d=H3(i-1)
e = H4(i-1)

3. Il ciclo principale della funzione di compressione
Per t = da 0 a 79
TEMP= ROTL(a, 5) + f t (b, c, d) + e + W t + K t
e=d
d=c
c= ROTL(b, 30)
b = a
a = TEMP

4.
H0 (i) = (H0 (i-1) + a)
H1(i) = (H1(i-1) + b)
H2(i) = (H2(i-1) + c)
H3(i) = (H3(i-1) + d)
H4(i) = (H4(i-1) + e)
}

Il valore hash risultante è un digest di messaggi a 160 bit:
H0(N) || H1(N) || H2(N) || H3(N) || H4(N)(5 parole * 32 bit = 160 bit)

Operazioni sulle parole (32 bit).
ROTL - spostamento ciclico a sinistra di n morso:
ROTL(x, n) = (x « n) | (x" (32-n))

Nell'algoritmo di addizione "+" si verifica modulo 2 32 .

Per i = da 1 a N:
{
1. io esimo blocco di messaggi utilizzando il seguente algoritmo
convertito da 16 parole a 32 bit (con M 0 (i) Su M 15 (i))
in 64 parole di 32 bit (con W0 Su W 63):
W t = M t, per t = 0..15
W t \u003d W t-16 + Delta0(W t-15) + W i-7 + Delta1(W t-2), per t = 16..63

2.
a = H0(i-1)
b=H1(i-1)
c = H2(i-1)
d=H3(i-1)
e = H4(i-1)
f=H5(i-1)
g=H6(i-1)
h=H7(i-1)

3. Il ciclo principale della funzione di compressione
Per t = da 0 a 63
TEMP1=h+ Sigma1(e) + cap(e,f,g) + W t + K t
TEMP2= Sigma0(a) + Il Mag(a,b,c)
h = g
g = f
f=es
e = d + TEMP1
d=c
c = b
b = a
a = TEMP1 + TEMP2

4. Calcola il valore hash intermedio
H0 (i) = (H0 (i-1) + a)
H1(i) = (H1(i-1) + b)
H2(i) = (H2(i-1) + c)
H3(i) = (H3(i-1) + d)
H4(i) = (H4(i-1) + e)
H5(i) = (H5(i-1) + f)
H6(i) = (H6(i-1) + g)
H7(i) = (H7(i-1) + h)
}

Il valore hash risultante è un digest di messaggi a 256 bit:
(8 parole * 32 bit = 256 bit)
Attenzione: l'ordine dei byte in ogni parola è "big-endian"

L'algoritmo è identico all'algoritmo SHA-256. La differenza sta nei valori di inizializzazione di H (vedi sopra) e come viene preso l'hash risultante. Perché otteniamo un digest del messaggio a 256 bit, quindi prendiamo solo i primi 224 bit per ottenere il valore hash finale:

H0(N) || H1(N) || H2(N) || H3(N) || H4(N) || H5(N) || H6(N)(7 parole * 32 bit = 224 bit)
Attenzione: l'ordine dei byte in ogni parola è "big-endian"

L'algoritmo è simile a SHA-256, solo tutte le variabili e le parole sono a 64 bit.
Nell'algoritmo di addizione "+" si verifica modulo 2 64 .

Per i = da 1 a N:
{
1. io esimo blocco di messaggi utilizzando il seguente algoritmo
convertito da 16 parole a 64 bit (con M 0 (i) Su M 15 (i))
in 80 parole da 64 bit (con W0 Su W 79):
W t = M t, per t = 0..15
W t \u003d W t-16 + Delta0(W t-15) + W i-7 + Delta1(W t-2), per t = 16..79

2. Inizializzeremo le variabili a,b,c,d,e,f,g,h.
a = H0(i-1)
b=H1(i-1)
c = H2(i-1)
d=H3(i-1)
e = H4(i-1)
f=H5(i-1)
g=H6(i-1)
h=H7(i-1)

3. Il ciclo principale della funzione di compressione
Per t = da 0 a 79
TEMP1=h+ Sigma1(e) + cap(e,f,g) + W t + K t
TEMP2= Sigma0(a) + Il Mag(a,b,c)
h = g
g = f
f=es
e = d + TEMP1
d=c
c = b
b = a
a = TEMP1 + TEMP2

4. Calcola il valore hash intermedio
H0 (i) = (H0 (i-1) + a)
H1(i) = (H1(i-1) + b)
H2(i) = (H2(i-1) + c)
H3(i) = (H3(i-1) + d)
H4(i) = (H4(i-1) + e)
H5(i) = (H5(i-1) + f)
H6(i) = (H6(i-1) + g)
H7(i) = (H7(i-1) + h)
}

Il valore hash risultante è un digest di messaggi a 512 bit:
H0(N) || H1(N) || H2(N) || H3(N) || H4(N) || H5(N) || H6(N) || H7(N)(8 parole * 64 bit = 512 bit)
Attenzione: l'ordine dei byte in ogni parola è "big-endian"

L'algoritmo è identico all'algoritmo SHA-512. La differenza sta nei valori di inizializzazione di H (vedi sopra) e come viene preso l'hash risultante. Perché otteniamo un digest del messaggio a 512 bit, quindi prendiamo solo i primi 384 bit per ottenere il valore hash finale:

H0(N) || H1(N) || H2(N) || H3(N) || H4(N) || H5(N)(6 parole * 64 bit = 384 bit)
Attenzione: l'ordine dei byte in ogni parola è "big-endian"

L'algoritmo è identico all'algoritmo SHA-512. La differenza sta nei valori di inizializzazione di H (vedi sopra) e come viene preso l'hash risultante. Perché otteniamo un digest del messaggio a 512 bit, quindi prendiamo solo i primi 224 bit per ottenere il valore hash finale:

H0(N) || H1(N) || H2(N) || primi 32 bit di H3 (N)(3 parole * 64 bit + 32 bit = 224 bit)
Attenzione: l'ordine dei byte in ogni parola è "big-endian"

L'algoritmo è identico all'algoritmo SHA-512. La differenza sta nei valori di inizializzazione di H (vedi sopra) e come viene preso l'hash risultante. Perché otteniamo un digest del messaggio a 512 bit, quindi prendiamo solo i primi 256 bit per ottenere il valore hash finale:

H0(N) || H1(N) || H2(N) || H3(N)(4 parole * 64 bit = 256 bit)
Attenzione: l'ordine dei byte in ogni parola è "big-endian"

Primitivi crittografici
Algoritmi a chiave pubblica RSA DSA
Cifre a flusso RC4
Funzioni hash
  • Traduzione

Ad un certo punto, volevo capire quanto velocemente puoi estrarre bitcoin manualmente. Si è scoperto che l'hashing SHA-256 viene utilizzato per il mining, ed è abbastanza semplice e può essere calcolato anche senza un computer. Naturalmente, il processo è molto lento e completamente impraticabile. Ma, dopo aver eseguito tutti i passaggi su un pezzo di carta, puoi capire bene i dettagli dell'algoritmo.

Un round di criptovalute

Estrazione

Una parte fondamentale dell'intero sistema di sicurezza di Bitcoin è il mining. L'idea di base è che i miner raggruppino le transazioni bitcoin in un unico blocco, di cui è già stato eseguito l'hashing di un numero non numerabile per trovare un valore hash molto raro soggetto a condizioni speciali. Quando viene trovato un tale valore, il blocco viene considerato estratto ed entra nella catena di blocchi. L'hashing stesso non ha uno scopo utile se non quello di aumentare la difficoltà di trovare il blocco corretto. Pertanto, questa è una delle garanzie che nessuno da solo con un insieme di risorse esistente può assumere il controllo dell'intero sistema. Puoi leggere di più sul mining nel mio ultimo articolo.

La funzione di hashing crittografico riceve un blocco di dati come input e produce un output piccolo, ma imprevedibile. È progettato in modo che non ci sia un modo rapido per ottenere l'output desiderato e devi continuare a ripetere finché non trovi un valore adatto. Bitcoin utilizza SHA-256 come tale funzionalità. Inoltre, per aumentare la sicurezza, SHA-256 viene applicato al blocco due volte ed è già chiamato double SHA-256.

In bitcoin, il criterio per la validità di un hash è un numero sufficiente di zeri iniziali. Trovare un tale hash è difficile come, ad esempio, trovare un numero di auto o di telefono che termina con più zeri. Ma ovviamente, per un hash, è esponenzialmente più difficile. Attualmente, un hash valido dovrebbe contenere circa 17 zeri iniziali, che è solo 1 su 1.4x10 20 . Se tracciamo un'analogia, trovare un tale valore è più difficile che trovare una particella specifica tra tutta la sabbia sulla Terra.

I blocchi blu mescolano in modo non lineare i bit per rendere più difficile l'analisi crittografica. Inoltre, per un'affidabilità ancora maggiore, vengono utilizzate diverse funzioni di mixaggio (se riesci a trovare una scappatoia matematica per generare rapidamente hash validi, allora assumerai il controllo dell'intero processo di mining di bitcoin).

La funzione maggioranza (blocco Ma) opera bit per bit sulle parole A, B e C. Per ogni posizione di bit, restituisce 0 se la maggior parte dei bit di input in quella posizione sono zero, altrimenti restituisce 1.

Il blocco Σ0 ruota A di 2 bit, quindi la parola originale A viene ruotata di 13 bit e, allo stesso modo, di 22 bit. Le tre versioni spostate risultanti di A vengono aggiunte bit a bit modulo 2 ( regolare xor, (LA ror 2) xor (LA ror 13) xor (LA ror 22)).

Ch implementa una funzione di selezione. Ad ogni posizione di bit viene controllato un bit da E, se è uguale a uno, allora un bit da F da questa posizione va all'uscita, altrimenti un bit da G. Quindi, i bit da F e G sono mescolati in base a il valore di E.

Σ1 ha una struttura simile a Σ0, ma funziona con la parola E e le costanti di spostamento corrispondenti sono 6, 11 e 25.

I blocchi rossi eseguono un'addizione a 32 bit, generando nuovi valori per le parole di uscita A ed E. Il valore W t viene generato in base ai dati in ingresso (questo accade nella parte dell'algoritmo che riceve ed elabora i dati hash È fuori dalla nostra considerazione). K t è la sua costante per ogni round.

Nel diagramma sopra, si nota che solo A ed E cambiano in un round crittografico. Le parole rimanenti non cambiano, ma vengono spostate all'uscita: la vecchia A diventa l'uscita B, la vecchia B diventa la nuova C e così via. Sebbene un singolo round dell'algoritmo non modifichi molto i dati, ma dopo 64 round, le informazioni di input verranno completamente crittografate.

Minimizza manualmente

Nel video, mostro come puoi seguire tutti i passaggi descritti con carta e penna. Ho eseguito il primo round di hashing per estrarre il blocco. Mi ci sono voluti 16 minuti e 45 secondi.


Mi spiego un po' cosa sta succedendo: ho scritto le parole dalla A alla H in forma esadecimale, e sotto ciascuna ho fatto una traduzione binaria. Il risultato dell'esecuzione del blocco Ma è sotto la parola C, e i valori di A dopo gli spostamenti e l'uscita Σ0 stessa si trovano sopra la riga con A. La funzione di scelta appare sotto G, e infine le corrispondenti versioni spostate di E e il valore dopo il blocco Σ1 vanno sopra la linea con E. In nell'angolo in basso a destra viene eseguita un'addizione, il cui risultato è coinvolto nel calcolo sia della nuova A che della nuova E (i primi tre blocchi di sommatori rossi ). In alto a destra, ho calcolato il nuovo valore di A, e nel mezzo c'è il calcolo del nuovo valore di E. Tutti questi passaggi sono stati discussi sopra e possono essere facilmente tracciati sul diagramma.

Oltre al round mostrato nel video, ne ho condotto un altro: l'ultimo 64esimo round di hashing per un particolare blocco bitcoin. Nella foto, il valore hash è evidenziato in giallo. Il numero di zeri conferma che si tratta di un hash bitcoin valido. Nota che gli zeri sono alla fine dell'hash, non all'inizio, come ho scritto prima. Il motivo è che bitcoin inverte semplicemente i byte ricevuti da SHA-256.


L'ultimo round di SHA-256 ha portato a un blocco bitcoin estratto con successo

Cosa significa tutto questo per la progettazione dei minatori "di ferro"?

Ogni passaggio in SHA-256 sembra molto semplice nella logica digitale: semplici operazioni di bit e somme a 32 bit (se hai mai studiato i circuiti, probabilmente hai già immaginato come potrebbe apparire nell'hardware). Pertanto, gli ASIC implementano SHA-256 in modo molto efficiente, mettendo in parallelo centinaia di blocchi di esecuzione SHA-256. La foto sotto mostra un chip di mining in grado di calcolare 2-3 miliardi di hash al secondo. Puoi vedere più foto su Zeptobars.


Colpo di silicio di un ASIC Bitfury che può estrarre bitcoin a 2-3 gigahash al secondo. Immagine da Zeptobars. (CC PER 3.0)

A differenza di bitcoin, Litecoin, Dogecoin e altri sistemi di monete alternative simili utilizzano l'algoritmo di hashing scrypt, che è intrinsecamente difficile da implementare nell'hardware. Questo algoritmo memorizza 1024 diversi valori hash in memoria durante l'esecuzione e li combina in uscita per ottenere il risultato finale. Pertanto, per calcolare gli hash scrypt sono necessari molta più memoria e circuiti rispetto agli hash SHA-256. L'impatto della modifica dell'algoritmo di hashing è chiaramente visibile quando si confronta l'hardware di mining corrispondente: le versioni scrypt (Litecoin e altre) sono migliaia di volte più lente delle versioni SHA-256 (Bitcoin).

Conclusione

SHA-256 è inaspettatamente così semplice che può anche essere calcolato a mano (l'algoritmo della curva ellittica utilizzato per firmare una transazione Bitcoin sarebbe molto più doloroso, poiché contiene un mucchio di moltiplicazioni di numeri a 32 byte). Per calcolare un round di SHA-256 ho impiegato 16 minuti e 45 secondi. Con questa performance, l'hashing dell'intero blocco bitcoin (128 round) richiederà 1,49 giorni, ovvero otteniamo un hash rate di 0,67 hash al giorno (infatti, ovviamente, con la pratica, il processo accelererebbe). In confronto, l'attuale generazione di minatori di bitcoin produce diversi terahash al secondo, che è circa un quintilione di volte più veloce di me. Penso che sia ovvio che il mining manuale di bitcoin non sia molto pratico.

Un lettore di reddit "ha chiesto informazioni sul mio dispendio energetico. Dal momento che non faccio alcuno sforzo fisico serio, possiamo supporre che il tasso metabolico sarà di 1500 chilocalorie al giorno, quindi scopriamo che l'hashing manuale richiede quasi 10 megajoule per hash. Tipico il consumo di energia per un minatore di ferro è 1000 MH/J. Quindi sono 10^16 volte meno efficiente dal punto di vista energetico di un pezzo di ferro specializzato (10 quadrilioni). Un altro problema è il costo dell'energia. Una fonte di energia economica sono le ciambelle a 23 centesimi per 200 kilocalorie. L'elettricità che ho costa 15 centesimi per kilowattora, che è 6,7 volte meno delle ciambelle.Di conseguenza, il costo dell'energia in termini di hashish per me, come minatore umano, è 67 quadrilioni di volte superiore. fortuna con l'estrazione manuale di bitcoin, e questo non tiene nemmeno conto del costo di carta e penne!