Kriptografide hashing hakkında bilgi edinmek mi istiyorsunuz? Eğer yaparsan, o zaman doğru yere geldiniz.

Bu makalede, hash oluşturma hakkında daha fazla şey keşfedeceğiz..

Hashing, bir grup nesne veya değerden nesneleri veya değerleri tanımlamak için kullanılan bir bilgisayar bilimi tekniğidir..

Kafa karıştırıcı sesler?


Örnekle anlamaya çalışalım.

Kolejler ve okullar, öğrencilerinin her birine benzersiz bir şekilde atanmış bir numara sağlar. Bu benzersiz numara, bir öğrenciyi ve onunla ilgili bilgileri tanımlayan şeydir. Benzersiz numarayı oluşturmak için kullanılan yöntem Hashing’dir..

Diğer bir popüler örnek, raflarda tonlarca kitap bulacağınız kütüphanelerdir. Oradaki her kitabın kendine özgü kimlik numarası vardır, böylece büyük kütüphanede yer alabilir.!

Modern bir hash örneği, oyuna kaydolan oyun oyuncuları olabilir. Valorant, Riot tarafından başlatılan oynaması ücretsiz bir oyundur. Oynaması ücretsiz olmak, milyonlarca insanın oyunu oynayacağı anlamına gelir.

Her oyuncu, bir karma algoritma kullanılarak oluşturulan benzersiz bir tanımlama değeri kullanılarak tanımlanır.

Kriptografide karma oluşturma

Bunu aşağıda daha ayrıntılı olarak anlamaya çalışalım.

Hashing nedir?

Yukarıda belirtildiği gibi, Hashing, bir gruptaki bir nesneyi tanımlama yöntemidir..

Her nesneye hashing uygulandığında benzersiz bir kimlik numarası verilir.

Ama bu teknik olarak ne anlama geliyor??

Teknik olarak, matematiksel bir işlev, herhangi bir uzunluktaki herhangi bir giriş dizisinden sabit uzunlukta bir çıktı üretir..

Bitcoin işlemleri, işlemlerin benzersiz kimlikler aldığı yerlerde karma hale getirilir.

“Merhaba, Dünya!” içinde SHA-256 hashing algoritması, aşağıdaki çıktıyı alacaksınız:

Giriş: Selam Dünya!

Çıktı: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

Burada SHA256, verilen girdiden çıktı üretir. Gördüğünüz gibi, Secure Hash Function (SHA-256) hashing algoritmasını kullandık. Message Direct (MD5) ve Secure Hash Function (SHA1) dahil olmak üzere oradaki popüler karma yöntemlerden biridir..

Hash fonksiyonunun temel özellikleri onu güvenilir kılar. Bunları aşağıda listeleyelim.

  • Deterministik → Bu, herhangi bir koşulda çıktının verilen girdi için aynı olacağı anlamına gelir..
  • Öngörüye Dayanıklı → Ön görüntü dirençli özellik, hash değerinin girdi değerini oluşturmak için kullanışlı olmamasını sağlar.
  • Hesaplama açısından verimli → Karma işlevler verimlidir ve yürütmek için çok büyük hesaplama kaynakları gerektirmez.
  • Tersine çevrilemez mühendislik → Karma işlevi mühendislikle tersine çevrilemez.
  • Çarpışmaya dayanıklı → Çarpışma direnci, iki girişin aynı çıkışla sonuçlanmamasını sağlar.

Burada yeni başlayanlar için Cryptographic Hashing’i zaten ele aldık. Şuraya göz atın: Cryptographic Hashing: A Beginner’s Guide.

Ancak, gelişmiş şeyler için buradaysanız, hayal kırıklığına uğramayacaksınız..

Karma İşlevi ve Karma Tabloları nedir? Ve Nasıl Çalışırlar?

Bu bölümde, hash fonksiyonunu ve hash tablolarını daha detaylı inceleyeceğiz. Hashing açısından hash fonksiyonları vardır. Bu işlevler, büyük girdileri küçük sabit girdilere dönüştürmekten sorumludur. Karma tablolar çıktıları saklar.

Hashing işleminde, nesneler diziye anahtar / değer çiftlerine göre dağıtılır. Dolayısıyla, karma işlevlere bir dizi öğe iletirseniz, öğelerin her birinin kendisine eklenmiş bir anahtarı olduğu bir dizi çıktısı elde edersiniz. Anahtar / değer çifti, etkileyici bir O (1) süresi sunduğundan öğelere gerçek zamanlı erişim söz konusu olduğunda çok kullanışlıdır..

