Hashing in cryptografie

Ben je op zoek naar hashing in cryptografie? Dan bent u bij ons aan het juiste adres.

In dit artikel gaan we meer ontdekken over hashing.

Hashing is een computerwetenschappelijke techniek om objecten of waarden te identificeren uit een groep objecten of waarden.

Klinkt verwarrend?

Laten we proberen het voorbeeld te begrijpen.

Welnu, hogescholen en scholen geven elk van hun studenten een uniek toegewezen nummer. Dit unieke nummer identificeert een student en de informatie die op hem betrekking heeft. De methode die wordt gebruikt om het unieke nummer te genereren, is Hashing.

Een ander populair voorbeeld zijn bibliotheken waar u tonnen boeken in de schappen kunt vinden. Elk boek heeft daar een uniek identificatienummer, zodat het in de enorme bibliotheek kan worden teruggevonden!

Een modern voorbeeld van hashing zijn spelspelers die zich registreren voor het spel. Valorant is een gratis te spelen game die is gelanceerd door Riot. Omdat het spel gratis is om te spelen, zullen miljoenen mensen het spel spelen.

Elke speler wordt geïdentificeerd met behulp van een unieke identificatiewaarde die is gegenereerd met behulp van een hash-algoritme.

Hashing in cryptografie

Laten we het hieronder in meer detail proberen te begrijpen.

Wat is hasj?


Zoals hierboven vermeld, is hashen de methode om een ​​object uit een groep te identificeren.

Elk object krijgt een uniek identificatienummer nadat het is gehasht.

Maar wat betekent dat technisch??

Technisch gezien genereert een wiskundige functie een uitvoer met een vaste lengte uit elke invoertekenreeks van elke lengte.

Bitcoin-transacties worden gehasht waarbij de transacties unieke ID’s krijgen.

Als je ‘Hallo wereld!’ Invoert in een SHA-256-hash-algoritme, je krijgt de volgende output:

Invoer: Hallo Wereld!

Uitgang: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

Hier genereert SHA256 de uitvoer van de gegeven invoer. Zoals u kunt zien, hebben we het hash-algoritme Secure Hash Function (SHA-256) gebruikt. Het is een van de populaire hash-methoden die er zijn, waaronder Message Direct (MD5) en Secure Hash Function (SHA1).

De belangrijkste eigenschappen van de hash-functie maken deze betrouwbaar. Laten we ze hieronder opsommen.

  • Deterministisch → Dit betekent dat de uitvoer onder alle omstandigheden hetzelfde zal zijn voor de gegeven invoer.
  • Bestand tegen voorimage → De functie die bestand is tegen afbeeldingen, zorgt ervoor dat de hash-waarde niet bruikbaar is voor het genereren van de invoerwaarde.
  • Computationeel efficiënt → De hash-functies zijn efficiënt en vereisen geen enorme rekenkracht om uit te voeren.
  • Kan niet worden teruggedraaid → De hash-functie kan niet ongedaan worden gemaakt.
  • Botsingsbestendig → Botsingsweerstand zorgt ervoor dat geen twee inputs dezelfde output opleveren.

We hebben hier al Cryptografisch hashen voor beginners besproken. Bekijk het daar: Cryptographic Hashing: A Beginner’s Guide.

Maar als je hier bent voor geavanceerde dingen, zul je niet teleurgesteld zijn.

Wat is hash-functie en hash-tabellen? En hoe ze werken?

In deze sectie zullen we de hash-functie en hashtabellen in meer detail onderzoeken. In termen van hashing zijn er hash-functies. Deze functies zijn verantwoordelijk voor het omzetten van grote inputs in kleine vaste inputs. De hash-tabellen slaan de outputs op.

In het hashing-proces worden de objecten gedistribueerd op basis van hun sleutel / waarde-paren naar de array. Dus als je een array van elementen aan de hash-functies doorgeeft, krijg je een array-uitvoer waar aan elk van de elementen nu een sleutel is gekoppeld. Het sleutel / waarde-paar is erg handig als het gaat om toegang tot elementen in realtime, omdat het een indrukwekkende O (1) -tijd biedt.

