Ana içeriğe geç

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

7 dakikalık okumaGüncelleme:

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
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. Önbellek, Tazelik ve Güven
  6. Port Numarası ve Soket
  7. Bağlantısız Taşıma: UDP
  8. Üç Adımlı El Sıkışma
  9. Simetrik Şifreleme
  10. Açık Anahtarlı Kriptografi
  11. TLS El Sıkışması
  12. Sertifika Zinciri
  13. HTTP Mesajının Anatomisi
  14. Durum, Çerez ve Oturum
  15. HTTP/2'den HTTP/3'e
  16. İçerik Dağıtım Ağları
  17. Diğer Uygulama Protokolleri
  18. Katmanlı Mimari
  19. Kapsülleme ve Başlıklar
  20. Paket Yakalama ve Çözümleme
  21. Ağ Arayüz Kartı
  22. Fiziksel Adresleme
  23. Hata Sezme ve CRC
  24. Adres Çözümleme: ARP
  25. Anahtarlama ve Ortam Erişimi
  26. Ağ Topolojileri
  27. Sanal Yerel Ağlar
  28. Kablosuz Erişim: 802.11
  29. Radyo Kanalı ve Kapasite
  30. Kablosuz Ağ Güvenliği
  31. Hücresel Ağlar
  32. Spektrum ve Kuşaklar
  33. Hareketlilik ve Aktarma
  34. Adres Kiralama: DHCP
  35. Adresin Anatomisi
  36. Adres Tükenmesi ve IPv6
  37. Yönlendirici Mimarisi
  38. Kuyruk Yönetimi
  39. Cihaz Yapılandırma
  40. Yönlendirme Protokolleri
  41. Kontrol Düzlemi ve SDN
  42. Ağ İzleme ve Yönetimi
  43. Alanlar Arası Yönlendirme
  44. Adres Çevirisi
  45. Ara Kutular
  46. Tünelleme ve IPsec
  47. Güvenlik Duvarları
  48. Operatör ve Metro Ağları
  49. Bitten Sinyale
  50. Çoklama Teknikleri
  51. İletim Ortamları
  52. Kablo Sonlandırma
  53. Fiber Optik İletim
  54. Bakır Erişim Ağı: DSL
  55. Pasif Optik Ağlar
  56. Kablo Erişim Ağları
  57. Denizaltı Kabloları
  58. Veri Merkezi Ağları
  59. Kapsülleme Çözme
  60. Güvenilir Aktarım
  61. Tıkanıklık Denetimi
  62. Trafik Çözümleme
  63. Gecikme Bütçesi
  64. 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 = 9

Dokuzun 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 = 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şlem — çıkan sayıdan üssü bulmak — ayrık logaritma problemi ve 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, 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ı