Hashing în criptografie

Căutați să aflați despre hashing în criptografie? Dacă o faci, atunci ai ajuns la locul potrivit.

În acest articol, vom explora mai multe despre hashing.

Hashing este o tehnică informatică pentru identificarea obiectelor sau valorilor dintr-un grup de obiecte sau valori.

Sună confuz?

Să încercăm să înțelegem prin exemplu.

Ei bine, colegiile și școlile oferă un număr unic atribuit fiecărui elev. Acest număr unic este ceea ce identifică un elev și informațiile legate de acesta. Metoda folosită pentru a genera numărul unic este Hashing.

Un alt exemplu popular sunt bibliotecile în care veți găsi tone de cărți pe rafturi. Fiecare carte de acolo are numărul său unic de identificare, astfel încât să poată fi amplasată în imensa bibliotecă!

Un exemplu modern de hashing ar fi jucătorii de joc care se înregistrează pentru joc. Valorant este un joc gratuit lansat de Riot. A fi liber pentru a juca înseamnă că milioane de oameni vor juca jocul.

Fiecare jucător este identificat folosind o valoare de identificare unică generată folosind un algoritm de hash.

Să încercăm să o înțelegem mai detaliat mai jos.

 

Ce este Hashing?

După cum sa menționat mai sus, Hashing este metoda de identificare a unui obiect dintr-un grup.


Fiecare obiect primește un număr unic de identificare odată hash.

Dar, ce înseamnă asta din punct de vedere tehnic?

Din punct de vedere tehnic, o funcție matematică generează o ieșire cu lungime fixă ​​din orice șir de intrare de orice lungime.

Tranzacțiile Bitcoin sunt hash în care tranzacțiile obțin un ID unic.

Dacă introduceți „Bună ziua, lume!” într-un Algoritm de hash SHA-256, veți obține următoarea ieșire:

Intrare: Salut Lume!

Ieșire: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

Aici SHA256 generează ieșirea din intrarea dată. După cum puteți vedea, am folosit algoritmul de hash al Secure Hash Function (SHA-256). Este una dintre metodele de hashing populare, inclusiv Message Direct (MD5) și Secure Hash Function (SHA1).

Proprietățile cheie ale funcției hash o fac fiabilă. Să le enumerăm mai jos.

  • Determinat → Aceasta înseamnă că ieșirea va fi aceeași pentru intrarea dată în orice circumstanțe date.
  • Rezistent la imagini → Caracteristica rezistentă la preimagine asigură faptul că valoarea hash nu este utilă pentru generarea valorii de intrare.
  • Computabil eficient → Funcțiile hash sunt eficiente și nu necesită resurse de calcul imense pentru a fi executate.
  • Nu poate fi inversat → Funcția hash nu poate fi inversată.
  • Rezistent la coliziune → Rezistența la coliziune asigură că nu există două intrări care să ducă la aceeași ieșire.

Am tratat deja Hashing criptografic pentru începători aici. Verificați-l acolo: Hashing criptografic: un ghid pentru începători. 

Dar, dacă sunteți aici pentru lucruri avansate, nu veți fi dezamăgiți.

 

Ce este funcția Hash și mesele Hash? Și cum funcționează?

În această secțiune, vom explora mai detaliat funcția hash și tabelele hash. În ceea ce privește hash, există funcții hash. Aceste funcții sunt responsabile pentru conversia intrărilor mari în intrări fixe mici. Tabelele hash stochează ieșirile.

În procesul de hash, obiectele sunt distribuite pe bază de perechi cheie / valoare către matrice. Deci, dacă treceți o serie de elemente către funcțiile hash, veți obține o ieșire matrice în care fiecare dintre elemente are acum o cheie atașată. Perechea cheie / valoare este foarte utilă atunci când vine vorba de accesarea elementelor în timp real, deoarece oferă un timp impresionant O (1).

Pentru a implementa funcții hash, puteți elimina cele două abordări preferate.

  • Prima abordare este de a utiliza o funcție hash pentru a converti un element într-un număr întreg. Apoi, ieșirea întreagă poate fi utilizată pentru a accesa elementul atunci când introduceți în tabelul hash.
  • Un alt pas este să puneți elementul în tabelul de hash și apoi să îl recuperați folosind cheia hash.

