Ana içeriğe geç

Bölüm 10: Açık Anahtarlı Kriptografi

8 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak kitabının bir bölümü: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine inip karşı taraftan geri dönen uzun bir teknik yolculuk.

Kısım 2: Bağlantı Kuruluyor (Bölüm 6-12)

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. DNS Kayıtları
  6. Önbellek, Tazelik ve Güven
  7. Port Numarası ve Soket
  8. Bağlantısız Taşıma: UDP
  9. Üç Adımlı El Sıkışma
  10. Simetrik Şifreleme
  11. Açık Anahtarlı Kriptografi
  12. TLS El Sıkışması
  13. Sertifika Zinciri
  14. HTTP Mesajının Anatomisi
  15. Durum, Çerez ve Oturum
  16. HTTP/2'den HTTP/3'e
  17. İçerik Dağıtım Ağları
  18. Diğer Uygulama Protokolleri
  19. Katmanlı Mimari
  20. Hizmet ve Protokol
  21. Encapsulation ve Başlıklar
  22. Paket Yakalama ve Çözümleme
  23. Ağ Interface Kartı
  24. Fiziksel Adresleme
  25. Hata Sezme ve CRC
  26. Adres Çözümleme: ARP
  27. Ortam Erişimi: CSMA/CD
  28. Switch'ler
  29. Ağ Topolojileri
  30. Sanal Yerel Ağlar
  31. Kablosuz Erişim: 802.11
  32. Radyo Kanalı ve Kapasite
  33. Kablosuz Ağ Güvenliği
  34. Hücresel Ağlar
  35. Spektrum ve Kuşaklar
  36. Hareketlilik ve Aktarma
  37. Adres Kiralama: DHCP
  38. Adresin Anatomisi
  39. Adres Tükenmesi ve IPv6
  40. Router Mimarisi
  41. Kuyruk Yönetimi
  42. Cihaz Yapılandırma
  43. Routing Protokolleri
  44. Kontrol Düzlemi ve SDN
  45. Ağ İzleme ve Yönetimi
  46. Alanlar Arası Routing
  47. Adres Çevirisi
  48. Ara Kutular
  49. Tünelleme ve IPsec
  50. Firewall'lar
  51. Ağ Saldırıları
  52. Operatör ve Metro Ağları
  53. Bitten Sinyale
  54. Sembol Hızı ve Kanal Kapasitesi
  55. Multiplexing Teknikleri
  56. İletim Ortamları
  57. Bakır Kablo Sonlandırma
  58. Fiber Sonlandırma
  59. Fiber Optik İletim
  60. Bakır Erişim Ağı: DSL
  61. DSL'de Hız ve Mesafe
  62. Pasif Optik Ağlar
  63. Kablo Erişim Ağları
  64. Kablo Modem ve CMTS
  65. Denizaltı Kabloları
  66. Veri Merkezi Ağları
  67. Encapsulation Çözme
  68. Güvenilir Aktarım
  69. Tıkanıklık Denetimi
  70. Trafik Çözümleme
  71. Gecikme Bütçesi
  72. Soket Programlama
  73. Eşten Eşe ve Protokol Tasarımı
  74. Uyarlanır Video Akışı
  75. Gerçek Zamanlı Ses ve Görüntü
  76. Kablosuz Sensör Ağlarının Mimarisi
  77. Sensör Ağlarında Ortam Erişimi
  78. Sensör Ağlarında Yönlendirme ve IP
  79. Zaman Eşitleme ve Konum Bulma
  80. Sensör Ağı Uygulamaları
  81. Mobil Kablosuz Sensör Ağları
  82. 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. Benzetmenin tutmadığı yer ters yön: kasada açan kombinasyonla kilitlemek anlamsızdır, burada ise özel anahtarla kilitlenen şeyi herkes açık anahtarla açabiliyor. Bu tuhaflık bölümün sonunda imzayı doğuracak.

Ş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 birkaç yıl önce Birleşik Krallık’ın istihbarat kurumu GCHQ’da da bulunmuştu ama 1997’ye kadar 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 443 numaralı porta 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 2048 bitlik bir anahtar için asalların her biri 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 = 9