Om hash-functies te implementeren, kunt u de twee voorkeursbenaderingen gebruiken.

  • De eerste benadering is om een ​​hash-functie te gebruiken om een ​​element naar een geheel getal te converteren. Vervolgens kan de integer-uitvoer worden gebruikt om toegang te krijgen tot het element bij het invoeren van de hashtabel.
  • Een andere stap is om het element in de hashtabel te plaatsen en het vervolgens op te halen met de gehashte sleutel.

Bij de 2e methode zijn de functies zoals hieronder:

hash = hash_function (sleutel) index = hash% array_size

Hier zijn de hash- en de array-grootte onafhankelijk van elkaar. De indexwaarde wordt berekend op basis van de matrixgrootte. Modulo-operator (%) stelt ons in staat om de waarde te berekenen.

In eenvoudige bewoordingen kan een hash-functie worden gedefinieerd als een functie die een dataset met een willekeurige grootte kan toewijzen aan een dataset met een vaste grootte. De resulterende dataset met vaste grootte kan in de hashtabel worden opgeslagen. Er worden veel namen gegeven aan de waarden die worden geretourneerd door de hash-functie. Ze kunnen hash-waarden, hashes, hash-sommen en hash-codes worden genoemd.

Een goede hash-functie schrijven

Als u een goede hash-functie of -mechanisme wilt maken, moet u de basisvereisten voor het maken ervan begrijpen. Laten we ze hieronder opsommen:

  • De hash-functie moet eenvoudig te berekenen zijn. Dat betekent dat er niet veel middelen voor nodig zijn om het uit te voeren.
  • De hash-functie moet uniform worden verdeeld. Door dit te doen, worden hashtabellen gebruikt voor het opslaan van de hash-waarden, zodat clustering niet plaatsvindt.
  • De laatste vereiste is om minder of helemaal geen aanrijding te hebben. Geen botsing betekent dat geen enkele uitgang is toegewezen aan twee ingangen.

Technisch gezien maken botsingen deel uit van een hash-functie en kunnen ze eenvoudigweg niet uit een hash-functie worden verwijderd. Het doel is om een ​​hash-functie te creëren die goede hashtabelprestaties kan bieden en botsingen kan oplossen door middel van technieken voor het oplossen van botsingen.

Waarom hebben we een goede hash-functie nodig??

Laten we hieronder een voorbeeld bekijken om de noodzaak van een handige hash-functie te begrijpen.

Laten we aannemen dat we een hash-tabel willen maken met behulp van een hash-techniek waarbij de invoerstrings als volgt zijn: {“agk”, “kag”, “gak”, “akg”, “kga”, “gka”}

Nu maken we een hash-functie die simpelweg de ASCII-waarde van a (97), g (103) en k (107) optelt en vervolgens een modulo doet van de som met 307.

Het is duidelijk dat de som van de drie getallen ook 307 is. Dit betekent dat als we alle getallen permuteren en vervolgens een modulo-bewerking uitvoeren, we hetzelfde resultaat krijgen. Het eindresultaat zou zijn om alle strings op hetzelfde indexnummer op te slaan. De algoritmische tijd voor de hash-functie zou ook O (n) -complexiteit zijn, wat niet wenselijk is. We kunnen gemakkelijk concluderen dat de hash-functie die we hebben beschreven niet optimaal is voor real-life scenario’s.

Om de hash-functie te repareren, kunnen we de som van ASCII-waarden van elk element delen door een ander priemgetal, 727. Door dit te doen, krijgen we een andere uitvoer voor onze gegeven invoerreeksreeks.

Meer informatie over hash-tabellen

De hashtabellen zijn erg handig bij het opslaan van het resultaat van een hash-functie, die de index berekent en er vervolgens een waarde voor opslaat. Het eindresultaat zou een sneller rekenproces zijn met O (1) -complexiteit.

Hash-tabellen zijn traditioneel een goede keuze bij het oplossen van problemen die O (n) tijd vergen.

Dus als u een string van een vaste lengte oppakt en vervolgens probeert de tekenfrequentie van de string te leren.

Dus als string = “aacddce”, dan is een algemene benadering om de string meerdere keren te doorlopen en elke frequentie op te slaan.

# Geef een invoertekenreeks op en tel de frequentie van de tekens in die tekenreeks

#Het algoritme is 0 (n) complexiteitstijd

