Hesabın Tarihi · İleri

NSA'nın Sayısı: P-256'nın 26 Yıllık Sırrı

İnternetin kilitlerindeki P-256 eğrisi, NSA'nın kaynağını açıklamadığı bir tohumdan türetilmişti. 26 yıllık sır, 2026'da bir saat değeri ve 1990'lardan kalma zayıf bir rastgele sayı üreteciyle çözüldü.

İnternette kurduğunuz güvenli bağlantıların çoğunda aynı eliptik eğri (elliptic curve) çalışıyor: P-256. Bu eğri, NSA'nın verdiği 40 basamaklı bir sayıdan türetilmişti ve 26 yıl boyunca kimse bu sayının nereden geldiğini bilmiyordu. Ne NIST açıkladı, ne kriptografi dünyası bulabildi. Sırrı Ekim 2026'da Anthropic'teki araştırmacılar çözdü. Cevap, 1997'deki tek bir saniyede ve 1990'lardan kalma zayıf bir rastgele sayı üretecinde saklıydı.

Kırk Basamaklı Sır

P-256, TLS el sıkışmasında (handshake) oturum anahtarı üretmek için kullanılıyor. HTTPS'in kilidi çoğu zaman ona dayanıyor. Parolasız girişler (passkey), telefonlar ve akıllı kartlar da aynı eğriye güveniyor. Yani internetteki güvenliğin büyük bölümü, tek bir matematiksel nesnenin sağlamlığına yaslanıyor. Bu, açık anahtarlı şifrelemenin bir türü: herkesin görebildiği bir kilit, ama anahtarı yalnızca bir kişide. Burada kilit, sayılar yerine eğri üzerindeki noktalarla kuruluyor. Eğride yalnızca birinin bildiği bir zayıflık olsaydı, kilidin aslında kilitli olmadığını yıllarca kimse fark etmezdi. Bu yüzden eğrinin nasıl seçildiği başlı başına bir güvenlik sorusu.

Eğrinin kendisi kısa bir denklem:

E: y2=x3−3x+b(modp),p=2256−2224+2192+296−1E:\ y^2 = x^3 - 3x + b \pmod p, \qquad p = 2^{256} - 2^{224} + 2^{192} + 2^{96} - 1