Dokuzun yedinci kuvveti 4.782.969 ediyor ve 143’e bölündüğünde kalan 48. Şifreleme yalnızca n’den küçük m için tanımlı; RSA’nın uzun veriyi doğrudan şifrelemek için kullanılmamasının sebeplerinden biri bu.

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. Açık yarışmalarda bugüne kadar çarpanlarına ayrılabilen en büyük RSA sayısı 829 bit; o da 2020’de, binlerce işlemci yılı harcanarak çözüldü.

Varsayımı sarsabilecek tek aday kuantum bilgisayar. Yeterince büyük bir kuantum bilgisayar, Shor algoritmasıyla hem çarpanlara ayırmayı hem de birazdan göreceğin Diffie-Hellman’ın dayandığı problemi çözebilir. Böyle bir makine henüz yok ama bugün kaydedilen trafik yarın çözülebilir; bu yüzden anahtar uzlaşması şimdiden kuantuma dayanıklı algoritmalarla eşleniyor.

İ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 = 29

Aynı sayıya iki ucun ayrı ayrı nasıl vardığını adım adım izleyelim:

Açıkta konuşup aynı sayıda buluşmak
senkarşı tarafp = 97 · g = 5gizli a = 17gizli b = 295^17 mod 97 = 835^29 mod 97 = 7474^17 mod 97 = 2983^29 mod 97 = 29dinleyenin gördüğü her şey: 97 · 5 · 83 · 7417, 29 ve ortak sır 29 hattan hiç geçmedi
İki sayı baştan herkese açık. Büyük bir asal 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.
  1. İki sayı baştan herkese açık. Büyük bir asal 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.
  2. 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.
  3. Hatta yalnızca sonuçlar gidiyor. Her taraf gnin kendi gizli kuvvetini p modülünde hesaplayıp gönderiyor. Ters işlemin, yani çıkan sayıdan üssü bulmanın adı ayrık logaritma problemi; büyük p için pratikte çözülemiyor.
  4. İkisi de aynı sayıya varıyor. Her taraf karşıdan gelen değeri kendi gizli üssüyle yeniden yükseltiyor. (g^a)^b ile (g^b)^a aynı şey olduğu için sonuç eşit çıkıyor. Ortak sır hiç gönderilmedi, iki yerde ayrı ayrı üretildi.
  5. 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; 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ü 11. 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ğunu anlatıyor. Listeye sonradan hibrit gruplar eklendi: X25519MLKEM768 (0x11EC), x25519’u kuantuma dayanıklı ML-KEM algoritmasıyla aynı el sıkışmada birleştiriyor. Saldırganın ikisini birden kırması gerekiyor; bunun el sıkışmaya kaç bayt eklediğini 11. bölümde hesaplayacağız.

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 -E 'Temp Key|group'

Çıkan satır uzlaşılan grubun adını taşır. Güncel bir OpenSSL ile büyük ihtimalle Negotiated TLS1.3 group: X25519MLKEM768 göreceksin; kuantum sonrası hibrit grup çoktan gündelik trafiğe girmiş durumda. Eski sürümler aynı bilgiyi Server Temp Key satırında x25519 olarak veriyor.

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.

İkisi de bugün kırık: aynı özeti veren iki ayrı girdi üretmek MD5’te saniyeler, SHA-1’de büyük ama satın alınabilir bir hesap gücü istiyor. Bugünkü imzalar ve sertifikalar bu yüzden 256 bitlik SHA-256 ile atılıyor; iki eski ad burada yalnızca fikri anlatmak için duruyor.

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 şartlarda. Checksum’da aynı değeri veren ikinci bir mesaj üretmek kolaydır; kriptografik özette ise bu hesap açısından yapılamaz olmalıdır. Aynı özeti veren herhangi iki mesajı bulmak da öyle; MD5 ile SHA-1’i emekliye ayıran şey bu ikinci şartın çökmesiydi. 16 bitlik bir toplam iki şartı da 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. “Özeti özel anahtarla şifrelemek” anlatımı RSA’ya özgü; eliptik eğri imzaları aynı sonuca başka bir hesapla varıyor ama sözleşme aynı kalıyor: imzayı yalnızca özel anahtar üretebilir, herkes açık anahtarla doğrulayabilir.

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 MITM 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 12. bölümde kuracağız.

Özet

  • 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?

11. bölüme devam et: TLS El Sıkışması