temp_list = [] start = "een" str = "ababcddefff" def alpha_zeta (): alpha = ‘a’ voor i in bereik (0,26): temp_list.append (alpha) alpha = chr (ord (alpha) + 1) return temp_list temp_list = alpha_zeta () #print (temp_list) def character_frequency (str, temp_list): voor elk in temp_list: freq = 0 voor i in str: if (i == elk): freq = freq + 1 print (elk, freq) character_frequency (str, temp_list)

De output van het bovenstaande programma zal als volgt zijn:

een 2 b 2 c 1 d 2 e 1 f 3 g 0 h 0 ik 0 .. ..

Laten we nu een hashtabel in C ++ implementeren en de tekenfrequentie tellen.

#include met behulp van de naamruimte std; int Frequentie [26]; int hashFunc (char c) {return (c – ‘a’); } void countFre (string S) {for (int i = 0; i< S. lengte (); ++ i) {int index = hashFunc (S [i]); Frequentie [index] ++; } Voor (int i = 0; i<26; ++ i) {cout << (char) (i + ‘a’) << ​ << Frequentie [i]<< endl; }} Int main () {cout<<"Hallo Wereld"​countFre ("abbaccbdd"​​

De output van het programma zou als volgt zijn:

een 2 b 3 c 2 d 2

De O (N) -complexiteit van het algoritme maakt het sneller in vergelijking met andere lineaire benaderingen.

Botsingen oplossen

Er zijn unieke manieren om botsingen in hashfuncties op te lossen. Een van de populaire manieren is aparte chaining, ook wel open hashing genoemd. Het is geïmplementeerd met een gekoppelde lijst waarbij elk van de elementen in de keten zelf een gekoppelde lijst is. Deze benadering maakt het mogelijk om elementen op te slaan en ervoor te zorgen dat bepaalde elementen slechts deel uitmaken van de specifieke gekoppelde lijst, waardoor botsingen worden opgelost. Dat betekent dat geen twee invoerwaarden dezelfde uitvoerhashwaarde kunnen hebben.

Hash verkennen in Python

In deze sectie zullen we snel kijken naar hash in Python. De reden dat we voor Python kiezen, is dat het gemakkelijk te lezen is en zonder veel moeite door iedereen kan worden gebruikt.

Omdat hashing een veel voorkomende functie is, is het al geïmplementeerd in de Python-bibliotheek. Door de module te gebruiken, kunt u een object opgeven als invoer en vervolgens de gehashte waarde retourneren.

De syntaxis van de hash-methode is:

hash (object)

Zoals je kunt zien, neemt het een enkele parameter in beslag, namelijk het object. Het object kan een geheel getal, een zwevend getal of een tekenreeks zijn.

De geretourneerde waarde van de hash () – methode is afhankelijk van de invoer. Voor een geheel getal kan het hetzelfde getal retourneren, terwijl voor een decimaal getal en een tekenreeks anders zijn.

Laten we hieronder enkele voorbeelden bekijken.

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

De uitvoer van de bovenstaande code is als volgt:

hashing in cryptografie

Hashing kan echter niet op alle objecttypen worden toegepast. Als u zich bijvoorbeeld herinnert dat we in ons eerste programma een lijst van a tot z hebben gemaakt. Als we het proberen te hashen, doorloopt het uitvoervenster een TypeError: unhashable type: ‘list’

hashing-in-crpytography-python-error

Om hashing op een objectenlijst toe te passen, moet u tuple gebruiken.

klinkers = (‘a’, ‘e’, ​​’i’, ‘o’, ‘u’) print (hash (klinkers)) Uitvoer ⇒ -5678652950122127926

Hashing in cryptografie

Hashing is handig voor cryptografie. Bitcoin gebruikt hashing om Merkle-bomen te maken en te beheren

Hashing maakt ook al geruime tijd deel uit van cryptografie. Het beste gebruik van hashing is echter om wachtwoorden te hashen en op te slaan.

Merkle Trees

Merkle-boom is een datastructuur die handig is als het gaat om het uitvoeren van veilige gegevensverificatie in een grote datapool. Zowel Bitcoin als Ethereum gebruiken Merkle-bomen om veel technologische belemmeringen op te lossen bij het opslaan en openen van gegevens in een open netwerk.