pp, 256 bitlik bir asal. Eğri üzerindeki noktalar, asal mertebeli ve yaklaşık 22562^{256} elemanlı bir grup kuruyor. Bilinen en iyi genel saldırı (Pollard'ın rho yöntemi) yaklaşık 21282^{128} işlem gerektiriyor. Denklemdeki −3-3 sabit. Geriye tek bir serbestlik kalıyor: bb sabiti.

1b = 5AC635D8 AA3A93E7 B3EBBD55 769886BC 651D06B0 CC53B0F6 3BCE3C3E 27D2604B
2
3Yıl 2000. NIST, FIPS 186-2 standardıyla beş asal eğri yayımlıyor: P-192, P-224, P-256, P-384 ve P-521. Her eğrinin $b$ sabiti, NSA'nın sağladığı bir tohumdan (seed) türetilmiş. Tohum, 20 baytlık yani 160 bitlik bir sayı. Onaltılık yazıyla 40 basamak ediyor:
4
5```text
6P-256 tohumu · FIPS 186-2 (2000)
7
8C49D3608 86E70493 6A6678E1 139D26B7 819F7E90

NSA bu sayıyı vermiş ama nereden geldiğini söylememiş. Ne bir cümle, ne bir kaynak kod, ne bir açıklama. Beş asal eğrinin beşinin tohumu da aynı şekilde açıklamasız. 26 yıl boyunca elimizdeki tek şey bu 40 basamaktı.

Tohumun amacı güven vermekti. Yöntem şöyle işliyor: tohum, SHA-1 tabanlı belirli bir prosedürden geçiriliyor ve çıkan bitler bb sabitini belirliyor. Özet (hash) fonksiyonu tek yönlü. Elinizde önceden seçilmiş bir bb varsa, ona uyan tohumu geriye doğru bulmak yaklaşık 21602^{160} işlem ister. Yani önce eğriyi uydurup sonra ona uyan bir tohum bulamazsınız. Buna kanıtlanabilir rastgele (verifiably random) seçim deniyor. Kriptografide bu tür sabitlerin altın kuralı, herkesin doğrulayabileceği bir kaynaktan gelmeleri. π'nin basamakları gibi. Bunlara İngilizcede "nothing-up-my-sleeve", yani "kolumda numara yok" sayıları deniyor.

Ne var ki bu kanıt tek koşulla işliyor: tohumun gerçekten rastgele ve herkesin görebildiği bir kaynaktan gelmesi. Kaynak görünmüyorsa kanıt, kanıt olmaktan çıkıyor. Tohumu seçen kişi milyonlarca aday denemiş olabilir. Her adayın özetine bakar, çıkan eğriyi sınar, kendisine gizli bir kapı açan zayıf bir eğri veren tohumu bulana kadar devam eder ve yalnızca o tek tohumu yayımlar. Dışarıdan bakan bizler tek bir sayı görürüz ve rastgele sanırız. Denenip elenen milyonlarca adayı görmeyiz. Üstelik deneme sayısını kimse bilemez. Şüphenin tohumu tam olarak buydu ve çeyrek yüzyıl boyunca sönmedi.

Şüphenin Gerekçesi

Şüphe boşuna değildi. 2013'te ortaya çıktı ki NSA destekli başka bir standart gerçekten arka kapılıymış. Dual_EC_DRBG adlı rastgele sayı üretecinde iki sabit nokta yayımlanmıştı: PP ve QQ. Üretecin çıktısı, iç durumu hakkında bilgi sızdırıyor. Q=d⋅PQ = d \cdot P olacak şekilde gizli bir dd bilen biri, çıktının devamını baştan sona tahmin edebiliyor. Arka kapı (backdoor) tam olarak bu: herkese açık görünen ama bir sırrı bilene açılan kilit. Üstelik bu üreteç, RSA'in BSAFE kütüphanesi gibi bazı ürünlerde varsayılan olarak gelmişti. NIST, üreteci standarttan çıkarmak zorunda kaldı. Ama güven bir kez sarsılınca her açıklanamayan sabit şüpheli hâle gelir. Aynı dönem, aynı kurum, aynı açıklanamayan sabitler. P-256 tohumlarına kuşkuyla bakmak artık paranoya sayılmazdı.

2015'te bir ipucu belirdi. Tohumları NIST'e sağlayan NSA çalışanı Jerry Solinas, kaynağın şakacı cümleler olabileceğini hatırladığını söyledi. Örnek verdiği cümle: "Bob ve Jerry'ye zam verin" (İngilizcesi "Give Bob and Jerry a raise"). Yani tohumlar, bu tür İngilizce cümlelerin özeti olabilirdi. Doğru cümleyi bulan, tohumu yeniden üretecek ve sır çözülecekti. Kriptografi topluluğu bu anının peşine düştü ama cümlelerin aslı bulunamadı. Solinas 2023'te hayatını kaybetti. Sır onunla birlikte mezara gitti. Geriye yarım bir anı ve doğrulanamayan tek bir cümle kaldı. Anı ise kanıt sayılmaz.

2023'te Filippo Valsorda ve başka kriptograflar bir ödül ilan etti. Cümlelerin aslını bulan 12.288 dolar kazanacaktı. Para bir hayır kurumuna bağışlanırsa ödül üç katına, 36.864 dolara çıkıyordu. Ödül yıllarca sahibini bekledi. Kimse doğru cümleyi bulamadı, çünkü ortada bulunacak bir cümle yoktu. Cevap bambaşka bir yerdeydi ve kimsenin baktığı türden bir yer değildi.

Saat ve Zayıf Üreteç

Ekim 2026'da Anthropic'teki araştırmacılar, şirketin yapay zekâ modeli Claude'a basit bir soru sordu: bu tohumlar nasıl üretilmiş olabilir? Model, beş asal eğrinin tohumunun da kaynağını yarım saatten kısa sürede buldu. Beşinin de izi aynı yere çıkıyordu. 26 yıllık bilmece böyle çözüldü. Çözümün anahtarı, 1990'ların yazılım alışkanlıklarını bilmekti. Ve çözüm, herkesin yeniden deneyebileceği kadar basitti.

Modelin aklına gelen şey basitti. 1997'de bu işi yapan bir programcının elindeki en kolay araç, Unix C kütüphanesindeki drand48 ailesiydi. Bunlar sözde rastgele üreteçler (pseudorandom generator). Bir tohumla başlarlar, sonra tamamen belirli bir formülle ilerlerler. Tohumu bilen bütün çıktıyı bilir. lrand48, doğrusal eşleşik üreteç (linear congruential generator) denen sınıfın klasik bir örneği. Formülü tek satır:

xn+1=(a⋅xn+c) mod 248,a=0x5DEECE66D=25 214 903 917,c=0xB=11x_{n+1} = (a \cdot x_n + c) \bmod 2^{48}, \qquad a = \texttt{0x5DEECE66D} = 25\,214\,903\,917, \quad c = \texttt{0xB} = 11

srand48 ile başlatma ise durumu şöyle kuruyor; ss, verilen başlangıç değeri:

x0=(s≪16)  ∣  0x330Ex_0 = (s \ll 16) \;|\; \texttt{0x330E}

lrand48 her çağrıda durumun yalnızca üst 31 bitini dışarı veriyor: yn=xn≫17y_n = x_n \gg 17.

Üstelik her üretecin çıktısının kendine özgü bir dokusu vardır. Bitlerin dağılımı ve ardışık baytların ilişkisi, üretecin imzası gibidir. Model de tohumların baytlarını, bilinen üreteçlerin çıktılarıyla karşılaştırdı. İlk ipucu baytların kendisindeydi. Standartta tohumu olan on eğri var: beş asal, beş ikilik. Tohumlar 32 bitlik sözcüklere bölündüğünde, on tohumun dördünde her sözcüğün en üst biti sıfırdı. Rastgele 160 bitlik bir tohum beş sözcük eder. Beş üst bitin birden sıfır gelme olasılığı 2−5=1/322^{-5} = 1/32. On tohumdan en az dördünde bunun görülme olasılığı ise binom hesabıyla:

Pr⁡=∑k=410(10k)(132)k(3132)10−k≈1,7×10−4≈15810\Pr = \sum_{k=4}^{10} \binom{10}{k} \left(\tfrac{1}{32}\right)^{k} \left(\tfrac{31}{32}\right)^{10-k} \approx 1{,}7 \times 10^{-4} \approx \frac{1}{5810}

Tesadüf sayılamayacak kadar belirgin. Ve tam lrand48'in imzası: 48 bitlik durum tutar, dışarıya 31 bit verir. 32 bitlik sözcüğe konunca en üst bit hep sıfır kalır.

İmza üreteci ele veriyor. Geriye durumu geri kazanmak kalıyor. Sözcük sözcük alınan tohumlarda her sözcükte durumun 31 biti görünüyor, 17 biti bilinmiyor. Eksik 17 bitin bütün olasılıkları, yani 217=131.0722^{17} = 131.072 aday deneniyor ve sonraki sözcüklerin tutup tutmadığına bakılıyor. P-256 gibi asal eğrilerde ise her çağrıdan yalnızca bir bayt alınmış: (x≫17)≫23=x≫40(x \gg 17) \gg 23 = x \gg 40, yani durumun en üst 8 biti. Adım başına 40 bit bilinmiyor. Kesikli doğrusal üretecin durumunu bu kadar az bitten geri kazanmak, ders kitaplarında kafes (lattice) problemi olarak geçen standart bir iş. Ardışık durumlar aynı doğrusal formülle bağlı olduğundan, bilinmeyen bitler bir kafesin kısa vektörü hâline geliyor ve LLL algoritmasıyla bulunuyor.

Durum ele geçince üreteç geriye doğru sarılabiliyor. aa tek sayı olduğu için mod 2482^{48}'de çarpmaya göre tersi var:

xn=a−1⋅(xn+1−c) mod 248x_n = a^{-1} \cdot (x_{n+1} - c) \bmod 2^{48}

Geriye sara sara, alt 16 biti tam 0x330E\texttt{0x330E} olan bir duruma ulaşılıyor: srand48'in başlangıç biçimi. Üstteki bitler ss değerini veriyor ve her seferinde bu bir Unix zamanı çıkıyor. Unix zamanı (Unix time), 1 Ocak 1970'ten beri geçen saniye sayısı. 1990'larda bir programı rastgele başlatmanın standart yolu buydu. Program çalışırken saate bakar, o sayıyı tohum yapar. Oyunlar için yeterince iyi bir yöntem. Bir standardın anahtarını üretmek için korkunç. Çünkü saat, herkesin tahmin edebileceği bir sayı. Saniye hassasiyetinde dar bir aralıkta taranabilir. Hatta burada taramaya bile gerek kalmadı. Tohum, nereden geldiğini kendisi ele verdi.

Araştırmacıların bulduğu yöntem birkaç satır Python'a sığıyor:

1import calendar
2
3def lrand48_bytes(seconds, count):
4    state = (seconds << 16) | 0x330E              # srand48(saniye)
5    for _ in range(count):
6        state = (0x5DEECE66D * state + 0xB) % 2**48  # lrand48 adımı
7        yield (state >> 17) >> 23                 # üst 8 bit: 1 bayt
8
9t = calendar.timegm((1997, 8, 16, 1, 52, 34))     # 16 Ağustos 1997 UTC
10data = bytes(lrand48_bytes(t, 20 * 1842))
11print(data[-20:].hex().upper())                   # P-256 tohumu

Kodun yaptığı şu. calendar.timegm ile 16 Ağustos 1997, 01:52:34 UTC'nin Unix karşılığı hesaplanıyor. Bu, 871.696.354. saniye. Üreteç bu saniyeyle başlatılıyor ve her adımda bir bayt üretiliyor. Programcının düzeneği şöyle görünüyor: üreteçten ardışık 20 baytlık bloklar alınıyor, her blok bir tohum adayı olarak deneniyor, adaydan eğri türetilip geçerlilik sınamaları uygulanıyor. Her aday 20 bayt olduğundan, 1.842 numaralı adayı görmek için 20×1.84220 \times 1.842 bayt üretip son 20'sine bakıyoruz. Kod bir saniyede bitiyor. Çıktı:

1C49D360886E704936A6678E1139D26B7819F7E90

Standartta yayımlanan tohumla bire bir aynı. Yani P-256'nın tohumu, o gece saat 01:52'de başlatılan bir üretecin 1.842. adayıymış. Bu eşleşme, kaynağın artık tartışma götürmez olduğu anlamına geliyor. Tekrar çalıştırın, sonuç değişmez. Tohum saatse, çıktı da o saattir.

Geri sarma adımını kendiniz denemek isterseniz o da birkaç satır:

1A, C, M = 0x5DEECE66D, 0xB, 2**48
2A_INV = pow(A, -1, M)                      # a tek sayı: mod 2^48'de tersi var
3
4def geri(state):
5    return (A_INV * (state - C)) % M       # bir adım geriye

Durumun alt 16 biti 0x330E olana kadar geriye sarın. state >> 16 size o geceki saniyeyi verir.

Aynı yöntem beş eğride de işe yaradı:

1Eğri    Başlangıç (UTC)          Aday
2P-192   18 Mayıs 1997  14:45:34    139
3P-224    3 Nisan 1998  12:52:07  7.026
4P-256   16 Ağus  1997  01:52:34  1.842
5P-384   30 Ağus  1997  14:50:08  2.688
6P-521    8 Ağus  1997  01:12:04  1.136

Tarihler 1997 ve 1998'e, yani standardın hazırlandığı yıllara oturuyor. Aralarında aylar var. Aynı program, farklı günlerde birkaç kez çalıştırılmış gibi görünüyor. Bu uydurma bir açıklama değil. Her satır, saatiyle ve aday numarasıyla bire bir yeniden üretilebiliyor. Beş tohumun beşi de aynı basit düzeneğin ürünü.

Valsorda yöntemi Go dilinde baştan yazdı ve sonuçları doğruladı. İki bağımsız uygulama, aynı baytları üretiyor. Ödül, 15 Ekim 2026'da araştırma ekibine verildi. 36.864 dolar, Let's Encrypt'in çatı kuruluşu ISRG'ye bağışlandı. Yani ödül, internete ücretsiz güvenlik sertifikası sağlayan kâr amacı gütmeyen kuruluşa gitti. Solinas'ın hatırladığı cümlelerse hiç var olmamış görünüyor. İnsan belleği 18 yıl sonra böyle oyunlar oynayabiliyor. Kayıtlara geçen tek gerçek, saatler ve üreteç.

30 Bitlik Özgürlük

Bu buluş yalnızca merakı gidermiyor, şüpheyi de dağıtıyor. Çünkü saat ve zayıf üreteç, sonucu yönlendirmeye neredeyse hiç yer bırakmıyor. Cömert bir hesap yapalım. Tohumu üreten kişi 1997 ve 1998'deki her saniyeyi seçebilmiş, ilk 16 geçerli adaydan herhangi birini alabilmiş olsun:

N=2×365,25×86 400⏟iki yılın saniyeleri×16⏟aday≈6,3×107×16≈230≈109N = \underbrace{2 \times 365{,}25 \times 86\,400}_{\text{iki yılın saniyeleri}} \times \underbrace{16}_{\text{aday}} \approx 6{,}3 \times 10^{7} \times 16 \approx 2^{30} \approx 10^{9}

Yani ulaşılabilecek en fazla yaklaşık 1 milyar farklı eğri vardı. Gizlice zayıf eğri avlamak için bilinen yöntem ise yaklaşık 270≈10212^{70} \approx 10^{21} seçenek istiyor. Bernstein ve Lange'in 2017'deki çalışması bu. Aradaki fark 2402^{40}, kabaca bir trilyon kat. 1 milyar seçenek arasında o kadar nadir bir eğrinin denk gelme olasılığı yaklaşık 2−402^{-40}. Yok denecek kadar az. Burada sınırlayıcı olan bilgisayar gücü değil, seçenek sayısı. Tohumu üreten kişinin elinde, zayıf bir eğri bulacak kadar deneme hakkı yoktu. 40 bitlik fark, şüphenin kaderini değiştiriyor.

Araştırmacıların değerlendirmesi net. Bu bulgu, eğrilerin arka kapısız ve kasıtlı zayıflık olmadan seçildiğine olan güveni artırıyor. 26 yıllık şüphenin cevabı kötü niyet çıkmadı. Dönemin sıradan bir alışkanlığı çıktı. Bir saat, bir üreteç ve birkaç bin aday. NSA'nın tohumu üreten programcısı muhtemelen elindeki en kolay aracı kullandı ve o araç, 26 yıl sonra her şeyi açık etti. Bazen en derin sırların arkasında en sıradan açıklamalar oluyor.

Dosya yine de tam kapanmadı. Aynı çalıştırmada 876. aday da geçerli bir eğri veriyor ama atlanmış. Üstelik geçerli adayların yaklaşık yarısı, bilinmeyen ikinci bir kuralla elenmiş. Bu kuralın ne olduğunu kimse bilmiyor. Eğrilerin taban noktalarının ve B-163 tohumunun kaynağı da hâlâ açık. Bilim böyle ilerliyor: her cevap yeni bir soru getiriyor. Belki 876'nın sırrını çözecek olan sizsiniz.

Bu hikâyeden iki ders çıkıyor. Birincisi: tohumla başlayan rastgelelik rastgele değildir. Tohum bir saatse, çıktıyı herkes yeniden üretebilir. Parolanızı ya da anahtarınızı böyle bir üreteçle üretmek, kapıyı ardına kadar açık bırakmak demek. Güvenlikte kullanılan rastgeleliğin öngörülemez bir kaynaktan gelmesi gerekir. Bugün işletim sistemleri bunun için özel kaynaklar sunuyor. Python'da karşılığı secrets modülü:

1import secrets
2tohum = secrets.token_bytes(20)   # işletim sisteminin rastgelelik kaynağından 20 bayt
31997'nin programcısı kötü niyetli değildi. Yalnızca elindeki aracı kullandı. Ama araç, işe göre zayıftı.
4
5İkinci ders: bir tohum, ancak kaynağını herkes görebiliyorsa kanıttır. NSA'nın sayısı 26 yıl boyunca kanıt değil, bilmecedeydi. Artık kaynağını biliyoruz. Eğriye güvenmek için eskisinden daha sağlam bir nedenimiz var. Güven, gizlilikle değil görünürlükle kuruluyor. Denemek isterseniz kod bir saniyede çalışıyor. Bölümün koduna ve kaynaklarına açıklamadaki bağlantılardan ulaşabilirsiniz. Araştırmacıların bulduğu o saniyeyi siz de kendi bilgisayarınızda yeniden üretebilirsiniz. Çıkan sayı, standarttaki tohumla bire bir aynı olacak. Sıfırdan bire.
6
7## Özet
8
9- NIST'in beş asal eğrisinin (P-192'den P-521'e) açıklamasız tohumlarını Ekim 2026'da Anthropic'teki araştırmacılar çözdü: hepsi, srand48'e o anın Unix saati verilerek başlatılan lrand48 üretecinin çıktısından alınmış.
10- P-256'nın tohumu, 16 Ağustos 1997, 01:52:34 UTC'de (Unix zamanı 871.696.354) başlatılan üretecin 1.842. adayı. Birkaç satır Python ile bir saniyede, bire bir yeniden üretilebiliyor.
11- Üreteci ele veren şey imzasıydı: 32 bitlik sözcüklerde en üst bitin hep sıfır olması (on tohumdan dördünde; olasılık ≈ 1/5810). Eksik bitler kaba kuvvetle ve LLL kafes indirgemesiyle geri kazanıldı. Üreteç geriye sarılınca başlangıç değerleri saat çıktı.
12- Bulgu şüpheyi dağıtıyor: üretenin toplam serbestliği ≈ 30 bit (≈ 1 milyar eğri), gizlice zayıf eğri avı için gereken ≈ 70 bitin (Bernstein–Lange, 2017) trilyon kat altında. Eğriyi seçme şansı yoktu.
13- Hâlâ açık: atlanan 876. aday, geçerli adayların yarısını eleyen bilinmeyen ikinci kural, taban noktaları ve B-163 tohumu. Ve iki ders: güvenlikte rastgelelik öngörülemez kaynaktan gelmeli; bir tohum ancak kaynağı görünürse kanıt sayılır.