Italiano

Strumenti per sviluppatori · SHA calcolatore hash

SHA-256 Passo dopo passo: riempimento, pianificazione dei messaggi e 64 Turni

· Come funziona

sha-256 crittografia API del browser javascript

Diagramma che mostra il riempimento del messaggio, la divisione del blocco, il ciclo di elaborazione 64-round e la combinazione hash finale
Illustrazione vettoriale originale ToolAcre

SHA-256 riempie il tuo input, lo divide in blocchi da 512 bit ed esegue ciascuno di essi attraverso 64 cicli di mixaggio. Questo post spiega ogni fase in un linguaggio semplice senza richiedere conoscenze di crittografia.

Cosa succede realmente ai tuoi byte: la scatola nera che la maggior parte degli sviluppatori non apre mai

SHA-256 è un algoritmo deterministico che trasforma qualsiasi input in un'impronta digitale 256-bit (32-byte). Quella che dall’esterno sembra una scatola nera è in realtà una sequenza di passaggi ben definiti. Comprendere questi passaggi rimuove il mistero e consente di verificare la correttezza, tracciare bug e capire perché l'output è quello che è. Ogni parte dell'algoritmo è pubblica; la forza viene dal design, non dalla segretezza.

L'algoritmo opera su blocchi da 512bit. Se l'input è più breve, viene riempito. Se è più lungo, viene suddiviso in più blocchi, ciascuno elaborato in sequenza, con l'output di ciascun blocco inserito in quello successivo. Dopo che tutti i blocchi sono stati elaborati, hai otto numeri a 32 bit che, concatenati insieme, formano il digest finale a 256 bit.

Imbottitura: aggiunta di 1 bit, zeri e la lunghezza del messaggio di 64 bit per raggiungere un multiplo di 512 bits

La fase di riempimento è deterministica e formalizzata. Dopo il tuo input effettivo, aggiungi un singolo 1 bit (in pratica, il byte 0x80 se il tuo input termina su un limite di byte). Quindi aggiungi zero bit finché non sei 64 bits a meno di un multiplo di 512 bits. Infine, aggiungi una codifica big-endian 64-bit della lunghezza dell'input in bit. Questo riempimento garantisce che ogni messaggio sia un multiplo di 512 bits e codifica la lunghezza originale in modo che input identici di lunghezze diverse non possano produrre lo stesso digest.

Per l'input abc (3 bytes = 24 bits), il messaggio riempito è 512 bits (un blocco): i tre byte 61 62 63, seguiti da 0x80, seguiti da zero, seguiti da 64-bit codifica di 24 (che è 0x00...0x18 in un campo big-endian 64-bit). Il messaggio ora riempie esattamente un blocco di 512bit. Per una stringa vuota, il riempimento aggiunge 0x80, seguito da zero, seguito da 0x00...0x00 (che indica 0 bits di input). Per un input più lungo come un file 100-byte, il riempimento riempirebbe l'ultimo blocco fino a 512 bits e indicherebbe 800 bits della lunghezza originale.

I valori iniziali e le costanti sono fissati dall'algoritmo; la loro derivazione storica è al di fuori delle prove depositate

L'algoritmo inizia con otto variabili di lavoro 32 bit, inizializzate sulla prima 32 bits delle parti frazionarie delle radici quadrate dei primi otto numeri primi. Si tratta di costanti hardcoded, visibili in qualsiasi implementazione di riferimento e nel codice sorgente delle librerie crittografiche. Esistono perché l'uso di costanti fisse della matematica evita il sospetto di una backdoor nascosta. Lo strumento ToolAcre utilizza l'implementazione Web Crypto del browser, che applica queste stesse costanti.

L'algoritmo utilizza anche costanti rotonde 64, derivate dalla prima 32 bits delle parti frazionarie delle radici cubiche dei primi 64 numeri primi. Anche questi sono fissi e pubblici. Le costanti servono come materiale di miscelazione aggiuntivo; modificarli interromperebbe l'algoritmo e produrrebbe digest diversi.

La pianificazione dei messaggi: espansione delle parole 16 in 64 con spostamenti e rotazioni

La pianificazione dei messaggi espande le 16 parole (512 bits) in 64 parole (2048 bits) tramite una formula specifica. Per i round 0-15, le parole provengono direttamente dal blocco di input. Per i round 16-63, ogni nuova parola viene calcolata prendendo due parole precedenti (a offset specifici), applicando una rotazione e uno spostamento, eseguendo XOR in un'altra parola e memorizzando il risultato. La formula è deterministica e reversibile nel contesto di un blocco, ma l'espansione distribuisce l'influenza dell'input su tutti i round 64.

La formula di espansione utilizza le operazioni di rotazione a destra (uno spostamento circolare di bit in cui i bit che cadono da un'estremità riappaiono all'altra) e di spostamento a destra. La rotazione preserva tutti i bit ma ne modifica la posizione; lo spostamento a destra scarta i bit. La combinazione di rotazioni, spostamenti e operazioni XOR garantisce che ogni bit dell'input influenzi più parole nella pianificazione.