Hash fonksiyonlarını uygulamak için tercih edilen iki yaklaşımı kaldırabilirsiniz..

  • İlk yaklaşım, bir öğeyi tam sayıya dönüştürmek için bir karma işlevi kullanmaktır. Ardından, tamsayı çıktısı, hash tablosuna yerleştirilirken öğeye erişmek için kullanılabilir..
  • Diğer bir adım, öğeyi karma tabloya koymak ve ardından karma anahtarı kullanarak geri almaktır..

2. yöntemde fonksiyonlar aşağıdaki gibi olacaktır:

hash = hash_function (anahtar) index = hash% array_size

Burada hash ve dizi boyutları birbirinden bağımsızdır. Dizin değeri, dizi boyutuna göre hesaplanır. Modulo operatörü (%), değeri hesaplamamızı sağlar.

Basit bir ifadeyle, bir hash fonksiyonu, keyfi büyüklükteki veri setini sabit boyutlu bir veri setine eşleyebilen bir fonksiyon olarak tanımlanabilir. Ortaya çıkan sabit boyutlu veri seti, karma tablosunda saklanabilir. Hash fonksiyonu tarafından döndürülen değerlere birçok isim verilir. Hash değerleri, hash değerleri, hash toplamları ve hash kodları olarak adlandırılabilirler..

İyi Bir Hash Fonksiyonu Yazmak

İyi bir hash işlevi veya mekanizması oluşturmak istiyorsanız, bir tane oluşturmanın temel gereksinimlerini anlamanız gerekir. Bunları aşağıda listeleyelim:

  • Karma işlevinin hesaplanması kolay olmalıdır. Bu, yürütmek için çok fazla kaynak gerektirmemesi gerektiği anlamına gelir.
  • Karma işlevin tek tip olarak dağıtılması gerekir. Böylelikle, karma tablolar, karma değerlerin depolanması için kullanılır, böylece kümeleme gerçekleşmez.
  • Son gereklilik, daha az çarpışmanın olması veya hiç çarpışmamasıdır. Çarpışma olmaması, tek bir çıkışın iki girişe eşlenmediği anlamına gelir.

Teknik olarak, çarpışmalar bir hash fonksiyonunun parçasıdır ve bir hash fonksiyonundan çıkarılamaz. Amaç, iyi bir karma tablo performansı sunabilen ve çarpışma çözüm teknikleriyle çarpışmayı çözebilen bir karma işlevi oluşturmaktır..

Neden İyi Bir Hash Fonksiyonuna İhtiyacımız Var??

Yararlı bir hash işlevine olan ihtiyacı anlamak için, aşağıdaki bir örneği inceleyelim.

Giriş dizelerinin aşağıdaki gibi olacağı bir hashing tekniği kullanarak bir Hash tablosu oluşturmak istediğimizi varsayalım: {“agk”, “kag”, “gak”, “akg”, “kga”, “gka”}

Şimdi, basitçe a (97), g (103) ve k (107) ‘nin ASCII değerini ekleyen ve sonra 307 ile toplamın bir modulosunu yapan bir hash fonksiyonu oluşturuyoruz..

Açıkçası, üç sayının toplamı da 307’dir. Bu, tüm sayıları değiştirirsek ve sonra bir modulo işlemi yaparsak, aynı sonucu elde edeceğimiz anlamına gelir. Sonuç, tüm dizeleri aynı dizin numarasına depolamak olacaktır. Karma fonksiyonu için algoritmik zaman, arzu edilmeyen O (n) karmaşıklığı da olacaktır. Açıkladığımız hash fonksiyonunun gerçek hayat senaryoları için optimal olmadığı sonucuna kolayca varabiliriz..

Hash fonksiyonunu düzeltmek için, her bir elemanın ASCII değerlerinin toplamını başka bir asal sayı olan 727’ye bölerek dağıtabiliriz. Bunu yaparak, verdiğimiz girdi dizeleri dizimiz için farklı bir çıktı elde edeceğiz..

Karma Tabloları Öğrenmek

Karma tablolar, indeksi hesaplayan ve ardından ona karşı bir değer depolayan bir hash fonksiyonunun sonucunun depolanmasında çok kullanışlıdır. Sonuç, O (1) karmaşıklığı ile daha hızlı hesaplama süreci olacaktır..

Karma tablolar, O (n) süre gerektiren problemleri çözmede geleneksel olarak iyi bir seçimdir..

Öyleyse, sabit uzunlukta bir dizi alır ve ardından dizenin karakter sıklığını öğrenmeye çalışırsanız.

