20  Diffie-Hellman Anahtar Değişimi

Asimetrik kriptografinin doğuşunu simgeleyen Diffie-Hellman anahtar değişimi, 1976 yılında Whitfield Diffie ve Martin Hellman tarafından yayımlanmıştır. Bu protokol, iki tarafın (geleneksel olarak Alice ve Bob) güvenli olmayan ve herkes tarafından dinlenebilen bir kanal üzerinden, önceden hiçbir gizli bilgi paylaşmadan ortak bir gizli anahtar (shared secret) oluşturmasını sağlar.

Diffie-Hellman bir şifreleme algoritması değil, bir anahtar değişim protokolüdür. Burada üretilen ortak gizli anahtar, sonraki iletişimde verileri çok daha hızlı şifreleyebilen simetrik algoritmalarda (örneğin AES) kullanılır. Protokolün güvenliği, ayrık logaritma probleminin (Discrete Logarithm Problem — DLP) bilgisayarsal zorluğuna dayanır.

Not📌 Temel mantık: renk karışımı analojisi

Diffie-Hellman’ın işleyişi genellikle bir renk karışımı benzetmesiyle açıklanır:

  1. Alice ve Bob herkesin görebileceği ortak bir başlangıç rengi (örneğin sarı) seçer.
  2. Her iki taraf da kimseye göstermediği gizli birer renk seçer (Alice mavi, Bob kırmızı).
  3. Taraflar ortak renk ile kendi gizli renklerini karıştırıp elde ettikleri karışımı birbirlerine gönderir (Alice yeşil, Bob turuncu gönderir). Kanalı dinleyen bir saldırgan, bu karışımlardan orijinal gizli renkleri ayrıştıramaz.
  4. Alice, Bob’dan gelen turuncuya kendi gizli rengi maviyi ekler; Bob ise Alice’ten gelen yeşile kendi gizli rengi kırmızıyı ekler.
  5. Sonuçta her iki taraf da tamamen aynı nihai rengi elde eder.

Modüler üs alma işlemi, bu “karıştırması kolay, ayrıştırması zor” özelliği matematiksel olarak birebir taklit eder.

20.1 🔑 Protokolün Adımları

Diffie-Hellman’ın formal kurgusu modüler aritmetik ve grup teorisi üzerine kuruludur.

1. Kamusal parametrelerin seçimi. Taraflar, herkesin erişebileceği şu iki parametre üzerinde anlaşır:

  • Büyük bir asal sayı \(p\),
  • \(\mathbb{Z}_p^{*}\) çarpımsal grubunun bir üreteci \(g\) (yani \(g\)’nin mod \(p\)’deki kuvvetleri gruptaki tüm elemanları üretmelidir).

2. Gizli ve açık değerlerin üretilmesi.

  • Alice, \(1 < a < p-1\) aralığında rastgele bir gizli tam sayı \(a\) seçer ve açık değerini hesaplayıp Bob’a gönderir: \[A \equiv g^a \pmod p\]
  • Bob, \(1 < b < p-1\) aralığında rastgele bir gizli tam sayı \(b\) seçer ve açık değerini hesaplayıp Alice’e gönderir: \[B \equiv g^b \pmod p\]

3. Ortak gizli anahtarın hesaplanması.

  • Alice, Bob’dan aldığı \(B\) değerini kendi gizli anahtarıyla işler: \[K_A \equiv B^a \pmod p\]
  • Bob, Alice’ten aldığı \(A\) değerini kendi gizli anahtarıyla işler: \[K_B \equiv A^b \pmod p\]

20.2 🔒 Matematiksel Yapı ve Doğruluk İspatı

Tanım 20.1 (Diffie-Hellman Ortak Gizli Anahtarı) Alice ve Bob’un protokol sonunda bağımsız olarak hesapladıkları \(K_A\) ve \(K_B\) değerleri matematiksel olarak birbirine eşittir. Bu ortak değere Diffie-Hellman ortak gizli anahtarı (shared secret) denir:

\[K = K_A = K_B\]

Teorem 20.1 (Protokolün Matematiksel Tutarlılığı) Güvenli olmayan kanal üzerinden iletilen \(A \equiv g^a \pmod p\) ve \(B \equiv g^b \pmod p\) açık değerleri kullanılarak hesaplanan \(B^a \pmod p\) ve \(A^b \pmod p\) değerleri her zaman aynı \(g^{ab} \pmod p\) sonucunu verir.

Alice’in hesaplama adımını ele alalım; Bob’dan gelen \(B\) değerinin \(a\). kuvvetini mod \(p\) altında hesaplamaktadır:

\[K_A \equiv B^a \pmod p\]

Bob’un açık değer üretiminden \(B \equiv g^b \pmod p\) olduğunu biliyoruz. Yerine koyarsak:

