Come configurare smartphone e PC. Portale informativo
  • casa
  • Windows 7, XP
  • Le funzioni hash sono l'attività educativa e scientifica di anisimov vladimir viktorovich. Algoritmi di hashing dei dati

Le funzioni hash sono l'attività educativa e scientifica di anisimov vladimir viktorovich. Algoritmi di hashing dei dati

Annotazione: In questa lezione viene formulato il concetto di funzione hash, nonché una breve panoramica degli algoritmi per la generazione di funzioni hash. Inoltre, viene considerata la possibilità di utilizzare algoritmi di crittografia a blocchi per formare una funzione hash.

Lo scopo della lezione: familiarizzare con il concetto di "funzione hash", nonché con i principi di tali funzioni.

Concetto di funzione hash

Funzione hashè una funzione matematica o di altro tipo che, per una stringa di lunghezza arbitraria, calcola un valore intero o un'altra stringa di lunghezza fissa. Matematicamente si può scrivere così:

dove M è il messaggio originale, talvolta chiamato prototipo e h è il risultato chiamato valore hash (e anche codice hash o digerire i messaggi(dall'inglese. riassunto del messaggio)).

Il significato della funzione hash è determinare la caratteristica della preimmagine: il valore della funzione hash. Questo valore di solito ha una certa dimensione fissa, come 64 o 128 bit. Il codice hash può essere ulteriormente analizzato per risolvere qualsiasi problema. Quindi, ad esempio, l'hashing può essere utilizzato per confrontare i dati: se due array di dati hanno codici hash diversi, è garantito che gli array saranno diversi; se sono uguali, è molto probabile che gli array siano gli stessi. Nel caso generale, non esiste corrispondenza biunivoca tra i dati originali e il codice hash a causa del fatto che il numero di valori delle funzioni hash è sempre inferiore al numero di varianti dei dati di input. Pertanto, ci sono molti messaggi di input che danno gli stessi codici hash (tali situazioni sono chiamate collisioni). La probabilità di collisioni gioca un ruolo importante nella valutazione della qualità delle funzioni hash.

Le funzioni hash sono ampiamente utilizzate nella crittografia moderna.

La funzione hash più semplice può essere costruita utilizzando l'operazione "somma modulo 2" come segue: otteniamo la stringa di input, aggiungiamo tutti i byte modulo 2 e restituiamo il byte risultato come valore della funzione hash. La lunghezza del valore hash in questo caso sarà di 8 bit, indipendentemente dalla dimensione del messaggio di input.

Ad esempio, supponiamo che il messaggio digitalizzato originale fosse il seguente (in formato esadecimale):

Traduciamo il messaggio in forma binaria, scriviamo i byte uno sotto l'altro e aggiungiamo i bit in ogni colonna modulo 2:

0011 1110 0101 0100 1010 0000 0001 1111 1101 0100 ---------- 0110 0101

Il risultato (0110 0101 (2) o 65 (16)) sarà il valore della funzione hash.

Tuttavia, tale funzione di hash non può essere utilizzata per scopi crittografici, ad esempio per generare una firma elettronica, poiché è abbastanza facile modificare il contenuto di un messaggio firmato senza modificare il valore del checksum.

Pertanto, la funzione hash considerata non è adatta per applicazioni crittografiche. In crittografia, una funzione hash è considerata buona se è difficile creare due preimmagini con lo stesso valore hash e anche se l'output della funzione non dipende esplicitamente dall'input.

Formuliamo i requisiti di base per le funzioni hash crittografiche:

  • la funzione hash deve essere applicabile a messaggi di qualsiasi dimensione;
  • il calcolo del valore della funzione dovrebbe essere eseguito abbastanza rapidamente;
  • con un valore noto della funzione hash, dovrebbe essere difficile (quasi impossibile) trovare un'adeguata preimmagine di M;
  • con un messaggio M noto, dovrebbe essere difficile trovare un altro messaggio M' con lo stesso valore hash del messaggio originale;
  • dovrebbe essere difficile trovare una coppia di messaggi casuali diversi con lo stesso valore hash.

Creare una funzione hash che soddisfi tutti questi requisiti non è un compito facile. Va inoltre ricordato che i dati di dimensione arbitraria vengono ricevuti all'input della funzione e il risultato dell'hash non dovrebbe essere lo stesso per dati di dimensioni diverse.

Attualmente, in pratica, le funzioni vengono utilizzate come funzioni hash che elaborano blocco per blocco il messaggio di input e calcolano il valore hash h i per ogni blocco M i del messaggio di input in base alle dipendenze della forma

h io = H (M io, h io-1),

dove h i-1 è il risultato ottenuto calcolando la funzione hash per il precedente blocco di dati di input.

Di conseguenza, l'output della funzione hash h n è una funzione di tutti gli n blocchi del messaggio di input.

Utilizzo di algoritmi di crittografia a blocchi per generare una funzione hash

È possibile utilizzare una funzione hash di blocco come funzione hash. Se l'algoritmo di blocco utilizzato è crittograficamente sicuro, anche la funzione hash basata su di esso sarà affidabile.

Il modo più semplice per utilizzare l'algoritmo di blocco per ottenere un codice hash è crittografare il messaggio in modalità CBC. In questo caso, il messaggio viene presentato come una sequenza di blocchi, la cui lunghezza è pari alla lunghezza del blocco dell'algoritmo di crittografia. Se necessario, l'ultimo blocco viene riempito a destra con degli zeri per ottenere un blocco della lunghezza desiderata. Il valore hash sarà l'ultimo blocco di testo crittografato. A condizione che venga utilizzato un algoritmo di crittografia a blocchi affidabile, il valore hash risultante avrà le seguenti proprietà:

  • è praticamente impossibile senza la conoscenza della chiave di crittografia calcolare il valore hash per una data matrice aperta di informazioni;
  • è praticamente impossibile selezionare i dati aperti per un dato valore della funzione hash senza conoscere la chiave di crittografia.

Il valore hash formato in questo modo viene solitamente chiamato inserto imitazione o autenticatore e viene utilizzato per verificare l'integrità del messaggio. Pertanto, la rappresentazione dell'inserimento è una combinazione di controllo che dipende dai dati aperti e dalle informazioni sulla chiave segreta. Lo scopo dell'utilizzo di un inserto simulato è rilevare tutte le modifiche accidentali o intenzionali nell'array di informazioni. Il valore ottenuto dalla funzione hash durante l'elaborazione di un messaggio di input viene aggiunto al messaggio quando è noto che il messaggio è corretto. Il destinatario verifica l'integrità del messaggio calcolando la rappresentazione del messaggio ricevuto e confrontandolo con il codice hash ricevuto, che deve essere trasmesso in modo sicuro. Uno di questi metodi sicuri può essere la crittografia della rappresentazione con la chiave privata del mittente, ad es. creazione di una firma. È anche possibile crittografare il codice hash ricevuto con un algoritmo di crittografia simmetrica se il mittente e il destinatario hanno una chiave di crittografia simmetrica comune.

Il processo specificato per ottenere e utilizzare un inserto simulato è descritto nello standard nazionale GOST 28147-89. Lo standard propone di utilizzare i 32 bit meno significativi del blocco ricevuto all'uscita dell'operazione di cifratura dell'intero messaggio nella modalità di concatenazione di blocchi cifrati per controllare l'integrità del messaggio trasmesso. Allo stesso modo, qualsiasi blocco può essere utilizzato per formare un inserto imitativo. algoritmo di crittografia simmetrica.

Un altro modo possibile per utilizzare un cifrario a blocchi per generare un codice hash è il seguente. Il messaggio originale viene elaborato in sequenza in blocchi. L'ultimo blocco viene riempito con zeri, se necessario, a volte la lunghezza del messaggio viene aggiunta all'ultimo blocco come numero binario. In ogni fase, criptiamo il valore hash ottenuto nella fase precedente, prendendo come chiave il blocco di messaggio corrente. L'ultimo valore crittografato ricevuto sarà il risultato finale dell'hash.

In effetti, ci sono molti altri possibili schemi per usare un cifrario a blocchi per formare una funzione di hash. Sia М i - il blocco del messaggio originale, hi - il valore della funzione hash allo stadio i-esimo, f - l'algoritmo di crittografia a blocchi utilizzato nella modalità di sostituzione semplice, - l'operazione di addizione modulo 2. Quindi, per esempio, sono possibili i seguenti schemi per la generazione della funzione hash:

In tutti questi schemi, la lunghezza del valore hash generato è uguale alla lunghezza del blocco crittografato. Tutti questi, così come alcuni altri schemi per l'utilizzo dell'algoritmo di crittografia a blocchi per calcolare i valori hash, possono essere applicati in pratica.

Il principale svantaggio delle funzioni hash progettate sulla base di algoritmi a blocchi è la velocità di funzionamento relativamente bassa. La forza crittografica richiesta può essere ottenuta in un numero inferiore di operazioni sui dati di input. Esistono algoritmi di hashing più veloci, progettati in modo indipendente, da zero, in base ai requisiti di forza crittografica (i più comuni sono MD5, SHA-1, SHA-2 e GOST R 34.11-94).

Eccetera.). La scelta di una particolare funzione hash è determinata dalle specificità del problema da risolvere. Gli esempi più semplici di funzioni hash sono il checksum o CRC.

Nel caso generale, non c'è corrispondenza biunivoca tra i dati originali e il codice hash. Pertanto, ci sono molti array di dati che forniscono gli stessi codici hash, le cosiddette collisioni. La probabilità di collisioni gioca un ruolo importante nella valutazione della "qualità" delle funzioni hash.

checksum

Semplice, estremamente veloce e facilmente implementabile negli algoritmi hardware utilizzati per proteggere da distorsioni involontarie, inclusi errori hardware.

In termini di velocità di calcolo, è decine e centinaia di volte più veloce delle funzioni hash crittografiche e molto più semplice nell'implementazione hardware.

Il pagamento per una velocità così elevata è la mancanza di forza crittografica: una facile opportunità per adattare un messaggio a un importo predeterminato. Inoltre, di solito il bit dei checksum (numero tipico: 32 bit) è inferiore agli hash crittografici (numeri tipici: 128, 160 e 256 bit), il che significa la possibilità di collisioni indesiderate.

Il caso più semplice di un tale algoritmo è dividere un messaggio in parole a 32 o 16 bit e sommarle, che viene utilizzato, ad esempio, in TCP / IP.

In genere, tale algoritmo è necessario per tenere traccia di errori hardware tipici, come diversi bit di errore consecutivi fino a una determinata lunghezza. La cosiddetta famiglia di algoritmi. I "codici di ridondanza ciclica" soddisfano questi requisiti. Questi includono, ad esempio, il CRC32 utilizzato nell'hardware ZIP.

Funzioni di hash crittografico

Tra le molte funzioni hash esistenti, è consuetudine distinguere quelle crittograficamente forti utilizzate nella crittografia. Una funzione hash crittograficamente forte deve prima di tutto avere resistenza alla collisione di due tipi:

Usando l'hashing

Le funzioni hash vengono utilizzate anche in alcune strutture dati come le tabelle hash e gli alberi cartesiani. I requisiti per la funzione hash in questo caso sono diversi:

  • buon mix di dati
  • algoritmo di calcolo veloce

Riconciliazione dei dati

In generale, questa applicazione può essere descritta come il controllo di alcune informazioni per identificare l'originale, senza utilizzare l'originale. Per la verifica viene utilizzato il valore hash delle informazioni da verificare. Ci sono due direzioni principali di questa applicazione:

Controllo degli errori

Ad esempio, il checksum può essere trasmesso sul canale di comunicazione insieme al testo principale. Alla fine della ricezione, il checksum può essere ricalcolato e confrontato con il valore trasmesso. Se viene rilevata una discrepanza, significa che si è verificata una distorsione durante la trasmissione ed è possibile richiedere un nuovo tentativo.

In questo caso, un analogo domestico dell'hashing può essere una tecnica quando, durante lo spostamento, il numero di bagagli viene mantenuto in memoria. Quindi, per controllare, non è necessario ricordare ogni valigia, ma è sufficiente contarle. Una partita significherà che nessuna valigia è stata persa. Cioè, il numero di bagagli è il suo codice hash.

Controllo della passphrase

Nella maggior parte dei casi, le passphrase non vengono archiviate sugli oggetti di destinazione, vengono archiviati solo i loro valori hash. Non è pratico memorizzare le passphrase, poiché in caso di accesso non autorizzato a un file con frasi, l'attaccante scoprirà tutte le passphrase e sarà in grado di utilizzarle immediatamente e, durante l'archiviazione dei valori hash, conoscerà solo i valori hash ​​non reversibili nei dati originali, in questo caso, in passphrase. Durante la procedura di autenticazione viene calcolato il valore hash della passphrase inserita e confrontato con quello memorizzato.

Un esempio in questo caso è il sistema operativo GNU/Linux e Microsoft Windows XP. Memorizzano solo i valori hash delle passphrase dagli account utente.

Velocizzare il recupero dei dati

Ad esempio, quando si scrivono campi di testo nel database, è possibile calcolare il loro codice hash e inserire i dati nella sezione corrispondente a questo codice hash. Quindi, durante la ricerca dei dati, dovrai prima calcolare il codice hash del testo e si saprà immediatamente in quale sezione è necessario cercarli, ovvero non dovrai cercare nell'intero database, ma solo in una delle sue sezioni (questo velocizza notevolmente la ricerca).

L'analogo quotidiano dell'hashing in questo caso può essere il posizionamento delle parole nel dizionario in ordine alfabetico. La prima lettera di una parola è il suo codice hash e, durante la ricerca, non esaminiamo l'intero dizionario, ma solo la lettera richiesta.

Elenco algoritmi

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tigre (Whirlpool
  • Checksum Internet IP (RFC 1071)

Link

Fondazione Wikimedia. 2010.

  • Hashan Moheyan
  • Codice hash

Guarda cos'è una "funzione hash" in altri dizionari:

    Funzione hash- una funzione che esegue l'hashing di una matrice di dati mappando i valori da un insieme di valori (molto) ampio a un insieme di valori (significativamente) più piccolo. In inglese: Funzione hash Vedi anche: Cryptographic Algorithms Financial ... ... Vocabolario finanziario

    funzione di hash crittografico- Una funzione che converte il testo di lunghezza arbitraria in testo di lunghezza fissa (nella maggior parte dei casi più corta). L'applicazione principale della funzione hash si trova nello schema della firma digitale. Poiché la funzione di hash viene calcolata più velocemente di una firma digitale, invece di ... ...

    Funzione hash unidirezionale- funzione hash, che è una funzione computazionalmente irreversibile. In inglese: Funzione hash one way Vedi anche: Cryptographic Algorithms Financial Dictionary Finam ... Vocabolario finanziario

    TIGER - funzione hash- Funzione hash TIGER, sviluppata da Ros Anderson ed Eli Biham nel 1996. La funzione hash TIGER è una nuova funzione hash veloce progettata per essere molto veloce sui computer moderni, in particolare sui computer a 64 bit. TIGRE ... ... Wikipedia

    funzione hash unidirezionale- Per una funzione unidirezionale, è computazionalmente impossibile trovare due argomenti diversi per i quali i suoi valori sono gli stessi. [] Argomenti sicurezza delle informazioni IT funzione hash unidirezionale ... Guida tecnica per traduttori

    Tiger (funzione hash)- Funzione di hash Tiger, sviluppata da Ros Anderson ed Eli Biham nel 1995. Tiger è stato progettato per funzionare particolarmente velocemente su computer a 64 bit. Tiger non ha restrizioni sui brevetti, può essere utilizzato liberamente come con ... ... Wikipedia

    funzione di hashing- funzione hash 1. Una funzione che controlla il processo di immissione dei dati in una tabella hash, definendo (indirizzi delle celle libere. 2. Una funzione che rappresenta la mappatura di un frammento di un messaggio aperto in una stringa crittografata di lunghezza fissa. In . .. ... Guida tecnica per traduttori

    Tabella hash- In programmazione, una tabella hash è una struttura dati che implementa l'interfaccia di un array associativo, ovvero consente di memorizzare coppie (chiave, valore) ed eseguire tre operazioni: l'operazione di aggiunta di una nuova coppia, un'operazione di ricerca e un'operazione di cancellazione ... Wikipedia

    Codice hash- Hashing (a volte hashing) che converte un array di dati di input di lunghezza arbitraria in una stringa di bit di output di lunghezza fissa. Tali trasformazioni sono anche chiamate funzioni di hash o funzioni di piegatura e i loro risultati ... ... Wikipedia

    Collisione della funzione hash- La collisione della funzione hash H è costituita da due diversi blocchi di dati di input xey tali che H (x) = H (y). Le collisioni esistono per la maggior parte delle funzioni hash, ma per le funzioni hash "buone" la frequenza della loro occorrenza è vicina al minimo teorico. In ... ... Wikipedia

o La funzione hash è funzione, trasforma i dati di input di qualsiasi dimensione (di solito grande) in dati di dimensione fissa. Hashing(A volte G yeshuvannya, ing. Hashing)- conversione di un array di dati di input di lunghezza arbitraria in una stringa di bit di output di lunghezza fissa. Tali trasformazioni sono anche chiamate funzioni hash o funzioni di convoluzione, e i loro risultati sono chiamati hash, codice hash, somma di hash, o digerire i messaggi(ing. Riassunto del messaggio).

La funzione hash è utilizzata in particolare nelle strutture dati - tabelle hash, è ampiamente utilizzata nei software per il recupero veloce dei dati. Le funzioni hash vengono utilizzate per ottimizzare tabelle e database avendo gli stessi valori hash negli stessi record. Questo approccio alla ricerca di duplicati è efficace nei file di grandi dimensioni. Un esempio di questa scoperta di siti simili nelle sequenze di DNA. Una funzione hash crittografica rende facile verificare che alcuni input siano abbinati a un determinato valore hash, ma se l'input è sconosciuto è deliberatamente difficile ricostruire il valore input (o un'alternativa equivalente) conoscendo il valore hash memorizzato. Questo viene utilizzato per garantire l'integrità dei dati trasmessi ed è l'elemento costitutivo degli HMAC, che forniscono l'autenticazione dei messaggi.

Le funzioni hash sono associate (e sono spesso confuse) con somme, cifre di controllo, impronte digitali, randomizzazione delle funzioni, codici, correzione degli errori e cifre. Sebbene questi concetti si sovrappongano in una certa misura, ognuno ha il proprio ambito e requisiti ed è progettato e ottimizzato in modi diversi.

Storia

Donald Knuth attribuisce la prima idea sistematica di hashing al dipendente IBM Hans Peter Lohn, che propose l'hash nel gennaio 1953.

Nel 1956, Arnold Dumy, nel suo Computers and Automation, fu il primo a introdurre il concetto di hashing come lo conosce oggi la maggior parte dei programmatori. Duma considerò l'hashing come una soluzione al "problema del dizionario" e suggerì anche di utilizzare il resto della divisione per un numero primo come indirizzo hash.

Il primo lavoro significativo relativo alla ricerca di file di grandi dimensioni è stato l'articolo di Wesley Peterson in IBM Journal of Research and Development 1957 in cui ha definito l'indirizzamento aperto e ha anche sottolineato il degrado delle prestazioni quando viene eliminato. Sei anni dopo, fu pubblicato il lavoro di Werner Buchholz, che esplorava ampiamente le funzioni di hash. Negli anni successivi, l'hashing è stato ampiamente utilizzato, ma non è stato pubblicato alcun lavoro significativo.

Nel 1967, l'hashing in senso moderno è menzionato nel libro Principles of Digital Computing di Herbert Hellerman. Nel 1968, Robert Morris pubblicò in Comunicazioni dell'ACM ottima panoramica sull'hashing. Questo lavoro è considerato una pubblicazione che introduce il concetto di hashing nella circolazione scientifica e consolida infine il termine "hash" tra gli specialisti.

All'inizio degli anni '90, l'equivalente del termine "hashing", grazie ai lavori di Andrey Ershov, era la parola "costellazione" nell'edizione in lingua russa del libro di Niklaus Wirth "Algorithms and Data Structures" (1989) questo termine è utilizzato.) Tuttavia, nessuna di queste opzioni ha preso piede e in letteratura viene utilizzato principalmente il termine "hashing".

Descrizione

L'hashing viene utilizzato per costruire array associativi, cercare duplicati in serie di set di dati, creare identificatori univoci per set di dati, checksum per identificare errori accidentali o intenzionali durante l'archiviazione o la trasmissione, per memorizzare le password nei sistemi di sicurezza (in questo caso, l'accesso al area di memoria " la memoria, dove si trovano le password, non consente il recupero della password stessa), quando si genera una firma elettronica (in pratica, spesso non è il messaggio stesso ad essere firmato, ma la sua immagine hash).

Nel caso generale, non c'è corrispondenza biunivoca tra i dati originali e il codice hash a causa del fatto che il numero di valori delle funzioni hash è inferiore al numero di varianti di valori dell'input Vettore. Esistono molti array con contenuti diversi, ma forniscono gli stessi codici hash, le cosiddette collisioni. La probabilità di collisioni gioca un ruolo importante nella valutazione della qualità delle funzioni hash.

Esistono molti algoritmi di hashing con proprietà diverse (profondità di bit, complessità computazionale, forza crittografica, ecc.). La scelta di una particolare funzione hash è determinata dalle specificità del problema da risolvere. Gli esempi più semplici di funzioni hash sono il checksum o CRC.

Tipi di funzioni hash

Una buona funzione di hash deve soddisfare due proprietà:

  • Calcola rapidamente;
  • Riduci al minimo il numero di collisioni

Diciamo, per chiarezza, il numero di chiavi e la funzione hash non ha altro che valori diversi:

Un esempio di una funzione hash "cattiva" è la funzione c, che abbina un numero naturale di dieci cifre a tre cifre, selezionate al centro del quadrato di venti cifre del numero. Sembrerebbe che il valore dei codici hash debba essere distribuito uniformemente tra "000" e "999", ma per i dati reali questo metodo è adatto solo se le chiavi non hanno un numero elevato di zeri a sinistra oa destra.

Tuttavia, ci sono molti altri metodi semplici e affidabili su cui si basano molte funzioni di hash.

Funzioni hash basate su divisioni

Il primo metodo è quello che usiamo come hash: il resto della divisione per, dove è il numero di tutti gli hash possibili:

Allo stesso tempo, è ovvio che con una coppia, la modalità di risparmio è abbinata, con una coppia. E dispari - con dispari, che può portare a uno spostamento significativo dei dati nei file. Inoltre, non dovresti usare il sistema numerico del computer come base, poiché l'hash dipenderà solo da poche cifre del numero situato a destra, il che porterà a molte collisioni. In pratica, di solito viene scelto quello semplice: nella maggior parte dei casi questa scelta è abbastanza soddisfacente.

Va anche detto del metodo di hashing, che si basa sulla divisione per log modulo due. In questo metodo, deve anche essere una potenza di due e le chiavi binarie () hanno la forma di polinomi. In questo caso, come codice hash vengono presi i valori dei coefficienti del polinomio ottenuti come resto della divisione per un grado polinomiale prescelto:

Con la giusta scelta, questo metodo garantisce che non ci siano collisioni tra chiavi quasi identiche.

Schema di hashing moltiplicativo

Il secondo metodo consiste nello scegliere una costante intera, relativamente semplice con, dove è il numero di possibili varianti di valori sotto forma di una parola di computer (nei computer IBM PC). Quindi possiamo prendere una funzione hash della forma:

In questo caso, su un computer con un sistema di numeri binari, è una potenza di due e consiste dei bit più significativi della metà destra del prodotto.

Tra i vantaggi di questi due metodi, vale la pena notare che sfruttano il fatto che le chiavi reali non sono casuali. Ad esempio, se le chiavi rappresentano una progressione aritmetica (diciamo la sequenza dei nomi "nome1", "nome2", "nome3"). Il metodo moltiplicativo mostrerà una progressione aritmetica in una progressione aritmetica approssimativa di vari valori hash, riducendo il numero di collisioni rispetto a una situazione casuale.

Una delle varianti di questo metodo è l'hashing di Fibonacci, basato sulle proprietà del rapporto aureo. Qui l'intero più vicino a, coprimi con

Hashing di stringhe a lunghezza variabile

I metodi sopra descritti vengono utilizzati anche quando dobbiamo considerare chiavi composte da più parole o chiavi di lunghezza variabile. Ad esempio, puoi combinare le parole in una utilizzando l'aggiunta modulo o l'aggiunta modulo 2. Uno degli algoritmi che funziona su questo principio è la funzione hash di Pearson.

L'hashing di Pearson è un algoritmo proposto da Peter Pearson. Peter Pearson) per processori con registri a 8 bit, il cui compito è calcolare rapidamente il codice hash per una stringa di lunghezza arbitraria. Come input, la funzione riceve una parola composta da caratteri, ciascuna delle dimensioni di 1 byte, e restituisce un valore nell'intervallo da 0 a 255. Il valore del codice hash dipende da ciascun carattere della parola di input.

L'algoritmo può essere descritto dal seguente pseudocodice, che accetta una stringa come input e utilizza una tabella di permutazione

h: = 0 Per ciascuno C in W ciclo continuo indice: = h xor ch: = T Fine ciclo Ritorno h

Tra i vantaggi dell'algoritmo, va notato:

  • facilità di calcolo;
  • non ci sono dati di input per i quali la probabilità di collisione è la più alta;
  • la possibilità di modifica in una funzione di hash ideale.

Come modo alternativo di hash delle chiavi costituite da simboli (), si possono proporre i calcoli

Utilizzo delle funzioni hash

Le funzioni hash sono ampiamente utilizzate nella crittografia e in molte strutture dati come tabelle hash, filtri Bloom e alberi cartesiani.

Funzioni di hash crittografico

Tra le molte funzioni hash esistenti, è consuetudine distinguere quelle crittograficamente forti utilizzate nella crittografia, poiché su di esse vengono imposti requisiti aggiuntivi. Perché una funzione hash sia considerata crittograficamente sicura, deve soddisfare tre requisiti di base su cui si basa la maggior parte degli usi delle funzioni hash nella crittografia:

  • Irreversibilità: per un dato valore hash m deve essere computazionalmente impossibile trovare il blocco di dati per il quale.
  • Sostenibilità collisioni del primo tipo: per un dato messaggio m deve essere computazionalmente impossibile prenderne un altro Messaggio N per cui.
  • Sostenibilità a collisioni secondo tipo: deve essere computazionalmente impossibile trovare una coppia di messaggi che hanno lo stesso hash.

Questi requisiti dipendono l'uno dall'altro:

  • La funzione inversa non è resistente alle collisioni del primo e del secondo tipo.
  • Funzione non resistente agli urti del primo tipo, non resistente agli urti del secondo tipo; non è vero il contrario.

Da notare che non è stata dimostrata l'esistenza di funzioni hash irreversibili, per le quali è teoricamente impossibile calcolare una qualsiasi preimmagine di un dato valore hash. Di solito, trovare il reciproco è solo un compito computazionalmente difficile.

L'attacco di compleanno ti consente di trovare collisioni per una funzione hash con valori di lunghezza n bit in media per il calcolo approssimativo dell'hash. Così n - una funzione di hash bit è considerata criptica se la complessità computazionale di trovare collisioni per essa è vicina a.

Per le funzioni hash crittografiche, è anche importante che al minimo cambiamento nell'argomento, il valore della funzione cambi notevolmente (effetto valanga). In particolare, il valore hash non dovrebbe perdere informazioni, nemmeno sui singoli bit dell'argomento. Questo requisito è la chiave per la forza crittografica degli algoritmi di hashing che eseguono l'hashing della password dell'utente per ottenere la chiave.

L'hashing viene spesso utilizzato negli algoritmi di firma digitale, in cui non il messaggio stesso è crittografato, ma il suo hash, che riduce il tempo di calcolo e aumenta anche la forza crittografica. Inoltre, nella maggior parte dei casi, invece delle password, vengono memorizzati i valori dei loro codici hash.

Hashing geometrico

Hashing geometrico (ing. Hashing geometrico)- un metodo ampiamente utilizzato in computer grafica e geometria computazionale per risolvere problemi su un piano o nello spazio tridimensionale, ad esempio per trovare le coppie più vicine in un insieme di punti o per cercare immagini identiche. La funzione hash in questo metodo di solito prende uno spazio metrico come input e lo divide, creando una griglia di celle. La tabella in questo caso è un array con due o più indici ed è chiamata file grid (eng. File griglia). L'hashing geometrico viene utilizzato anche nelle telecomunicazioni quando si tratta di segnali multidimensionali.

Velocizzare il recupero dei dati

Una tabella hash è una struttura dati che permette di memorizzare coppie di form (chiave, codice hash) e supporta operazioni di ricerca, inserimento ed eliminazione di elementi. Il compito delle tabelle hash è quello di velocizzare le ricerche, ad esempio, nel caso di record nei campi di testo del database, è possibile calcolare il loro codice hash e inserire i dati nella sezione corrispondente a questo codice hash. Quindi, durante la ricerca dei dati, sarà necessario prima calcolare l'hash del testo e si saprà immediatamente in quale sezione è necessario cercare, cioè non sarà necessario cercare nell'intero database, ma solo una delle sue sezioni (questo velocizza notevolmente la ricerca).

L'analogo quotidiano dell'hashing in questo caso può essere il posizionamento delle parole nel dizionario in ordine alfabetico. La prima lettera di una parola è il suo codice hash e, durante la ricerca, non esaminiamo l'intero dizionario, ma solo la lettera richiesta.

Gli algoritmi di hashing delle stringhe possono aiutarti a risolvere molti problemi. Ma hanno un grosso svantaggio: molto spesso non sono al 100%, poiché ci sono molte stringhe i cui hash corrispondono. Un'altra cosa è che nella maggior parte delle attività puoi ignorarlo, poiché la probabilità che gli hash coincidano è ancora molto piccola.

Definizione e calcolo dell'hash

Uno dei modi migliori per determinare la funzione hash dalla stringa S è il seguente:

H (S) = S + S * P + S * P ^ 2 + S * P ^ 3 + ... + S [N] * P ^ N

dove P è un numero.

È ragionevole scegliere un numero primo per P, approssimativamente uguale al numero di caratteri nell'alfabeto di input. Ad esempio, se si suppone che le stringhe siano composte solo da lettere latine minuscole, allora è una buona scelta P = 31. Se le lettere possono essere sia maiuscole che minuscole, allora, ad esempio, puoi P = 53.

Tutti i pezzi di codice in questo articolo utilizzeranno P = 31.

È preferibile memorizzare il valore hash stesso nel tipo numerico più grande: int64, noto anche come long long. Ovviamente, con una lunghezza di stringa di circa 20 caratteri, si verificherà già un overflow di valore. Il punto chiave è che non prestiamo attenzione a questi overflow, come se prendessimo l'hash modulo 2^64.

Un esempio di calcolo di un hash se sono consentite solo lettere latine minuscole:

Const int p = 31; hash lungo lungo = 0, p_pow = 1; for (size_t i = 0; i

Nella maggior parte dei problemi, ha senso calcolare prima tutte le potenze richieste di P in qualche array.

Attività di esempio. Cerca stringhe duplicate

Siamo già in grado di risolvere efficacemente questo problema. Ti viene fornito un elenco di stringhe S, ciascuna di non più di M caratteri di lunghezza. Supponiamo che tu voglia trovare tutte le righe duplicate e dividerle in gruppi in modo che ogni gruppo contenga solo le stesse righe.

Con il normale ordinamento delle stringhe, otterremmo un algoritmo con complessità O (N M log N), mentre usando gli hash otterremmo O (N M + N log N).

Algoritmo. Calcoliamo l'hash di ogni riga e ordiniamo le righe in base a questo hash.

Vettore s (n); // ... leggendo le stringhe... // conta tutte le potenze di p, diciamo, fino a 10000 - la lunghezza massima delle stringhe const int p = 31; vettore p_pow (10000); p_pow = 1; for (size_t i = 1; i > hash (n); per (int i = 0; i

Hash della sottostringa e il suo calcolo veloce

Supponiamo di avere una stringa S e dati gli indici I e J. Vuoi trovare l'hash dalla sottostringa S.

Per definizione abbiamo:

H = S [I] + S * P + S * P ^ 2 + ... + S [J] * P ^ (J-I)

H * P [I] = S [I] * P [I] + ... + S [J] * P [J], H * P [I] = H - H

Questa proprietà è molto importante.

Si scopre infatti che, conoscendo solo gli hash di tutti i prefissi della stringa S, possiamo ottenere l'hash di qualsiasi sottostringa in O (1).

L'unico problema che sorge è che devi essere in grado di dividere per P [I]. In effetti, non è così facile. Poiché stiamo calcolando l'hash modulo 2 ^ 64, allora per dividere per P [I] dobbiamo trovare il suo inverso nel campo (ad esempio, usando l'algoritmo di Euclide esteso) ed eseguire la moltiplicazione per questo inverso.

Tuttavia, c'è un modo più semplice. Nella maggior parte dei casi, invece di dividere gli hash per le potenze di P, puoi, al contrario, moltiplicarli per queste potenze.

Supponiamo di avere due hash: uno moltiplicato per P [I] e l'altro moltiplicato per P [J]. Se io< J, то умножим перый хэш на P, иначе же умножим второй хэш на P. Теперь мы привели хэши к одной степени, и можем их спокойно сравнивать.

Ad esempio, il codice che calcola gli hash di tutti i prefissi e quindi confronta due sottostringhe in O (1):

Stringhe; int i1, i2, len; // input data // conta tutte le potenze di p const int p = 31; vettore i2 && h1 == h2 * p_pow) cout<< "equal"; else cout << "different";

Usando l'hashing

Alcuni usi tipici dell'hashing includono:

  • Determinazione del numero di sottostringhe distinte in O (N ^ 2 log N) (vedi sotto)
  • Determinazione del numero di palindromi all'interno di una stringa

Determinazione del numero di sottostringhe distinte

Sia data una stringa S di lunghezza N, composta solo da minuscole lettere latine. Vuoi trovare il numero di sottostringhe distinte in questa stringa.

Per risolvere, iteriamo sulla lunghezza della sottostringa a sua volta: L = 1 .. N.

Per ogni L, costruiremo un array di hash di sottostringhe di lunghezza L, ridurremo gli hash di un grado e ordineremo questo array. Il numero di elementi diversi in questo array viene aggiunto alla risposta.

Implementazione:

Stringhe; // stringa di input int n = (int) s.length (); // conta tutte le potenze di p const int p = 31; vettore p_pow (s.length ()); p_pow = 1; for (size_t i = 1; i H (s.lunghezza ()); for (size_t i = 0; i hs (n-1 + 1); per (int i = 0; i

Le funzioni hash sono utilizzate in un'ampia varietà di settori della tecnologia dell'informazione. Hanno lo scopo, da un lato, di semplificare notevolmente lo scambio di dati tra utenti e il trattamento dei file utilizzati per vari scopi, dall'altro, di ottimizzare gli algoritmi per garantire il controllo degli accessi alle risorse corrispondenti. La funzione hash è uno degli strumenti chiave per garantire la protezione tramite password dei dati, oltre a organizzare lo scambio di documenti firmati tramite EDS. Esistono numerosi standard in base ai quali è possibile eseguire la memorizzazione nella cache dei file. Molti di questi sono stati sviluppati da specialisti russi. In quali gusti possono entrare le funzioni di hash? Quali sono i principali meccanismi per la loro applicazione pratica?

Cos'è?

Per prima cosa, esploriamo il concetto di funzione hash. Questo termine è generalmente inteso come un algoritmo per convertire una certa quantità di informazioni in una sequenza più breve di caratteri utilizzando metodi matematici. L'importanza pratica della funzione hash può essere ricondotta a un'ampia varietà di aree. Pertanto, possono essere utilizzati durante il controllo dell'integrità di file e programmi. Inoltre, le funzioni hash crittografiche vengono utilizzate negli algoritmi di crittografia.

Specifiche

Consideriamo le caratteristiche chiave degli algoritmi in studio. Fra quelli:

  • la presenza di algoritmi interni per convertire i dati della lunghezza originale in una sequenza di caratteri più corta;
  • apertura alla verifica crittografica;
  • la presenza di algoritmi che consentono di crittografare in modo affidabile i dati originali;
  • adattabilità alla decrittazione quando si utilizza una potenza di calcolo ridotta.

Altre importanti proprietà della funzione hash includono:

  • la capacità di elaborare array di dati iniziali di lunghezza arbitraria;
  • generare blocchi hash di lunghezza fissa;
  • distribuire uniformemente i valori della funzione in uscita.

Gli algoritmi considerati assumono anche una sensibilità ai dati in ingresso a livello di 1 bit. Cioè, anche se, relativamente parlando, cambia almeno 1 lettera nel documento originale, la funzione di hash avrà un aspetto diverso.

Requisiti di hash

Esistono numerosi requisiti per le funzioni hash progettate per l'uso pratico in un'area particolare. Innanzitutto, l'algoritmo corrispondente deve essere sensibile ai cambiamenti nella struttura interna dei documenti con hash. Cioè, la funzione hash dovrebbe essere riconosciuta, quando si tratta di un file di testo, permutazione di paragrafo, sillabazione. Da un lato, il contenuto del documento non cambia, dall'altro la sua struttura viene adattata e questo processo deve essere riconosciuto durante l'hashing. In secondo luogo, l'algoritmo considerato deve trasformare i dati in modo che l'operazione inversa (conversione dell'hash nel documento originale) sia praticamente impossibile. In terzo luogo, la funzione hash dovrebbe presupporre l'utilizzo di algoritmi che escludano praticamente la probabilità della formazione della stessa sequenza di caratteri sotto forma di hash, ovvero la comparsa delle cosiddette collisioni. Considereremo la loro essenza un po 'più tardi.

I requisiti indicati che l'algoritmo della funzione hash deve soddisfare possono essere soddisfatti principalmente attraverso l'uso di approcci matematici complessi.

Struttura

Esaminiamo quale può essere la struttura delle funzioni in esame. Come abbiamo notato sopra, tra i principali requisiti per gli algoritmi in esame c'è la fornitura di crittografia unidirezionale. Una persona che ha solo un hash a sua disposizione non dovrebbe praticamente essere in grado di ottenere il documento originale da esso.

In quale struttura può essere rappresentata una funzione hash utilizzata per tali scopi? Un esempio della sua compilazione può essere il seguente: H (hash, cioè hash) = f (T (testo), H1), dove H1 è un algoritmo di elaborazione del testo T. Questa funzione hash T in modo tale che senza saperlo H1, aprirlo come un vero e proprio file sarà quasi impossibile.

Utilizzo delle funzioni hash in pratica: download di file

Studiamo ora più in dettaglio le opzioni per l'utilizzo pratico delle funzioni hash. L'uso di algoritmi appropriati può essere utilizzato durante la scrittura di script per il download di file da server Internet.

Nella maggior parte dei casi, viene determinato un determinato checksum per ogni file: questo è l'hash. Deve essere lo stesso per l'oggetto situato sul server e scaricato sul computer dell'utente. In caso contrario, il file potrebbe non aprirsi o potrebbe non avviarsi correttamente.

Funzione hash e firma digitale

L'utilizzo delle funzioni hash è molto diffuso nell'organizzazione dello scambio di documenti contenenti una firma digitale. In questo caso, il file da firmare viene sottoposto ad hashing in modo che il destinatario possa verificarne l'autenticità. Sebbene la funzione hash non faccia formalmente parte della struttura della chiave elettronica, può essere catturata nella memoria flash dell'hardware con cui vengono firmati i documenti, come, ad esempio, eToken.

Una firma elettronica è la crittografia di un file utilizzando chiavi pubbliche e private. Cioè, un messaggio crittografato con una chiave privata viene allegato al file originale e l'EDS viene verificato utilizzando una chiave pubblica. Se la funzione hash di entrambi i documenti è la stessa, il file in possesso del destinatario viene riconosciuto come autentico e la firma del mittente viene riconosciuta come corretta.

L'hashing, come abbiamo notato sopra, non è direttamente un componente di un EDS, tuttavia consente di ottimizzare in modo molto efficace gli algoritmi per l'utilizzo di una firma elettronica. Quindi, in effetti, solo l'hash può essere crittografato e non il documento stesso. Di conseguenza, la velocità di elaborazione dei file aumenta in modo significativo, allo stesso tempo diventa possibile fornire meccanismi più efficaci per proteggere la firma digitale, poiché l'enfasi nelle operazioni di calcolo in questo caso non sarà posta sull'elaborazione dei dati iniziali, ma sulla garanzia della forza crittografica della firma. La funzione hash consente inoltre di firmare un'ampia varietà di tipi di dati, non solo di testo.

Controllo password

Un altro possibile campo di applicazione dell'hashing è l'organizzazione di algoritmi per il controllo delle password stabilite per delimitare l'accesso a determinate risorse di file. In che modo questi o altri tipi di funzioni hash possono essere coinvolti nella risoluzione di tali problemi? Molto semplice.

Il fatto è che sulla maggior parte dei server, il cui accesso è soggetto a differenziazione, le password vengono archiviate come valori con hash. Questo è abbastanza logico: se le password fossero presentate nella loro forma di testo originale, gli hacker che vi hanno avuto accesso potrebbero leggere facilmente i dati segreti. A sua volta, non è facile calcolare la password in base all'hash.

Come viene verificato l'accesso degli utenti quando si utilizzano gli algoritmi in esame? La password inserita dall'utente viene confrontata con quanto registrato nella funzione hash, che è memorizzata sul server. Se i valori dei blocchi di testo corrispondono, l'utente ottiene l'accesso necessario alle risorse.

La funzione hash più semplice può essere utilizzata come strumento di verifica della password. Ma in pratica, gli specialisti IT utilizzano più spesso algoritmi crittografici complessi a più stadi. Di norma, sono integrati dall'applicazione di standard per il trasferimento di dati su un canale sicuro - in modo che gli hacker non possano trovare o calcolare la password trasmessa dal computer dell'utente al server - prima che venga verificata con blocchi di testo con hash.

Collisioni hash

La teoria delle funzioni hash prevede un fenomeno come la collisione. Qual è la sua essenza? La collisione hash è una situazione in cui due file diversi hanno lo stesso codice hash. Ciò è possibile se la lunghezza della sequenza di caratteri di destinazione è breve. In questo caso, la probabilità che l'hash venga abbinato sarà maggiore.

Per evitare collisioni, si consiglia, in particolare, di utilizzare un doppio algoritmo chiamato hashing della funzione di hash. Implica la formazione di codice aperto e chiuso. Quando si risolvono problemi critici, molti programmatori consigliano di non utilizzare le funzioni hash nei casi in cui non è necessario e di testare sempre gli algoritmi corrispondenti per la migliore compatibilità con determinate chiavi.

Storia dell'apparenza

I fondatori della teoria delle funzioni hash possono essere considerati i ricercatori Carter, Wegman, Simonson, Bierbrauer. Nelle prime versioni, i corrispondenti algoritmi sono stati utilizzati come toolkit per la formazione di immagini uniche di sequenze di caratteri di lunghezza arbitraria con il successivo scopo della loro identificazione e verifica dell'autenticità. A sua volta, l'hash, secondo i criteri specificati, dovrebbe avere una lunghezza di 30-512 bit. Come proprietà particolarmente utile delle funzioni corrispondenti, abbiamo considerato la sua idoneità ad essere utilizzata come risorsa per la ricerca rapida di file o per ordinarli.

Standard di hashing popolari

Consideriamo ora in quali standard popolari possono essere rappresentate le funzioni hash. Tra questi c'è CRC. Questo algoritmo è un codice ciclico, chiamato anche checksum. Questo standard è caratterizzato da semplicità e allo stesso tempo universalità: può essere utilizzato per eseguire l'hashing della più ampia gamma di dati. CRC è uno degli algoritmi non crittografici più comuni.

A loro volta, gli standard MD4 e MD5 sono ampiamente utilizzati nella crittografia. Un altro popolare algoritmo crittografico è SHA-1. In particolare, è caratterizzato da una dimensione hash di 160 bit, che è maggiore di quella di MD5: questo standard supporta 128 bit. Esistono standard russi che regolano l'uso delle funzioni hash: GOST R 34.11-94, nonché GOST R 34.11-2012, che lo ha sostituito. Si può notare che il valore hash fornito dagli algoritmi adottati nella Federazione Russa è di 256 bit.

Le norme in questione possono essere classificate per vari motivi. Ad esempio, ci sono quelli che utilizzano algoritmi a blocchi e specializzati. La semplicità dei calcoli basati sugli standard del primo tipo è spesso accompagnata dalla loro bassa velocità. Pertanto, in alternativa agli algoritmi a blocchi, possono essere utilizzati quelli che comportano un minor numero di operazioni computazionali necessarie. È consuetudine fare riferimento agli standard ad alta velocità, in particolare ai suddetti MD4, MD5 e anche SHA. Consideriamo le specifiche di algoritmi di hashing speciali usando SHA come esempio.

Caratteristiche dell'algoritmo SHA

L'uso di funzioni di hash basate sullo standard SHA è più spesso effettuato nello sviluppo di strumenti di firma digitale per documenti DSA. Come abbiamo notato sopra, l'algoritmo SHA mantiene un hash a 160 bit (fornendo un cosiddetto "digest" della sequenza di caratteri). Inizialmente, lo standard in esame divide l'array di dati in blocchi di 512 bit. Se necessario, se la lunghezza dell'ultimo blocco non raggiunge la cifra specificata, la struttura del file viene completata con 1 e il numero richiesto di zeri. Inoltre, alla fine del blocco corrispondente, viene inserito un codice che fissa la lunghezza del messaggio. L'algoritmo in esame utilizza 80 funzioni logiche, attraverso le quali vengono elaborate 3 parole, rappresentate in 32 bit. Inoltre, lo standard SHA prevede l'utilizzo di 4 costanti.

Confronto di algoritmi di hashing

Studiamo come si relazionano le proprietà delle funzioni hash relative a diversi standard, usando l'esempio del confronto tra le caratteristiche dello standard russo GOST R 34.11-94 e lo SHA americano, di cui abbiamo discusso sopra. Prima di tutto, va notato che l'algoritmo sviluppato nella Federazione Russa prevede l'implementazione di 4 operazioni di crittografia per 1 ciclo. Ciò corrisponde a 128 round. A sua volta, durante 1 round quando si utilizza SHA, si suppone che calcoli circa 20 comandi, mentre ci sono round in totale 80. Pertanto, l'utilizzo di SHA consente di elaborare 512 bit di dati iniziali entro 1 ciclo. Mentre lo standard russo è in grado di eseguire operazioni per ciclo di 256 bit di dati.

Specificità dell'ultimo algoritmo russo

Sopra, abbiamo notato che lo standard GOST R 34.11-94 è stato sostituito da uno più recente: GOST R 34.11-2012 "Stribog". Esploriamo le sue specifiche in modo più dettagliato.

Tramite questo standard possono essere implementate funzioni di hash crittografiche, come nel caso degli algoritmi discussi sopra. Si può notare che l'ultimo standard russo supporta un blocco di dati di input a 512 bit. I principali vantaggi di GOST R 34.11-2012:

  • alto livello di protezione contro le cifre di cracking;
  • affidabilità supportata dall'uso di design collaudati;
  • calcolo in linea della funzione hash, l'assenza nell'algoritmo di trasformazioni che complicano la costruzione della funzione e ne rallentano il calcolo.

I noti vantaggi del nuovo standard russo per la crittografia crittografica consentono di utilizzarlo quando si organizza la circolazione di documenti che soddisfa i criteri più rigorosi, che sono enunciati nelle disposizioni della legislazione normativa.

Specificità delle funzioni hash crittografiche

Consideriamo più in dettaglio come i tipi di algoritmi che stiamo studiando possono essere utilizzati nel campo della crittografia. Il requisito chiave per le funzioni corrispondenti è la resistenza alla collisione, che abbiamo menzionato sopra. Cioè, non dovrebbero essere formati valori ripetuti della funzione hash se questi valori sono già presenti nella struttura dell'algoritmo vicino. Gli altri criteri sopra indicati devono essere soddisfatti anche dalle funzioni crittografiche. È chiaro che c'è sempre qualche possibilità teorica di recuperare il file originale in base all'hash, soprattutto se è disponibile un potente strumento di calcolo. Tuttavia, tale scenario dovrebbe essere ridotto al minimo grazie ad algoritmi di crittografia affidabili. Quindi, sarà molto difficile calcolare la funzione hash se la sua forza di calcolo corrisponde alla formula 2 ^ (n / 2).

Un altro criterio importante per un algoritmo crittografico è un cambiamento nell'hash se il set di dati originale viene modificato. Abbiamo notato sopra che gli standard di crittografia dovrebbero avere una sensibilità di 1 bit. Pertanto, questa proprietà è un fattore chiave per fornire una protezione con password affidabile per l'accesso ai file.

Schemi iterativi

Esaminiamo ora come possono essere costruiti gli algoritmi di hashing crittografico. Tra gli schemi più comuni per risolvere questo problema c'è l'uso di un modello sequenziale iterativo. Si basa sull'uso della cosiddetta funzione di compressione, in cui il numero di bit in ingresso è significativamente maggiore di quelli fissati in uscita.

Naturalmente, la funzione di compressione deve soddisfare i criteri di forza crittografica necessari. Con uno schema interattivo, la prima operazione per elaborare il flusso di dati in ingresso è suddivisa in blocchi, la cui dimensione è calcolata in bit. L'algoritmo corrispondente utilizza anche variabili temporanee con un determinato numero di bit. Come primo valore viene utilizzato un numero noto, mentre i successivi blocchi di dati vengono combinati in uscita con il valore della funzione in questione. Il valore hash è la velocità in bit di output per l'ultima iterazione, che include l'intero flusso di input, incluso il primo valore. Viene fornito il cosiddetto "effetto valanga" dell'hashing.

La principale difficoltà che caratterizza l'hashing implementato come schema iterativo è che a volte è difficile costruire funzioni hash se il flusso di input non è identico alla dimensione del blocco in cui è diviso l'array di dati originale. Ma in questo caso, gli algoritmi possono essere scritti nello standard di hashing per mezzo del quale il flusso originale può essere espanso in un modo o nell'altro.

In alcuni casi, nel processo di elaborazione dei dati nell'ambito di uno schema iterativo, possono essere utilizzati i cosiddetti algoritmi multi-pass. Suggeriscono la formazione di un "effetto valanga" ancora più intenso. Tale scenario presuppone la formazione di insiemi di dati ripetuti e solo nella seconda fase avviene l'espansione.

Algoritmo a blocchi

La funzione di compressione può anche essere basata su un algoritmo a blocchi mediante il quale viene eseguita la crittografia. Quindi, al fine di aumentare il livello di sicurezza, è possibile utilizzare come chiave i blocchi di dati soggetti a hashing all'iterazione corrente e il risultato delle operazioni ottenute durante l'esecuzione della funzione di compressione prima di quello - come input. Di conseguenza, l'ultima iterazione fornirà l'output dell'algoritmo. La sicurezza dell'hashing sarà correlata alla robustezza dell'algoritmo utilizzato.

Tuttavia, come abbiamo notato sopra, considerando vari tipi di funzioni hash, gli algoritmi a blocchi sono spesso accompagnati dalla necessità di utilizzare grandi potenze di calcolo. Se non sono disponibili, la velocità di elaborazione dei file potrebbe essere insufficiente per risolvere problemi pratici associati all'uso delle funzioni hash. Allo stesso tempo, la forza crittografica richiesta può essere realizzata anche con un numero limitato di operazioni con flussi di dati iniziali, in particolare, gli algoritmi che abbiamo considerato sono adatti a risolvere tali problemi: MD5, SHA, standard russi di crittografia crittografica.

Principali articoli correlati