Dolayısıyla, dizge = “aacddce” ise, genel bir yaklaşım dizeyi birden çok kez gözden geçirmek ve her bir frekansı depolamaktır..

# Bir giriş dizesi sağlayın ve bu dizedeki karakterlerin sıklığını sayın

# Algoritma 0 (n) karmaşıklık süresidir

temp_list = [] start = "a" str = "ababcddefff" def alpha_zeta (): alpha = ‘a’ aralıktaki i için (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): temp_list içindeki her biri için: str içinde i için frek = 0: if (i == her biri): frekans = sıklık + 1 baskı (her biri, sık) character_frequency (str, temp_list)

Yukarıdaki programın çıktısı aşağıdaki gibi olacaktır:

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

Şimdi, C ++ ‘da bir karma tablo uygulayalım ve karakter sıklığını sayalım.

#include ad alanını kullanarak std; int Frekans [26]; int hashFunc (char c) {dönüş (c – ‘a’); } void countFre (string S) {for (int i = 0; i< S. uzunluk (); ++ i) {int indeks = hashFunc (S [i]); Frekans [indeks] ++; } For (int i = 0; i<26; ++ i) {cout << (karakter) (i + ‘a’) << ” << Frekans [i]<< endl; }} İnt main () {cout<<"Selam Dünya"; countFre ("abbaccbdd"); }

Programın çıktısı aşağıdaki gibi olacaktır:

bir 2 b 3 c 2 d 2

Algoritmanın O (N) karmaşıklığı, onu diğer doğrusal yaklaşımlara kıyasla daha hızlı hale getirir.

Çarpışmaları nasıl çözebilirim?

Hash fonksiyonlarında çarpışmaları çözmenin benzersiz yolları vardır. Popüler yollardan biri, açık hash olarak da bilinen ayrı zincirlemedir. Zincirdeki her bir öğenin kendisinin bağlantılı bir liste olduğu bağlantılı bir liste ile uygulanır. Bu yaklaşım, öğelerin depolanmasını ve belirli öğelerin belirli bağlantılı listenin yalnızca bir parçası olmasını sağlayarak çarpışmayı çözmeyi sağlar. Bu, iki giriş değerinin aynı çıkış hash değerine sahip olamayacağı anlamına gelir.

Python’da Hash’i Keşfetme

Bu bölümde, Python’daki hash’e hızlı bir şekilde bakacağız. Python’u seçmemizin nedeni, okunması kolay olması ve herkes tarafından çok fazla sorun yaşamadan kullanılabilmesidir..

Hashing yaygın bir işlev olduğundan, Python kitaplığında zaten uygulanmaktadır. Modülü kullanarak, bir nesneyi girdi olarak sağlayabilir ve ardından karma değeri döndürebilirsiniz..

Karma yönteminin sözdizimi şöyledir:

karma (nesne)

Gördüğünüz gibi, nesne olan tek bir parametreyi alıyor. Nesne tamsayı, kayan nokta veya dize olabilir.

Hash () yönteminin döndürülen değeri girdiye bağlıdır. Bir tamsayı için aynı sayıyı döndürebilir, oysa ondalık ve dize farklı olabilir.

Aşağıda bazı örnekler görelim.

num = 10 deci = 1,23556 str1 = "Nitish" print (hash (num)) print (hash (deci)) print (hash (str1))

Yukarıdaki kodun çıktısı aşağıdaki gibidir:

kriptografide karma oluşturma

Ancak, tüm nesne türlerine karma uygulanamaz. Örneğin, ilk programımızda a’dan z’ye bir liste oluşturduğumuzu hatırlarsanız. Hashing yapmaya çalışırsak, çıktı penceresi TypeError: unhashable type: “list” üzerinden geçecektir.

hashing-in-crpytography-python-error

Bir nesne listesine hashing uygulamak için tuple kullanmanız gerekir.

ünlüler = (‘a’, ‘e’, ​​’i’, ‘o’, ‘u’) print (hash (sesli harfler)) Çıktı ⇒ -5678652950122127926

Kriptografide Hashing

Hashing, kriptografi için faydalıdır. Bitcoin, Merkle ağaçlarını oluşturmak ve yönetmek için hashing kullanır

Ayrıca, hashing, oldukça uzun bir süredir kriptografinin bir parçası olmuştur. Ancak, hashing’in en iyi kullanım şekli, şifreleri hash etmek ve saklamaktır..

Merkle Ağaçları

Merkle ağacı, büyük bir veri havuzunda güvenli veri doğrulaması yapmak söz konusu olduğunda yararlı olan bir veri yapısıdır. Hem Bitcoin hem de Ethereum, verileri açık bir ağda saklarken ve bunlara erişirken birçok teknolojik engeli çözmek için Merkle ağaçlarını kullanır..