Elk gecentraliseerd netwerk hoeft zich geen zorgen te maken over het opslaan en openen van gegevens, aangezien er maar één bron is voor zowel toegang als opslag van de gegevens. De vergelijking verandert echter wanneer er een gedecentraliseerd netwerk is, aangezien de gegevens nu moeten worden gekopieerd tussen honderden deelnemende peers.

Merkle-bomen lossen het probleem op door een vertrouwde en efficiënte manier te bieden om gegevens tussen collega’s te delen en te verifiëren.

merkle-tree-voorbeeld

Merkle Tree-voorbeeld

Maar waarom hebben we het hier over Merkle-bomen? Merkle-bomen gebruiken de hash als de kernfunctionaliteit om de verschillende knooppunten en datablokken met elkaar te verbinden.

Merkle Trees is een omgekeerde boom die de hele transactieset kan samenvatten.

Als je meer wilt weten over Merkle-bomen en hoe het hashing in cryptografie gebruikt, bekijk dan onze gedetailleerde gids: A Guide To Merkle Trees. Daar hebben we besproken hoe de implementaties van Merkle-bomen worden gedaan in bitcoin en andere use-cases.

Mijnbouwproces

Het mijnbouwproces maakt ook gebruik van hashing. Als het om bitcoin mining gaat, wordt er een nieuw blok aan de blockchain toegevoegd wanneer daar vraag naar is.

Er moet een methode worden gevolgd om het blok aan de blockchain toe te voegen. Er wordt een hash-waarde gegenereerd, afhankelijk van de inhoud van het blok wanneer een nieuw blok arriveert. Als de gegenereerde hash meer is dan netwerkmoeilijkheden, wordt het proces van het toevoegen van het blok aan de blockchain gestart.

Eenmaal gedaan, erkennen alle peers in het netwerk de toevoeging van het nieuwe blok.

Maar dat is zelden het geval, omdat de netwerkmoeilijkheid in de meeste gevallen altijd hoger is in vergelijking met de gegenereerde hash. Er is nog een ander aspect dat een cruciale rol speelt in het mijnbouwproces. Het is de nonce.

De nonce wordt toegevoegd aan de hash van het blok en is een willekeurige tekenreeks. Eenmaal gedaan, wordt de aaneengeschakelde string vergeleken met de moeilijkheidsgraad. Als de moeilijkheidsgraad lager is dan de aaneengeschakelde string, wordt de nonce gewijzigd totdat de moeilijkheidsgraad hoger is.

Het proces kan worden samengevat in de volgende stappen:

  • De inhoud wordt gehasht om een ​​nieuwe hashwaarde te creëren wanneer een nieuw blok wordt gegenereerd of genomen,
  • Er wordt een nieuwe nonce-waarde gegenereerd en aan de hash toegevoegd
  • Het hash-proces vindt plaats op de nieuwe gecontacteerde string
  • De uiteindelijke waarde van de hash wordt vervolgens vergeleken met de moeilijkheidsgraad van het netwerk
  • als de uiteindelijke hash-waarde lager is dan de nonce, wordt het proces opnieuw herhaald. Het proces stopt alleen als de hash-waarde hoger is dan de nonce.
  • Block voegt zich bij de ketting zodra de moeilijkheidsgraad hoger is
  • De miners nemen dan de verantwoordelijkheid om het nieuwe blok te minen en de beloningen onderling te delen.

De term “hash rate” komt hier ook vandaan. De hash-snelheid is de snelheid waarmee de hash-bewerkingen plaatsvinden. Een hogere hash-snelheid betekent dat de mijnwerkers meer rekenkracht nodig hebben om deel te nemen aan het mijnbouwproces.

Gevolgtrekking

Dit leidt ons naar het einde van onze diepgaande gids voor hashing in cryptografie. We hebben hashing in detail behandeld en ook de code erachter onderzocht.

Dus, wat vind je ervan? Reageer hieronder en laat het ons weten.

#FAQ

Wat is hashing in cryptografie?

In cryptografie is hashing een methode om gegevens om te zetten in een unieke reeks tekst met behulp van een efficiënte methode. Er is ook geen beperking op het type gegevens of de grootte ervan – hashing werkt op al deze gegevens.

Hoe wordt hashing gebruikt in cryptografie?

Cryptografie gebruikt hashing om wachtwoorden te hashen of unieke identificatienummers te genereren.

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