Şifreyi Söylemeden Bildiğini Kanıtlamak: Sıfır Bilgi İspatı Temelleri

Bir kapının önündesiniz ve içerideki görevliye gizli parolayı bildiğinizi kanıtlamanız gerekiyor. Ancak parolayı söylerseniz görevli de onu öğrenmiş olacak! Sıfır Bilgi İspatı, yani Zero-Knowledge Proof (ZKP), tam olarak bu bilmeceyi matematik yardımıyla çözer: Gizli bilginin kendisini paylaşmadan ona sahip olduğunuzu kanıtlarsınız.

sifreyi-soylemeden-bildigini-94

``

Sıfır bilgi ne anlama gelir?

Bir ZKP protokolünde iki taraf bulunur:

  • Kanıtlayıcı (Prover): Gizli bilgiyi bildiğini iddia eder.
  • Doğrulayıcı (Verifier): Bu iddiayı kontrol eder.

Başarılı bir protokol üç temel özelliğe sahip olmalıdır:

Özellik Anlamı Basit yorum
Tamlık Dürüst kanıtlayıcı kabul edilir Şifre doğruysa kapı açılır
Sağlamlık Sahtekârın başarı ihtimali çok düşüktür Bilmeyen kişi kolayca blöf yapamaz
Sıfır bilgi Gizli veri hakkında ek bilgi sızmaz Kapı açılır ama şifre duyulmaz

Buradaki “sıfır”, iletişim kurulmadığı anlamına gelmez. Doğrulayıcı bir transkript görür; fakat bu transkript, gizli anahtarı öğrenmesine yardımcı olmamalıdır.

Schnorr protokolüyle matematiksel sezgi

Klasik bir örnek olan Schnorr kimlik doğrulamasında büyük bir asal mertebeli grup seçilir. $g$ grubun üreteci, $q$ grup mertebesi ve $x$ gizli anahtar olsun. Sunucu yalnızca şu açık değeri bilir:

\[y = g^x\]

Kanıtlayıcı rastgele bir $r$ seçip $t=g^r$ değerini gönderir. Sunucu rastgele bir meydan okuma $c$ üretir. Kanıtlayıcı ise şu yanıtı hesaplar:

\[s = r + cx \pmod q\]

Sunucu aşağıdaki eşitliği kontrol eder:

\[g^s \stackrel{?}{=} t\cdot y^c\]

Eşitliğin çalışması tesadüf değildir:

\[g^s=g^{r+cx}=g^r(g^x)^c=t\cdot y^c\]

Gizli $x$ hiç gönderilmediği hâlde doğru yanıt üretmek için ona ihtiyaç vardır. Her oturumda yeni $r$ kullanılması kritiktir; aynı rastgele değer tekrar kullanılırsa iki farklı yanıttan gizli anahtar hesaplanabilir.

Oyuncak bir Python gösterimi

Aşağıdaki kod gerçek güvenlik sağlamayan küçük sayılarla protokol akışını gösterir:

import secrets

p, q, g = 23, 11, 2       # g, q mertebeli alt grubun üreteci
x = 7                      # Kanıtlayıcının gizli anahtarı
y = pow(g, x, p)           # Sunucunun sakladığı açık değer

r = secrets.randbelow(q)   # Her oturum için yeni rastgele sayı
t = pow(g, r, p)           # Taahhüt

c = secrets.randbelow(q)   # Sunucunun meydan okuması
s = (r + c * x) % q        # Kanıtlayıcının yanıtı

left = pow(g, s, p)
right = (t * pow(y, c, p)) % p
print("Kanıt geçerli mi?", left == right)

Gerçek sistemlerde yüzlerce bitlik güvenli gruplar, standart eğriler ve dikkatle incelenmiş kütüphaneler kullanılır. Kriptografiyi üretim ortamında “kendin yazmak”, yangın tüpünü kartondan yapmak gibidir.

Peki şifre doğrudan $x$ olabilir mi?

Kısa cevap: Olmamalı. İnsan şifreleri düşük entropilidir. Sunucuda $y=g^x$ tutulursa saldırgan olası şifreleri deneyip karşılık gelen açık değerleri karşılaştırabilir. Bu, çevrimdışı sözlük saldırısına dönüşür.

Yaklaşım Risk Daha doğru seçenek
Şifreyi sunucuya gönderme Ağ veya sunucu sızıntısı Güvenli kimlik doğrulama protokolü
Şifreyi doğrudan üs yapma Sözlük saldırısı KDF ve özel protokol
Ev yapımı ZKP Uygulama hataları Denetlenmiş standartlar

Parola tabanlı uygulamalarda OPAQUE gibi artırılmış PAKE protokolleri tercih edilir. ZKP’ler ayrıca anonim kimlik, blokzincir gizliliği ve yaşın 18’den büyük olduğunu doğum tarihini açıklamadan kanıtlama gibi alanlarda kullanılır. Ana fikir büyülüdür ama sihir değildir: Bilginin kendisini değil, yalnızca onunla üretilebilecek matematiksel bir kanıtı paylaşırsınız.

Yorumlar