Kriptografik Özet (Hash) Fonksiyonlarına Giriş
Asimetrik ve simetrik şifreleme algoritmaları verinin gizliliğini (confidentiality) sağlarken, dijital dünyada mesajların yolda değiştirilmediğinden (bütünlük - integrity) ve gönderenin gerçekten iddia ettiği kişi olduğundan (kimlik doğrulama - authentication) emin olmamız gerekir. İşte bu noktada modern kriptografinin "İsviçre çakısı" olarak bilinen Kriptografik Özet (Hash) Fonksiyonları devreye girer.
📌 Kısa Tarihçe
Hash fonksiyonu kavramı ilk olarak 1950'lerde Hans Peter Luhn tarafından veritabanlarında metinleri hızlıca aramak ve sınıflandırmak amacıyla bir bilgisayar algoritması olarak ortaya atıldı. 1976'da Diffie ve Hellman'ın asimetrik şifrelemeyi icadıyla birlikte dijital imzalarda kullanılmak üzere kriptografik bir boyut kazandı. Ancak modern kriptografik hash fonksiyonlarının (MD5, SHA serisi) matematiksel bel kemiğini, 1979 ve 1989 yıllarında birbirinden bağımsız olarak çalışan Ralph Merkle ve Ivan Damgård'ın kurduğu mimari oluşturmuştur.
🌍 Nerede ve Nasıl Kullanılır?
Özet fonksiyonları şifreleme yapmazlar (geri döndürülemezler); bunun yerine verinin benzersiz bir "dijital parmak izini" çıkarırlar. Kullanım alanları şunlardır:
- Parola Saklama: Şifreleriniz veritabanlarında düz metin olarak değil, hash değerleri olarak saklanır. Veritabanı çalınsa bile hash'ten orijinal şifreye dönülemez.
- Dosya Bütünlüğü (Checksum): İndirdiğiniz bir dosyanın eksik veya virüslü olup olmadığını kontrol etmek için dosyanın hash değeri yayıncının hash değeriyle karşılaştırılır.
- Dijital İmzalar: Devasa bir PDF dosyasını RSA ile imzalamak saatler sürer. Bunun yerine dosyanın kısa hash'i alınır ve sadece bu hash imzalanır.
- Blokzincir (Blockchain): Bitcoin ve Ethereum gibi ağlarda blokları birbirine kriptografik olarak bağlamak ve madencilik (Proof of Work) yapmak için yoğun olarak SHA-256 hash fonksiyonu kullanılır.
🔒 Matematiksel Tanım ve Güvenlik Kriterleri
Tanım: Kriptografik Özet (Hash) Fonksiyonu
Bir kriptografik hash fonksiyonu
Bu fonksiyonun kriptografik olarak güvenli kabul edilebilmesi için şu üç direnç (resistance) şartını sağlaması zorunludur:
- Ön-görüntü Direnci (Pre-image Resistance - Tek Yönlülük): Sadece
hash değeri biliniyorken, şartını sağlayan orijinal mesajını bulmak bilgisayarsal olarak imkansız olmalıdır. - İkinci Ön-görüntü Direnci (Second Pre-image Resistance): Belirli bir
mesajı elimizdeyken, aynı hash değerini üreten farklı bir mesajı ( ) bulmak ( ) bilgisayarsal olarak imkansız olmalıdır. - Çakışma Direnci (Collision Resistance): Hash değerleri aynı olan herhangi rastgele iki farklı mesaj (
ve ) bulmak bilgisayarsal olarak imkansız olmalıdır. (Güvercin Yuvası Prensibi gereği çakışmalar matematiksel olarak mevcuttur, ancak bulunmaları milyarlarca yıl sürmelidir).
📝 Çözümlü Uygulama: Basit Bir Hash Fonksiyonu
Özet fonksiyonlarının "ön-görüntü (pre-image)" bulma ve "çakışma (collision)" kavramlarını anlayabilmek için, modüler aritmetiğe dayanan çok basit bir hash fonksiyonu tanımlayalım. Gerçek dünyada ters görüntü bulmak imkansız olsa da, bu basit örnekte matematiğin nasıl işlediğini görebiliriz.
Örnek: Basit Hash Fonksiyonu ve Girdi (Ters Görüntü) Bulma
a) Bu fonksiyon için hash özeti
💡 Çözümü Göster / Gizle
a) Ters Görüntü (Pre-image) Bulma: Bizden
Bilinenleri bir tarafa toplayalım (her iki taraftan 5 çıkaralım):
Negatif sayıyı mod 11'de pozitif dengiyle değiştirelim (
Eşitliğin her iki tarafını 4'e bölelim (çünkü 4 ile 11 aralarında asaldır):
Böylece
b) Çakışma (Collision) Çifti Oluşturma: Modüler aritmetiğin doğası gereği, modül değerinin (11) tam katlarını eklediğimizde sonuç değişmeyecektir. Eğer
Sağlamasını yapalım:
Sonuç:
🏗️ Merkle-Damgård Mimarisinin (Construction) Anatomisi
Matematikçiler, "sonsuz uzunluktaki bir veriyi, sabit uzunlukta güvenli bir çıktıya dönüştüren bir fonksiyonu tek seferde nasıl yazarız?" sorusuyla karşılaştılar. Merkle ve Damgård, bu sorunu harika bir zincirleme mantığıyla çözdü. Günümüzde MD5, SHA-1 ve SHA-2 ailelerinin kullandığı bu mimari, süreci küçük bloklara böler.
İşleyiş Mantığı:
- Doldurma (Padding): Gelen sonsuz mesaj, önce önceden belirlenmiş blok boyutunun tam katı olacak şekilde sonuna anlamsız veriler eklenerek tamamlanır. Ayrıca güvenlik gereği, eklenen bu dolgunun en sonuna mesajın orijinal uzunluğu da yazılır (Buna Merkle-Damgård Strengthening denir).
- Sıkıştırma Fonksiyonu (Compression Function): Mimari, koca bir veriyi tek seferde yutmaya çalışmaz. Bunun yerine sadece belirli uzunlukta bir mesaj bloğu ve bir önceki adımın sonucunu alıp sabit uzunlukta çıktı üreten küçük bir
fonksiyonu kullanır. - Zincirleme (Chaining): Sisteme başlangıç için sabit bir Başlangıç Vektörü (IV - Initialization Vector) olan
verilir. Mesaj bloklara ayrılır ve tıpkı bir döngü gibi her blok sırayla sıkıştırma fonksiyonundan geçirilir.
🔍 Ekstra Açıklama: Zincirleme Hesaplama Gerçekte Nasıl Çalışır?
Bu sistemi bir bayrak yarışı gibi düşünebilirsiniz. Elimizde uzun bir mesaj var ve biz bunu
- Isınma (Başlangıç): Yarışa başlamadan önce elimizde sistemin belirlediği sabit bir değer (Başlangıç Vektörü,
) vardır. - 1. Aşama: Fonksiyon, ilk mesaj parçası olan
'i ve başlangıç değerimiz olan 'ı alır. Bu ikisini karıştırır (sıkıştırır) ve yeni bir değer olan 'i üretir. - Matematiksel karşılığı:
- Matematiksel karşılığı:
- 2. Aşama: Artık yeni bayrak
'dir. Fonksiyon sıradaki mesaj bloğunu ( ) alır ve onu bir önceki adımın sonucu olan ile karıştırarak 'yi üretir. - Matematiksel karşılığı:
- Matematiksel karşılığı:
- 3. Aşama (Bitiş): Son mesaj bloğumuz
, bir önceki adımın sonucu olan ile karıştırılır. Başka blok kalmadığı için ortaya çıkan değeri yarışı bitirir. - Matematiksel karşılığı:
- Matematiksel karşılığı:
Sonuç: Zincirin en sonundaki adımda elde ettiğimiz
📌 Ufak Bir Not: Merkle-Damgård Güvenliği
Eğer sistemin tam kalbinde çalışan bu ufak blok bazlı sıkıştırma fonksiyonu (
📝 Çözümlü Uygulamalar: MD Yapısı
Örnek: Bit Düzeyinde Sıkıştırma ve Merkle-Damgård Zincirlemesi
Bu fonksiyonun çıktı kuralı şu şekildedir: İlk bit, girdideki bitlerin toplamının (mod 2) değerini (parite); ikinci bit ise girdinin ortasındaki (ikinci) biti temsil eder.
a)
💡 Çözümü Göster / Gizle
a) Çakışma Analizi (Sıkıştırma Fonksiyonu için): Çakışma,
ve bir çakışmadır. ve bir çakışmadır.
b) Merkle-Damgård Hesaplaması (
Girdi mesajımız
- Adım 1 (Başlangıç):
- Adım 2 (
işlenir): - Adım 3 (
işlenir): - Adım 4 (
işlenir): - Adım 5 (
işlenir):
Nihai Sonuç: Zincirin son elemanı hash değerimizdir.
c) Hash Çakışması Bulma (Ana Fonksiyon için): Hesaplama sürecindeki ara değerlere (durumlara) bakıldığında, 2. adımda elde edilen
Böylece
Örnek: Metin Tabanlı Merkle-Damgård Zincirlemesi
Kendi tasarımımız olan ve Merkle-Damgård mimarisini kullanan
Sistem Kuralları ve
fonksiyonu, gelen mesajını 1 harflik bloklara bölerek işler. Dolayısıyla 4 harfli girdisi için olmak üzere zincirleme mimari gereği iterasyon gereklidir. - Harflerin sayısal değerleri 0-25 tablosuna göredir (A=0, M=12, T=19, H=7).
- Sistemin Başlangıç Vektörü (IV)
olarak sabitlenmiştir. - İçeride çalışan sabit boyutlu sıkıştırma fonksiyonu
, bir önceki iterasyonun durumu ile yeni mesaj bloğunu şu formülle birleştirir: - Buna göre genel hash fonksiyonumuz
, Merkle-Damgård'ın birbirini çağıran zincirleme yapısı gereği şu formülle tanımlanır:
💡 Çözümü Göster / Gizle
İstenen
1. İterasyon (
2. İterasyon (
3. İterasyon (
4. İterasyon (
Sonuç: Bütün mesaj blokları iç içe geçmiş bir şekilde zincirleme kuralla (Merkle-Damgård) işlendiği için son iterasyon değeri bütünüyle
Tabloya göre 13 sayısının karşılığı N harfidir. Böylece "MATH" kelimesinin sistemimizdeki nihai hash (özet) değeri N olarak hesaplanmıştır.