În a doua metodă, funcțiile vor fi după cum urmează:

hash = hash_function (cheie) index = hash% array_size

Aici, dimensiunile hash și matrice sunt independente una de cealaltă. Valoarea indicelui este calculată pe baza dimensiunii matricei. Operatorul Modulo (%) ne permite să calculăm valoarea.

În termeni simpli, o funcție hash poate fi definită ca o funcție care poate mapa un set de date de dimensiuni arbitrare la un set de date de dimensiuni fixe. Setul de date cu dimensiuni fixe rezultate poate fi stocat în tabelul hash. Multe nume sunt date valorilor returnate de funcția hash. Acestea pot fi numite valori hash, hash, sumă hash și coduri hash.

 

Scrierea unei bune funcții Hash

Dacă doriți să creați o funcție sau mecanism hash bun, trebuie să înțelegeți cerințele de bază ale creării unuia. Să le enumerăm mai jos:

  • Funcția hash trebuie să fie ușor de calculat. Asta înseamnă că nu ar trebui să fie necesare multe resurse pentru a fi executate.
  • Funcția hash trebuie să fie distribuită uniform. Procedând astfel, tabelele hash sunt utilizate pentru stocarea valorilor hash, astfel încât clusterizarea să nu se întâmple.
  • Ultima cerință este să aveți o coliziune mai mică sau deloc. Nici o coliziune nu înseamnă că nici o ieșire nu este mapată la două intrări.

Din punct de vedere tehnic, coliziunile fac parte dintr-o funcție hash și pur și simplu nu pot fi eliminate dintr-o funcție hash. Scopul este de a crea o funcție hash care poate oferi o performanță bună a tabelului hash și rezolva coliziunile prin tehnici de rezoluție a coliziunilor.

 

De ce avem nevoie de o funcție Hash bună?

Pentru a înțelege nevoia unei funcții hash utile, să parcurgem un exemplu de mai jos.

Să presupunem că dorim să creăm un tabel Hash folosind o tehnică de hash în care șirurile de intrare vor fi după cum urmează, {„agk”, „kag”, „gak”, „akg”, „kga”, „gka”}

Acum, creăm o funcție hash care adaugă pur și simplu valoarea ASCII a (97), g (103) și k (107) și apoi face un modulo al sumei cu 307.

În mod clar, suma celor trei numere este, de asemenea, 307. Aceasta înseamnă că, dacă permutăm toate numerele și apoi facem o operație modulo, vom obține același rezultat. Rezultatul final ar fi stocarea tuturor șirurilor la același număr de index. Timpul algoritmic pentru funcția hash ar fi, de asemenea, complexitatea O (n), ceea ce nu este de dorit. Putem concluziona cu ușurință că funcția hash pe care am descris-o nu este optimă pentru scenarii din viața reală.

Pentru a remedia funcția hash, putem implementa împărțind suma valorilor ASCII ale fiecărui element la un alt număr prim, 727. Procedând astfel, vom obține o ieșire diferită pentru matricea noastră de șiruri de intrare date..

 

Aflați despre tabelele Hash

Tabelele hash sunt foarte utile în stocarea rezultatului unei funcții hash, care calculează indexul și apoi stochează o valoare împotriva acestuia. Rezultatul final ar fi un proces de calcul mai rapid cu complexitatea O (1).

Tabelele Hash sunt în mod tradițional o alegere bună în rezolvarea problemelor care necesită timp O (n).

Deci, dacă ridicați un șir de lungime fixă ​​și apoi încercați să aflați frecvența caracterelor șirului.

Deci, dacă șir = “aacddce”, atunci o abordare generică este de a parcurge șirul de mai multe ori și de a stoca fiecare frecvență.

# Furnizați un șir de intrare și numărați frecvența caracterelor din acel șir

# Algoritmul este 0 (n) timp de complexitate