Verilere erişmek ve depolamak için yalnızca bir kaynak olduğundan, herhangi bir merkezi ağın verileri saklama ve bunlara erişim konusunda endişelenmesine gerek yoktur. Bununla birlikte, merkezi olmayan bir ağ olduğunda, verilerin artık yüzlerce katılımcı eş arasında kopyalanması gerektiğinden denklem değişir..

Merkle ağaçları, verileri eşler arasında paylaşmanın ve doğrulamanın güvenilir ve verimli bir yolunu sağlayarak sorunu çözer.

merkle-ağaç-örneği

Merkle Ağacı Örneği

Ama neden burada Merkle ağaçlarını tartışıyoruz? Merkle ağaçları, hash’i farklı düğümleri ve veri bloklarını bağlamak için temel işlev olarak kullanır..

Merkle Trees, tüm işlem kümesini özetleyebilen baş aşağı bir ağaçtır..

Merkle ağaçları ve kriptografide nasıl karma kullandığı hakkında daha fazla bilgi edinmek istiyorsanız, ayrıntılı kılavuzumuza bakın: Merkle Ağaçları Rehberi. Orada, Merkle ağaçlarının Bitcoin’de ve diğer kullanım durumlarında nasıl uygulandığını tartıştık..

Madencilik Süreci

Madencilik süreci ayrıca hashing işleminden de yararlanır. Bitcoin madenciliği söz konusu olduğunda, talep olduğunda blok zincirine yeni bir blok eklenir..

Bloğu blok zincirine eklemek için bir yöntemin izlenmesi gerekir. Yeni bir blok geldiğinde bloğun içeriğine bağlı olarak bir hash değeri üretilir. Ayrıca, üretilen hash ağ zorluğundan fazlaysa, bloğu blok zincirine ekleme işlemi başlar..

Bir kez yapıldığında, ağdaki tüm eşler yeni bloğun eklendiğini kabul eder..

Ancak, çoğu durumda ağ zorluğu üretilen hash ile karşılaştırıldığında her zaman daha yüksek olduğu için bu nadiren görülür. Madencilik sürecinde çok önemli bir rol oynayan başka bir husus daha var. O nonce.

Nonce, bloğun karmasına eklenir ve keyfi bir dizedir. Bir kez yapıldığında, birleştirilmiş dize daha sonra zorluk seviyesiyle karşılaştırılır. Zorluk seviyesi birleştirilmiş dizeden daha düşükse, zorluk seviyesi daha yüksek olana kadar nonce değiştirilir..

Süreç aşağıdaki adımlarla özetlenebilir:

  • Yeni bir blok oluşturulduğunda veya alındığında yeni bir hash değeri oluşturmak için içerikler karma hale getirilir.,
  • Yeni bir nonce değeri oluşturulur ve hash’e eklenir
  • Hashing işlemi yeni temas edilen dizede gerçekleşir
  • Karmanın son değeri daha sonra ağın zorluk seviyesiyle karşılaştırılır
  • son hash değeri nonce değerinden düşükse, işlem tekrarlanır. İşlem yalnızca hash değeri nonce değerinden fazla olduğunda durur.
  • Zorluk seviyesi yükseldiğinde blok zincire katılır
  • Madenciler daha sonra yeni bloğu kazma ve ödülleri kendi aralarında paylaşma sorumluluğunu üstlenirler..

“Hash rate” terimi de buradan gelmektedir. Karma oranı, karma işlemlerin gerçekleştiği hızdır. Daha yüksek bir hash oranı, madencilerin madencilik sürecine katılmak için daha fazla hesaplama gücüne ihtiyaç duyacağı anlamına gelir..

Sonuç

Bu bizi kriptografide derinlemesine kılavuzumuzun sonuna götürür. Hashing’i ayrıntılı olarak ele aldık ve arkasındaki kodu da araştırdık.

Peki bunun hakkında ne düşünüyorsun? Aşağıya yorum yapın ve bize bildirin.

#SSS

Kriptografide karma nedir?

Kriptografide, hashing, verimli bir yöntem kullanarak verileri benzersiz bir metin dizesine dönüştürmek için bir yöntemdir. Ayrıca, veri türü veya boyutu konusunda herhangi bir sınırlama yoktur – hashing, hepsinde çalışır..

Hashing kriptografide nasıl kullanılır??

Kriptografi, şifrelere hashing uygulamak veya benzersiz kimlik numaraları oluşturmak için kullanır.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me