Bölüm 9:Açık Anahtarlı Kriptografi
Ağlar'a “Sen”i Katmak yazısının parçası: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine kadar inen uzun bir teknik yolculuk.
Tüm bölümler
- Giriş
- Adres Çubuğundan İsteğe
- Paket Anahtarlamalı Yol
- İsimden Adrese
- Önbellek, Tazelik ve Güven
- Port Numarası ve Soket
- Bağlantısız Taşıma: UDP
- Üç Adımlı El Sıkışma
- Simetrik Şifreleme
- Açık Anahtarlı Kriptografi
- TLS El Sıkışması
- Sertifika Zinciri
- HTTP Mesajının Anatomisi
- Durum, Çerez ve Oturum
- HTTP/2'den HTTP/3'e
- İçerik Dağıtım Ağları
- Diğer Uygulama Protokolleri
- Katmanlı Mimari
- Kapsülleme ve Başlıklar
- Paket Yakalama ve Çözümleme
- Ağ Arayüz Kartı
- Fiziksel Adresleme
- Hata Sezme ve CRC
- Adres Çözümleme: ARP
- Anahtarlama ve Ortam Erişimi
- Ağ Topolojileri
- Sanal Yerel Ağlar
- Kablosuz Erişim: 802.11
- Radyo Kanalı ve Kapasite
- Kablosuz Ağ Güvenliği
- Hücresel Ağlar
- Spektrum ve Kuşaklar
- Hareketlilik ve Aktarma
- Adres Kiralama: DHCP
- Adresin Anatomisi
- Adres Tükenmesi ve IPv6
- Yönlendirici Mimarisi
- Kuyruk Yönetimi
- Cihaz Yapılandırma
- Yönlendirme Protokolleri
- Kontrol Düzlemi ve SDN
- Ağ İzleme ve Yönetimi
- Alanlar Arası Yönlendirme
- Adres Çevirisi
- Ara Kutular
- Tünelleme ve IPsec
- Güvenlik Duvarları
- Operatör ve Metro Ağları
- Bitten Sinyale
- Çoklama Teknikleri
- İletim Ortamları
- Kablo Sonlandırma
- Fiber Optik İletim
- Bakır Erişim Ağı: DSL
- Pasif Optik Ağlar
- Kablo Erişim Ağları
- Denizaltı Kabloları
- Veri Merkezi Ağları
- Kapsülleme Çözme
- Güvenilir Aktarım
- Tıkanıklık Denetimi
- Trafik Çözümleme
- Gecikme Bütçesi
- Son Söz
Şifreleme kuruldu, anahtar hazır. Ama o anahtarı hiç tanışmadığın bir sunucuya nasıl ulaştıracaksın?
Ulaştırmayacaksın: iki taraf hiç tanışmadan, açıkta konuşarak ortak bir sırra varabiliyor.
İki anahtar, biri herkesin gözü önünde
Simetrik şifrelemenin şartı tekti: tek gizli anahtar, iki yön, ve o anahtarı iki tarafın da önceden bilmesi. Şart tam burada patlıyor. Tarayıcın bir sunucuya ilk kez bağlanıyor ve ortada paylaşılmış hiçbir sır yok.
Açık anahtarlı kriptografi anahtarı ikiye ayırıyor. Açık anahtar şifreler; sunucu onu isteyen herkese verir. Özel anahtar çözer, yalnızca alıcıda durur ve hiçbir zaman hatta çıkmaz. Sana kilit veriliyor, anahtar verilmiyor.
Kasa hâlâ ortada duruyor ama artık iki ayrı kombinasyonu var: biri yalnızca kilitliyor, öteki yalnızca açıyor. Kilitleyen kombinasyonu herkese dağıtabilirsin, kasanın içi yine de güvende kalır. Benzetme şurada biter: gerçek bir kasada aynı kombinasyon hem kilitler hem açar, burada iki yön matematiksel olarak birbirinden ayrılmıştır.
Şemanın iki şartı var. Birincisi, iki anahtar birbirini geri almalı: açık anahtarla şifrelenen mesajı özel anahtar aynen açmalı. İkincisi, açık anahtardan özel anahtarı hesaplamak pratikte imkânsız olmalı.
Fikir iki çalışmayla yayımlandı: 1976’da Diffie-Hellman, 1978’de RSA. Aynı fikir kabaca aynı yıllarda Birleşik Krallık’ta da doğmuştu, ama orada gizli tutuldu. İki bin yıldır yalnızca tek anahtarla yürüyen bir alan birkaç yılda ikiye ayrıldı.
Bunun nerede çalıştığını görmek için uzağa gitmen gerekmiyor. Tarayıcın iyi bilinen port numaralarından birine, 443’e bağlanırken de aynı iki anahtar devreye giriyor. Uzak bir makineye kabuk açtığında da öyle. Fark protokolde, fikirde değil.
RSA tek bir işlemin üstünde duruyor
Her bit dizisi tek bir tam sayıya karşılık gelir. Bir mesajı şifrelemek bu yüzden bir sayıyı şifrelemekle aynı şeydir. RSA’nın kullandığı işlem de tek: x mod n, yani x’in n’e bölümünden kalan.
Ad, üç yazarının baş harflerinden geliyor: Rivest, Shamir, Adleman. Anahtar üretimi beş adımda bitiyor. Gerçekte asallar 1024 bit uzunluğunda seçilir; burada elle takip edebilmen için ikisini küçük tuttum.
1. p = 11, q = 13 iki asal seçilir
2. n = 143 n = p · q
z = 120 z = (p-1)(q-1)
3. e = 7 7 ile 120'nin ortak böleni yok
4. d = 103 7 · 103 = 721, 721 mod 120 = 1
5. açık anahtar (143, 7) özel anahtar (143, 103)Modül iki anahtarda da ortak; ayıran şey üs. Şifreleme ile çözme aynı kalıbı iki kez uyguluyor:
şifreleme: c = m^e mod n -> 9^7 mod 143 = 48
çözme: m = c^d mod n -> 48^103 mod 143 = 9Dokuzun yedinci kuvveti 4782969 ediyor ve 143’e bölündüğünde kalan 48. Şifreleme yalnızca n’den küçük m için tanımlı; uzun veri bu yüzden bloklara ayrılıyor.
Güvenlik tek bir varsayıma dayanıyor: büyük bir sayıyı çarpanlarına ayırmak zordur. Özel anahtarı bulmak, n’yi p ile q’ya ayırmakla aynı iştir. 143’ü kafadan çarpanlarına ayırırsın; 2048 bitlik bir n için aynı işi yapan pratik bir yöntem yok.
İkinci özellik daha az bilinir ve bu bölümün sonunu belirler: sıra değiştirilebilir. Önce açık sonra özel anahtar uygulamak da, önce özel sonra açık anahtar uygulamak da mesajı aynen geri verir. İmzanın dayanağı bu simetri.
Bir de bedel var. Üs alma hesap açısından pahalı ve simetrik şifreleme aynı işi en az yüz kat hızlı yapıyor. Bu yüzden açık anahtar veriyi şifrelemek için kullanılmıyor. İkinci bir anahtarı, oturum anahtarını kurmak için kullanılıyor; veriyi o simetrik anahtar şifreliyor.
Açıkta konuşup aynı sayıda buluşmak
Diffie-Hellman anahtar uzlaşması ayrı bir algoritmadır ve bir şifreleme yöntemi değildir. Mesaj taşımaz. Yaptığı tek iş, iki tarafın ortak bir sayıda buluşmasını sağlamak.
Açık değerler büyük bir asal p ve p’den küçük bir taban g. İkisi de herkese açık. Her taraf kendi gizli sayısını bağımsız seçiyor, g’nin o kuvvetini p modülünde hesaplıyor ve çıkan değeri hatta gönderiyor.
açık değerler: p = 97, g = 5
sen gizli 17 -> 5^17 mod 97 = 83 (hatta 83 gider)
karşı gizli 29 -> 5^29 mod 97 = 74 (hatta 74 gider)
sen 74^17 mod 97 = 29
karşı 83^29 mod 97 = 29Aynı sayıya iki ucun ayrı ayrı nasıl vardığını adım adım izleyelim:
p ve ondan küçük bir taban g. İkisi de gizli değil; standartta yazılı olabilir, el sıkışmanın içinde açıkça gönderilebilir. Gizlilik bu iki sayıdan gelmiyor.- İki sayı baştan herkese açık. Büyük bir asal
pve ondan küçük bir tabang. İkisi de gizli değil; standartta yazılı olabilir, el sıkışmanın içinde açıkça gönderilebilir. Gizlilik bu iki sayıdan gelmiyor. - Her taraf kendi gizli sayısını seçiyor. Bu iki sayı makinenin dışına hiç çıkmıyor. Karşı taraf bile öğrenmiyor — ve öğrenmesine gerek de yok, bütün numaranın kalbi bu.
- Hatta yalnızca sonuçlar gidiyor. Her taraf
gnin kendi gizli kuvvetinipmodülünde hesaplayıp gönderiyor. Ters işlem — çıkan sayıdan üssü bulmak — ayrık logaritma problemi ve büyükpiçin pratikte çözülemiyor. - İkisi de aynı sayıya varıyor. Her taraf karşıdan gelen değeri kendi gizli üssüyle yeniden yükseltiyor.
(g^a)^bile(g^b)^aaynı şey olduğu için sonuç eşit çıkıyor. Ortak sır hiç gönderilmedi, iki yerde ayrı ayrı üretildi. - Dinleyen her mesajı gördü ve sonuca varamadı. Hattı baştan sona kaydeden biri dört sayının hepsine sahip. Eksik olan tek şey gizli üslerden biri, ve onu elindeki sayılardan hesaplamak ayrık logaritma almak demek.
Hattan yalnızca dört sayı geçti: 97, 5, 83 ve 74. Gizli sayılar hiç gönderilmedi. Ortak sır da gönderilmedi; iki taraf onu kendi tarafında ayrı ayrı hesapladı. Dinleyen taraf dört sayıyı da görüyor, sırra varamıyor.
Yukarıdaki dört satırı bir hesap makinesinde tekrarlayabilirsin; sonuç her seferinde aynı çıkar. İki tarafın birbirinden habersiz hesapladığı sayı, aynı sayı. Üç mesajlık el sıkışmanın bir gidiş-dönüş bedeli vardı; bu uzlaşma da onun üstüne biniyor. Bugünün güvenli web bağlantısı anahtar değişimi için Diffie-Hellman’ı zorunlu tutuyor; el sıkışmanın bunu nasıl yürüttüğünü 10. bölümde açacağız.
DerinleşmeKarşıdan gelen açık değer neden ayrıca denetleniyor?
TLS 1.3’ü tanımlayan RFC 8446 hatta giden açık değeri tek satırda yazıyor: gönderilen şey Y = g^X mod p’dir. Aynı bölüm kodlamayı da sabitliyor. Değer, en anlamlı baytı başa yazan (big-endian) bir tam sayı olarak yazılır ve p’nin bayt boyuna kadar soldan sıfırla doldurulur. Doldurma bir süs değil: aynı grupta bütün açık değerlerin aynı uzunlukta olması için. ffdhe2048 grubunda p 2048 bit olduğu için hatta giden tek bir açık değer tam 256 bayt tutuyor.
Grup adları da standartta sabit. Sonlu cisim tarafında ffdhe2048 (onaltılık yazımda 0x0100), ffdhe3072 (0x0101) ve ffdhe4096 (0x0102) var; eliptik eğri tarafında secp256r1 (0x0017), x25519 (0x001D) ve x448 (0x001E). Addaki sayı asalın bit uzunluğudur.
Asıl ders standardın dayattığı denetimde. Taraflar karşıdan gelen Y değerinin 1 < Y < p-1 aralığında olduğunu doğrulamak zorundadır. Sebebi şu: özenle seçilmiş bozuk bir Y, karşı tarafı çok az sayıda olası sonuç barındıran küçük bir altkümeye hapsedebiliyor. Hesap yine doğru çalışıyor, sonuç yine üretiliyor, ama tahmin edilebilir hâle geliyor.
Hangi grupta uzlaşıldığını kendi makinende görebilirsin:
openssl s_client -connect www.rfc-editor.org:443 -tls1_3 </dev/null 2>/dev/null | grep 'Temp Key'Çıkan satır uzlaşılan grubun adını taşır; bugün büyük ihtimalle x25519 göreceksin.
Parmak izinden imzaya
Aynı bedel imzayı da şekillendiriyor. İmza mesajın kendisine değil, özetine atılır. Kriptografik özet fonksiyonu girdinin boyu ne olursa olsun sabit uzunlukta bir çıktı üretir.
MD5 RFC 1321’de tanımlı ve dört adımlı bir süreçte 128 bit üretiyor, yani 16 bayt. SHA-1’in künyesi NIST FIPS PUB 180-1 ve çıktısı 160 bit, yani 20 bayt. Onaltılık yazıldığında ilki 32, ikincisi 40 karakter tutuyor.
Eşleme çoktan-bire. Sonsuz sayıda girdi sonlu sayıda çıktıya düştüğü için çakışma matematiksel olarak kaçınılmaz.
Checksum da sabit uzunlukta bir özet üretiyordu ve o da çoktan-bire bir eşlemeydi. Aradaki fark tek bir şartta. Checksum’da aynı değeri veren ikinci bir mesaj üretmek kolaydır; kriptografik özette, verilen bir özetten onu üreten mesajı bulmak hesap açısından yapılamaz olmalıdır. 16 bitlik bir toplam bu şartı karşılamaz.
Burada gizlilikten ayrı bir hedef devreye giriyor. Mesaj bütünlüğü şifrelemeden gelmiyordu; o boşluğu özet fonksiyonu dolduruyor.
Şimdi sayısal imza. Mesajın özeti gönderenin özel anahtarıyla şifrelenir ve mesajla birlikte gider. Doğrulama üç adımdır: imzayı gönderenin açık anahtarıyla çözersin, eline geçen mesajın özetini kendin hesaplarsın, ikisini karşılaştırırsın. Eşitlerse tek işlemle iki soru birden cevaplanmış olur. İmzayı atan özel anahtarı kullanmıştır ve mesaj yolda değişmemiştir.
Simetrik anahtarla bu kanıt kurulamaz. Anahtar iki taraftadır ve o mesajı ikisi de üretebilirdi. Açık anahtarlı imzada ise alıcı mesajı ve imzayı mahkemeye götürüp imzayı atanın kim olduğunu kanıtlayabilir; buna inkâr edilemezlik deniyor.
Aynı matematik, kimlik doğrulamanın kendisinde de aynen çalışıyor. Karşı taraf sana bir nonce yollar. Sen onu özel anahtarınla şifreleyip geri gönderirsin, o senin açık anahtarınla çözüp aynı sayıyı bulur. Kaydedilmiş eski bir cevabın tekrar oynatılması böyle kesilir.
Ama bir boşluk var. Araya giren biri her iki tarafa da öteki taraf gibi görünürse iki ayrı bağlantı kurar ve ikisini birden okur; buna ortadaki adam saldırısı deniyor. Matematik iki uçta da doğru çalıştı; yanlış olan, anahtarın kime ait olduğuydu.
Aynı boşluk imzada da duruyor. Saldırgan kendi açık anahtarını başkasınınmış gibi sunarsa doğrulama kusursuz çalışır ve yanlış kişiyi doğrular. Yetkili sunucudan dönen kaydın doğruluğunu kanıtlayan şey de bir imzaydı ve o imza aynı boşluğun üstünde duruyor. Bir açık anahtarın gerçekten kime ait olduğunu onaylayan sertifika zincirini 11. bölümde kuracağız.
Özet
Peki, ne öğrendik?
- Açık anahtar ikiye ayrılmış tek bir kimliktir: şifreleyen yarısı herkeste durur, çözen yarısı sahibinden hiç ayrılmaz.
- RSA’nın tamamı tek bir modüler üs alma işlemidir ve güvenliği, büyük bir sayıyı çarpanlarına ayırmanın zorluğuna dayanır.
- Diffie-Hellman bir uzlaşmadır: hatta hiç görünmeyen ortak sırrı iki taraf kendi tarafında ayrı ayrı hesaplar.
- İmza mesajın kendisine değil özetine atılır ve tek doğrulamayla hem imzalayanı hem de mesajın değişmediğini kanıtlar.
Anahtar sorunu çözüldü, imza mekanizması elimizde. Simetrik şifreleme, anahtar uzlaşması ve imza artık ayrı ayrı duruyor; peki gerçek bir bağlantı bunları hangi mesajlarla tek bir kanalda birleştiriyor?
10. bölüme devam et: TLS El Sıkışması