temp_list = [] start = "A" str = "ababcddefff" def alpha_zeta (): alpha = ‘a’ for i in range (0,26): temp_list.append (alpha) alpha = chr (ord (alpha) + 1) return temp_list temp_list = alpha_zeta () #print (temp_list) def caracter_frecvență (str, listă_temp): pentru fiecare din temp_list: freq = 0 pentru i în str: dacă (i == fiecare): frecvență = frecvență + 1 tipărire (fiecare, frecvență) caracter_frecvență (str, listă_temp)

Ieșirea programului de mai sus va fi după cum urmează:

a 2 b 2 c 1 d 2 e 1 f 3 g 0 h 0 i 0 .. ..

Acum, să implementăm un tabel hash în C ++ și să numărăm frecvența caracterelor.

#includeți utilizarea spațiului de nume std; int Frecvență [26]; int hashFunc (char c) {return (c – ‘a’); } void countFre (șir S) {pentru (int i = 0; i< S. lungime (); ++ i) {int index = hashFunc (S [i]); Frecvență [index] ++; } Pentru (int i = 0; i<26; ++ i) {cout << (char) (i + „a”) << ” << Frecvență [i]<< endl; }} Int main () {cout<<"Salut Lume"; countFre ("abbaccbdd"); }

Rezultatul programului ar fi după cum urmează:

a 2 b 3 c 2 d 2

Complexitatea O (N) a algoritmului îl face mai rapid în comparație cu alte abordări liniare.

Cum se rezolvă coliziunile

Există modalități unice de a rezolva coliziunile în funcțiile hash. Una dintre modalitățile populare este înlănțuirea separată, cunoscută și sub numele de hash deschis. Este implementat cu o listă legată unde fiecare dintre elementele din lanț este ea însăși o listă legată. Această abordare permite stocarea elementelor și asigurarea faptului că anumite elemente fac parte doar din lista specifică legată, rezolvând coliziunea. Asta înseamnă că nu există două valori de intrare care pot avea aceeași valoare hash de ieșire.

 

Explorarea Hash în Python

În această secțiune, vom analiza rapid hash-ul din Python. Motivul pentru care alegem Python este că este ușor de citit și poate fi folosit de oricine fără mari probleme.

Deoarece hashing-ul este o funcție comună, acesta este deja implementat în biblioteca Python. Utilizând modulul, puteți furniza un obiect ca intrare și apoi returnați valoarea hash.

Sintaxa metodei hash este:

hash (obiect)

După cum puteți vedea, include un singur parametru, care este obiectul. Obiectul poate fi întreg, plutitor sau șir.

Valoarea returnată a metodei hash () depinde de intrare. Pentru un număr întreg, acesta poate întoarce același număr, în timp ce pentru zecimal și șir ar fi diferite.

Să vedem câteva exemple mai jos.

num = 10 deci = 1.23556 str1 = "Nitish" print (hash (num)) print (hash (deci)) print (hash (str1))

Ieșirea codului de mai sus este următoarea:

Cu toate acestea, hashingul nu poate fi aplicat tuturor tipurilor de obiecte. De exemplu, dacă vă amintiți că am creat o listă de la a la z în primul nostru program. Dacă încercăm să-l hashem, fereastra de ieșire va trece printr-un TypeError: tipo tipo: „listă”

Pentru a aplica hashing la o listă de obiecte, trebuie să utilizați tuplu.

vocale = (‘a’, ‘e’, ​​’i’, ‘o’, ‘u’) print (hash (vocale)) Ieșire ⇒ -5678652950122127926

Hashing în criptografie

Hashing-ul este util criptografiei. Bitcoin folosește hashing pentru a crea și gestiona arborii Merkle

De asemenea, hashing-ul a făcut parte din criptografie de destul de mult timp. Cu toate acestea, cel mai bun caz de utilizare a hashului este de a hash parole și de a le stoca. 

Arbori Merkle

Arborele Merkle este o structură de date care este utilă atunci când vine vorba de verificarea securizată a datelor într-un pool mare de date. Atât Bitcoin, cât și Ethereum utilizează arborii Merkle pentru a rezolva multe bariere tehnologice atunci când stochează și accesează date într-o rețea deschisă.