Un round: le funzioni Ch, Maj e Sigma descritte come operazioni di miscelazione di bit e come si aggiornano otto variabili di lavoro

Ciascuno dei cicli 64 elabora una parola della pianificazione del messaggio e aggiorna le otto variabili di lavoro. La funzione principale prevede sei operazioni: un mix condizionale (spesso chiamato Ch, per "scegliere") che seleziona i bit in base a una variabile di controllo, una funzione di maggioranza (Maj) che sceglie il valore più comune tra tre variabili, due funzioni di miscelazione speciali (Sigma_0 e Sigma_1) che ruotano e spostano le variabili di lavoro e il modulo di addizione 2^32. Tutta l'aritmetica viene eseguita su parole da 32bit, quindi l'overflow si avvolge.

La funzione "scegli" accetta tre ingressi 32 bit e, per ogni posizione di bit, seleziona il bit dal primo ingresso se un bit di controllo è 1, o il bit dal secondo ingresso se il bit di controllo è 0. La funzione di maggioranza esamina tre input e, per ciascuna posizione di bit, restituisce il valore di bit che appare più spesso tra i tre. Si tratta di operazioni non lineari che interrompono la linearità e garantiscono che piccoli cambiamenti di input si propaghino in modo imprevedibile attraverso lo stato.

Concatenare i blocchi e produrre l'output: aggiungendo il risultato di ciascun blocco allo stato in esecuzione

Ogni ciclo aggiorna tutte le otto variabili di lavoro ruotandole e incorporando un nuovo valore calcolato dalla costante del ciclo corrente, dalla parola di pianificazione del messaggio e dallo stato precedente. Le prime sette variabili di lavoro cambiano: l'ottava diventa la prima, la prima diventa la seconda e così via. Il nuovo ottavo viene calcolato dalle vecchie variabili utilizzando le funzioni di miscelazione. Dopo 64 round, hai otto nuovi valori di 32 bit. Questi vengono aggiunti (modulo 2^32) alle costanti iniziali, producendo lo stato hash finale per questo blocco.

Per un messaggio multiblocco, gli otto valori di un blocco diventano lo stato iniziale per il blocco successivo. La catena garantisce che una modifica in qualsiasi punto dell'input influisca su tutti i blocchi successivi. Quando raggiungi il blocco finale, ogni bit dell'input ha influenzato l'output finale.

Esempio funzionante e cosa non copre: tracciare il riempimento e il conteggio dei blocchi per un breve messaggio; le prove di sicurezza sono fuori portata

Per l'input abc, il messaggio rientra in un blocco da 512bit dopo il riempimento. L'imbottitura aggiunge 424 bits, per un totale di 512 bits. La pianificazione del messaggio lo espande in 64 parole. Ogni round consuma una parola e aggiorna le otto variabili di lavoro attraverso le funzioni di mixaggio. Dopo 64 round, lo stato viene sottoposto a XOR con le costanti iniziali, producendo il digest finale ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad.

Questo è un vettore di test pubblicato: lo stesso calcolo sullo stesso input produce sempre lo stesso output. Lo strumento ToolAcre esegue questo calcolo esatto tramite l'implementazione Web Crypto del browser. Puoi verificarlo eseguendo l'hashing abc e confrontando il risultato con il vettore noto. Qualsiasi browser che implementa correttamente Web Crypto produrrà lo stesso output; l'algoritmo non ammette scorciatoie o percorsi alternativi.

Conclusione: Web Crypto esegue un mix deterministico SHA-256 senza rivelare alcun segreto

L'algoritmo è pubblico e ogni passaggio è deterministico. Le funzioni di miscelazione (Ch, Maj, Sigma_0, Sigma_1) sono state scelte per essere non lineari, il che significa che la modifica di un bit di input non modifica in modo prevedibile un bit di output. L'espansione delle parole del messaggio 16 in 64 garantisce che l'intero input influenzi l'intero calcolo. I cicli 64 e il concatenamento dello stato indicano che l'output è sensibile a ogni bit dell'input e il repository utilizza l'output risultante come digest deterministico. La resistenza alle collisioni è una proprietà di sicurezza con limiti, non una promessa che la duplicazione degli output sia matematicamente impossibile.

Le prove crittografiche vanno oltre lo scopo di questo post. Il punto chiave è che ora sai cosa fa effettivamente l’algoritmo. Non è magia e non è una scatola nera. Se vuoi verificare che ToolAcre stia effettuando l'hashing correttamente, traccia il tuo input attraverso questi passaggi oppure utilizza un'implementazione di riferimento in un'altra lingua e confronta i risultati. L'implementazione del browser e qualsiasi riferimento corretto produrranno digest identici per input identici.