\[K_A \equiv (g^b)^a \pmod p\]

Üs kurallarına göre \((g^b)^a = g^{ba} = g^{ab}\) olduğundan:

\[K_A \equiv g^{ab} \pmod p\]

Şimdi Bob’un adımını inceleyelim; Alice’ten gelen \(A\) değerinin \(b\). kuvvetini hesaplamaktadır:

\[K_B \equiv A^b \pmod p\]

Alice’in açık değer tanımından \(A \equiv g^a \pmod p\) olduğunu biliyoruz; yerine koyduğumuzda:

\[K_B \equiv (g^a)^b \equiv g^{ab} \pmod p\]

Görüldüğü üzere her iki işlem de aynı nihai değere ulaşır:

\[K_A \equiv K_B \equiv g^{ab} \pmod p\]

Böylece tarafların gizli anahtarlarını (\(a\) ve \(b\)) kanala hiç vermeden, yalnızca açık bileşenler üzerinden aynı gizli \(K\) değerinde buluşabilecekleri kanıtlanmış olur.

\(\boxtimes\)

Uyarı⚠️ Kritik güvenlik uyarısı: ortadaki adam saldırısı

Diffie-Hellman protokolü, pasif dinleyicilere karşı ayrık logaritma probleminin zorluğu sayesinde güvenlidir. Ancak asıl zayıflığı, kimlik doğrulama (authentication) mekanizmasının bulunmamasıdır.

Alice ve Bob karşı tarafın kimliğini doğrulamadığı için, araya giren aktif bir saldırgan (Eve) Alice’e kendini Bob, Bob’a kendini Alice olarak tanıtabilir. Alice ile ayrı, Bob ile ayrı birer ortak anahtar kurarak tüm iletişimi okuyabilir ve değiştirebilir.

Bu tehlikeyi önlemek için modern sistemlerde Diffie-Hellman adımları dijital imzalar veya sertifikalarla birlikte kullanılır.

20.3 📝 Çözümlü Uygulama

Örnek 20.1 Bir Diffie-Hellman anahtar değişiminde ortak parametreler \(p = 13\) ve üreteç \(g = 2\) olarak belirlenmiştir. Alice gizli değerini \(a = 4\), Bob ise \(b = 3\) olarak seçmiştir. Tarafların üreteceği kamusal açık değerleri ve süreç sonunda elde edecekleri ortak gizli anahtarı adım adım hesaplayınız.

1. Kamusal açık değerlerin üretilmesi.

Alice’in açık değeri: \[A \equiv g^a \pmod p \implies A \equiv 2^4 = 16 \pmod{13}\] \[16 - 13 = 3 \implies A = 3\]

Alice, \(A = 3\) değerini kanal üzerinden Bob’a gönderir.

Bob’un açık değeri: \[B \equiv g^b \pmod p \implies B \equiv 2^3 = 8 \pmod{13} \implies B = 8\]

Bob, \(B = 8\) değerini kanal üzerinden Alice’e gönderir.

2. Ortak gizli anahtarın hesaplanması.

Alice’in hesabı: Bob’dan gelen \(B = 8\) değerini kendi gizli sayısı \(a = 4\) ile işler: \[K_A \equiv 8^4 \pmod{13}\]

Hesabı kolaylaştırmak için \(8^2 = 64 \equiv 12 \equiv -1 \pmod{13}\) denkliğini kullanalım: \[8^4 = (8^2)^2 \equiv (-1)^2 = 1 \implies K_A = 1\]

Bob’un hesabı: Alice’ten gelen \(A = 3\) değerini kendi gizli sayısı \(b = 3\) ile işler: \[K_B \equiv 3^3 = 27 \pmod{13}\] \[27 - 26 = 1 \implies K_B = 1\]

Sonuç: Alice ve Bob gizli sayılarını hiç paylaşmadan \(K = 1\) ortak gizli anahtarında başarıyla buluşmuşlardır.

\(\boxtimes\)

İpucu💡 Neden ortak anahtar 1 çıktı?

Yukarıdaki örnekte \(K = g^{ab} = 2^{12} \pmod{13}\) hesaplanmaktadır. \(2\) sayısı mod \(13\)’te bir primitif kök olduğundan mertebesi \(\phi(13) = 12\)’dir; dolayısıyla \(2^{12} \equiv 1 \pmod{13}\) olur.

Yani \(K = 1\) sonucu bir hata değil, seçilen küçük sayıların (\(ab = 12\) tam olarak mertebeye eşit) yarattığı bir tesadüftür. Gerçek uygulamalarda \(p\) en az 2048 bitlik bir asal seçildiği için böyle bir çakışma pratikte imkânsızdır.