Orice rețea centralizată nu trebuie să-și facă griji cu privire la stocarea și accesarea datelor, deoarece există o singură sursă atât pentru accesarea, cât și pentru stocarea datelor. Cu toate acestea, ecuația se schimbă atunci când există o rețea descentralizată, deoarece acum datele trebuie copiate între sute de colegi participanți.

Arborii Merkle rezolvă problema oferind un mod de încredere și eficient de a partaja și verifica datele între colegi.

Merkle Tree Exemplu

Dar, de ce discutăm aici despre copacii Merkle? Arborii Merkle folosesc hashul ca funcționalitate de bază pentru a conecta diferitele noduri și blocuri de date.

Merkle Trees este un arbore cu capul în jos care poate rezuma întregul set de tranzacții.

Dacă doriți să aflați mai multe despre arborii Merkle și cum folosește hashing în criptografie, consultați ghidul nostru detaliat:

Un ghid pentru arborii Merkle. Acolo, am discutat despre modul în care instrumentele pentru arbori Merkle sunt realizate în bitcoin și alte cazuri de utilizare.

Procesul de exploatare

Procesul minier profită, de asemenea, de hashing. Când vine vorba de mineritul bitcoin, un nou bloc este adăugat la blockchain atunci când există o cerere pentru acesta.

Trebuie urmată o metodă pentru a adăuga blocul la blockchain. O valoare hash este generată în funcție de conținutul blocului atunci când ajunge un bloc nou. De asemenea, dacă hash-ul generat este mai mult decât dificultate în rețea, începe procesul de adăugare a blocului la blockchain.

După ce ați terminat, toți colegii din rețea recunosc adăugarea noului bloc.

Dar, acest lucru se întâmplă rar, deoarece dificultatea rețelei, în majoritatea cazurilor, este întotdeauna mai mare în comparație cu hash-ul generat. Există un alt aspect care joacă un rol crucial în procesul minier. Este nonce.

Nonce-ul este adăugat la hash-ul blocului și este un șir arbitrar. După ce ați terminat, șirul concatenat este apoi comparat cu nivelul de dificultate. Dacă nivelul de dificultate este mai mic decât șirul concatenat, atunci nonce-ul este modificat până când nivelul de dificultate este mai mare.

Procesul poate fi rezumat în următorii pași:

  • Conținutul este hash pentru a crea o nouă valoare hash ori de câte ori este generat sau luat un nou bloc,
  • O nouă valoare nonce este generată și adăugată la hash
  • Procesul de hash are loc pe noul șir contactat 
  • Valoarea finală a hash-ului este apoi comparată cu nivelul de dificultate al rețelei
  •  dacă valoarea hash finală este mai mică decât nonce, procesul se repetă din nou. Procesul se oprește numai atunci când valoarea hash este mai mare decât nonce.
  • Blocul se alătură lanțului odată ce nivelul de dificultate este mai mare
  • Minerii își asumă apoi responsabilitatea de a exploata noul bloc și de a împărți recompensele între ei.

Termenul „rata hash” vine și de aici. Rata Hash este rata la care au loc operațiile de hash. O rată mai mare de hash înseamnă că minerii ar avea nevoie de mai multă putere de calcul pentru a participa la procesul minier.

 

Concluzie

Acest lucru ne conduce la sfârșitul ghidului nostru aprofundat în criptografie. Am acoperit în detaliu hashing-ul și am explorat și codul din spatele acestuia.

Deci, ce părere aveți despre asta? Comentează mai jos și anunță-ne.

 

#FAQ

Ce este hashing în criptografie?

În criptografie, hashing-ul este o metodă de conversie a datelor într-un șir unic de text folosind o metodă eficientă. De asemenea, nu există nicio limitare în ceea ce privește tipul de date sau dimensiunea acestora – hashingul funcționează pe toate.

Cum se utilizează hashing în criptografie?

Criptografia utilizează hash pentru a hash parole sau pentru a genera numere de identificare unice.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map