Ders 04 / 21
Simetrik Şifreleme
Paylaşılan anahtarın güven kökü ve dağıtım aritmetiği: çözmenin anahtar, nonce, etiket ve gövde olmak üzere dört kalemin aynı anda doğru olmasına bağlı olması, çift başına anahtar düzeninde 12.401 uçta 7,69×10^7 anahtar kalemi gerekmesi, yıldız düzeninin bu sayıyı 12.400'e indirirken merkezi tek köke çevirmesi ve tek ortak anahtar düzeninde bir kalemin düşmesinin bütün bağlantıları düşürmesi.
İçindekiler
Önceki üç ders tek yönlü işlemlerin etrafında döndü ve amaç zaten geri dönmemekti. Kurgu ölçüm ağının asıl trafiği ise geri dönmek zorundadır: sahadan gelen okuma merkezde açılıp faturaya dönüşür. Birinci derste bu işlem iki kaleme bağlanmıştı — anahtar ve bozulmamış şifreli metin. Bu ders o birinci kalemi asıl sorunuyla birlikte ele alır. Aynı anahtarı iki tarafın da bilmesi gerekiyorsa, o anahtar oraya nasıl gitti ve kaç tane tutuluyor?
Soru bir kolaylık sorusu değildir. Anahtar sayısı, bu kursun ikinci sütununun — kaç kalem aynı anda doğru olmalı — doğrudan karşılığıdır ve katılımcı sayısıyla birlikte nasıl büyüdüğü sayılabilir.
Aynı Anahtar İki Tarafta
KT11: simetrik şifrelemede şifreleyen ve çözen taraf aynı anahtarı kullanır. Güven kökü, o anahtarın yalnızca bu iki tarafta bulunmasıdır.
KT12: çözmenin gerçekleşmesi için anahtar, nonce (her şifreleme için bir kez kullanılan değer), doğrulama etiketi ve şifreli gövde aynı anda doğru olmalıdır; dört kalemden biri bozuksa çözme yapılmaz.
// sim/kip.mjs — simetrik sifrelemede kokten kullanima kadar ayni anda dogru olmasi // gereken kalemler gercekten sayilir. Kurgu bolgesel olcum agindan bir sayac okumasi // AES-256-GCM ile sifrelenir. Anahtar sabit tohumdan turetilir; rastgelelik yok. import { createCipheriv, createDecipheriv, scryptSync } from "node:crypto"; // KT11: simetrik sifrelemede sifreleyen ve cozen taraf ayni anahtari kullanir; guven // koku, o anahtarin yalnizca bu iki tarafta bulunmasidir. // KT12: cozmenin gerceklesmesi icin anahtar, nonce ve dogrulama etiketi ayni anda // dogru olmalidir; uc kalemden biri bozuksa cozme yapilmaz. const OKUMA = "SAY-4417|2026-03-01T06:00Z|41982"; const K = (t) => scryptSync(t, "kurgu-tuz", 32, { N: 2 ** 12, r: 8, p: 1 }); const ANAHTAR = K("sube-01-merkez"), BASKA = K("sube-02-merkez"); const N1 = Buffer.alloc(12, 1), N2 = Buffer.alloc(12, 2); function sifrele(m, anahtar, nonce) { const s = createCipheriv("aes-256-gcm", anahtar, nonce); return { govde: Buffer.concat([s.update(m, "utf8"), s.final()]), etiket: s.getAuthTag() }; } function coz({ govde, etiket }, anahtar, nonce) { const c = createDecipheriv("aes-256-gcm", anahtar, nonce); c.setAuthTag(etiket); return Buffer.concat([c.update(govde), c.final()]).toString(); } const dene = (f) => { try { return f() === OKUMA ? "evet" : "hayir"; } catch { return "hayir"; } }; const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); const paket = sifrele(OKUMA, ANAHTAR, N1); const bozuk = { govde: Buffer.from(paket.govde), etiket: paket.etiket }; bozuk.govde[2] ^= 1; const D = [-9, -8, -8, -8, 9]; yaz(D, "anahtar", "nonce", "etiket", "govde", "cozuldu"); for (const [a, n, e, g, f] of [ ["dogru", "dogru", "dogru", "saglam", () => coz(paket, ANAHTAR, N1)], ["yanlis", "dogru", "dogru", "saglam", () => coz(paket, BASKA, N1)], ["dogru", "yanlis", "dogru", "saglam", () => coz(paket, ANAHTAR, N2)], ["dogru", "dogru", "yanlis", "saglam", () => coz({ ...paket, etiket: Buffer.alloc(16) }, ANAHTAR, N1)], ["dogru", "dogru", "dogru", "bozuk", () => coz(bozuk, ANAHTAR, N1)], ]) yaz(D, a, n, e, g, dene(f)); console.log("\nayni anahtar, ayni duz metin:"); const p1 = sifrele(OKUMA, ANAHTAR, N1).govde.toString("base64"); const p2 = sifrele(OKUMA, ANAHTAR, N1).govde.toString("base64"); const p3 = sifrele(OKUMA, ANAHTAR, N2).govde.toString("base64"); console.log(" ayni nonce ile iki sifreleme esit mi :", p1 === p2 ? "evet" : "hayir"); console.log(" ayri nonce ile iki sifreleme esit mi :", p1 === p3 ? "evet" : "hayir"); console.log(" ayni anda dogru olmasi gereken kalem : 4 (anahtar, nonce, etiket, govde)");
anahtar nonce etiket govde cozuldu dogru dogru dogru saglam evet yanlis dogru dogru saglam hayir dogru yanlis dogru saglam hayir dogru dogru yanlis saglam hayir dogru dogru dogru bozuk hayir ayni anahtar, ayni duz metin: ayni nonce ile iki sifreleme esit mi : evet ayri nonce ile iki sifreleme esit mi : hayir ayni anda dogru olmasi gereken kalem : 4 (anahtar, nonce, etiket, govde)
Beş satırın yalnız biri evet verir. Zincirin dört kalemi de aynı anda doğru olmak zorundadır
ve bu, birinci derste ikiyle sayılan zincirin bu çalışma kipindeki tam açılımıdır. Dördünün
görevleri ayrıdır: anahtar gizliliği, nonce her şifrelemenin ayrı çıkmasını, etiket ve gövde
birlikte bütünlüğü taşır.
Son iki satır nonce’un neden zincirde ayrı bir kalem olduğunu gösterir. Aynı anahtar ve aynı nonce ile şifrelenen aynı düz metin, aynı şifreli metni verir. Bu, ikinci derste karma için ölçülen belirlenimciliğin şifrelemedeki karşılığıdır ve aynı sonucu doğurur: iki kayıt eşitse çıktıları da eşittir. Kurgu ölçüm ağında bunun anlamı, aynı okumayı gönderen iki sayacın paketlerinin birbirinden ayırt edilemez olmasıdır. Nonce’un görevi gizlilik değil, eşitliği bozmaktır — tuzun parola kaydındaki görevinin aynısı.
Nonce gizli değildir ve paketle birlikte taşınır; tek koşulu aynı anahtarla iki kez kullanılmamasıdır. Bu koşul zincirin sessiz kalemidir: unutulduğunda hiçbir hata iletisi üretmez, yalnızca çıktılar eşitlenmeye başlar.
Bir Anahtar Kaç Mesaj Taşır
Nonce koşulunun sayılabilir bir sınırı vardır ve o sınır bu kipte 96 bitliktir. Nonce her mesaj için rastgele seçiliyorsa, iki mesajın aynı nonce’a düşmesi ikinci dersteki doğum günü sınırına tabidir: 96 bitlik uzayda beklenen çakışma yaklaşık 2^48 mesajda, yani 2,8×10^14 mesajda doğar.
Kurgu ağda bu sayı bir kısıt oluşturmuyor. 12.400 uç günde yirmi dörder okuma gönderirse günlük mesaj sayısı 297.600’dür; sınıra ulaşmak 9,5×10^8 gün, yani iki buçuk milyon yıldan fazla sürer. Yine de sayının varlığı bir tasarım kararına dönüşür, çünkü mesaj hacmi büyüyen bir kurulumda aynı hesap farklı bir sonuç verir.
İkinci seçenek nonce’u rastgele seçmek yerine bir sayaçla üretmektir. O durumda çakışma olasılığı sıfırlanır ve sınır 2^96 mesaja çıkar; ama zincire yeni bir kalem eklenir — sayacın yeniden başlatmalar boyunca kalıcı olması. Rastgele nonce durum tutmaz ve sayılabilir bir sınır taşır; sayaçlı nonce sınırı kaldırır ve bir kalıcı durum kalemi getirir. İkisi arasındaki seçim, kurulumun uçlarında kalıcı durum tutulup tutulamayacağına bakar.
Anahtar uzunluğu ise ayrı bir sütundur ve tükenmesi beklenen bir kalem değildir. AES’in blok boyutu 128 bit, anahtar uzunluğu 128, 192 ya da 256 bittir; 256 bitlik anahtarın arama uzayı 2^256’dır ve bu sayı ikinci derste yazılan ön görüntü sınırıyla aynı mertebededir. Zincirdeki kırılgan kalem anahtarın uzunluğu değil, anahtarın nerede durduğu ve oraya nasıl gittiğidir.
Anahtar Dağıtım Aritmetiği
Dört kalemden biri — anahtar — ötekilerden ayrılır: paketle taşınamaz. Her iki tarafta da önceden bulunması gerekir ve bu, sayılabilir bir yük getirir.
// sim/dagitim.mjs — simetrik anahtar dagitim aritmetigi (model). Kurgu bolgesel olcum // aginda merkez, alti sube ve saha ucleri var; katilimci sayilari kurgudur. // KT13: simetrik sifrelemede her katilimci cifti icin ayri bir anahtar tutulur; anahtar // kalemi katilimci sayisinin karesiyle, yeni katilimcinin bedeli ise dogrusal buyur. const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); const say = (x) => x >= 1e7 ? x.toExponential(2) : Math.round(x).toLocaleString("tr-TR"); const cift = (n) => (n * (n - 1)) / 2; console.log("her katilimci cifti icin ayri anahtar:"); const A = [10, 12, 12, 12, 12]; yaz(A, "katilimci", "anahtar", "yeni gelen", "bir anahtar", "bir uc"); yaz(A, "", "kalemi", "ekler", "sizarsa", "ele gecerse"); for (const n of [2, 4, 7, 12, 40, 12_400]) yaz(A, say(n), say(cift(n)), say(n), 1, say(n - 1)); console.log("\nuc ayri duzen, ayni 7 katilimci (merkez + 6 sube):"); const n = 7; const B = [-27, 9, 12, 20, 10]; yaz(B, "duzen", "anahtar", "yeni gelen", "bir kalem dusunce", "yenileme"); yaz(B, "", "kalemi", "ekler", "etkilenen baglanti", "ucu"); const duzen = [ ["cift basina ayri anahtar", cift(n), n, 1, 2], ["tek ortak anahtar", 1, 0, cift(n), n], ["merkez uzerinden yildiz", n - 1, 1, 1, 2], ]; for (const [ad, k, ek, etki, uc] of duzen) yaz(B, ad, say(k), say(ek), say(etki), say(uc)); console.log("\nsaha uclerinde ayni uc duzen (12.400 uc + 1 toplayici):"); const m = 12_401; for (const [ad, k, ek, etki, uc] of [ ["cift basina ayri anahtar", cift(m), m, 1, 2], ["tek ortak anahtar", 1, 0, cift(m), m], ["toplayici uzerinden yildiz", m - 1, 1, 1, 2], ]) yaz(B, ad, say(k), say(ek), say(etki), say(uc));
her katilimci cifti icin ayri anahtar:
katilimci anahtar yeni gelen bir anahtar bir uc
kalemi ekler sizarsa ele gecerse
2 1 2 1 1
4 6 4 1 3
7 21 7 1 6
12 66 12 1 11
40 780 40 1 39
12.400 7.69e+7 12.400 1 12.399
uc ayri duzen, ayni 7 katilimci (merkez + 6 sube):
duzen anahtar yeni gelen bir kalem dusunce yenileme
kalemi ekler etkilenen baglanti ucu
cift basina ayri anahtar 21 7 1 2
tek ortak anahtar 1 0 21 7
merkez uzerinden yildiz 6 1 1 2
saha uclerinde ayni uc duzen (12.400 uc + 1 toplayici):
cift basina ayri anahtar 7.69e+7 12.401 1 2
tek ortak anahtar 1 0 7.69e+7 12.401
toplayici uzerinden yildiz 12.400 1 1 2
Birinci tablo aritmetiği verir. Yedi katılımcı için 21 anahtar tutulur; kırk katılımcı için 780; 12.400 uç için 7,69×10^7. Yeni bir katılımcı geldiğinde eklenen kalem, o anda ağdaki katılımcı sayısı kadardır — 12.400 uçlu bir ağa bir uç eklemek 12.400 yeni anahtar ister. Anahtar kalemi karesel, katılım maliyeti doğrusal büyür.
Son iki sütun kırılmayı ölçer. Tek bir anahtarın sızması yalnız bir bağlantıyı düşürür; bu, çift başına ayrı anahtar tutmanın tek gerekçesidir. Bir ucun tümüyle ele geçmesi ise o ucun taşıdığı bütün anahtarları düşürür: 12.400 uçlu ağda 12.399 bağlantı.
Üç Düzen, Üç Ayrı Bedel
İkinci ve üçüncü tablo aynı katılımcı kümesini üç düzende karşılaştırır ve üçünün de bir sütununda kabul edilemez bir sayı vardır.
Çift başına ayrı anahtar kırılmayı en iyi sınırlayan düzendir — bir kalem düştüğünde bir bağlantı düşer, yenileme iki uçta yapılır. Bedeli anahtar kalemindedir: 12.401 uç için 7,69×10^7 anahtar tutulacak ve her yeni uç 12.401 kalem ekleyecektir. Bu sayı, bir yönetim sorunu değil bir imkânsızlıktır.
Tek ortak anahtar ters uçtadır. Anahtar kalemi birdir, yeni katılımcı hiçbir kalem eklemez; bunun karşılığında o tek kalem düştüğünde 7,69×10^7 bağlantının tamamı düşer ve yenileme 12.401 uçta yapılır. Kurs ekseninin en keskin örneği budur: kalem sayısını bire indirmek, kökü de bire indirir.
Yıldız düzeni ikisinin ortasındadır ve kurulumda seçilen düzen çoğunlukla budur. Her uç yalnız merkezle bir anahtar paylaşır; kalem sayısı 12.400’e, yeni ucun bedeli bir kaleme iner. Bir uç anahtarı sızarsa düşen bağlantı birdir ve yenileme iki uçta yapılır. Bedel tabloda görünmeyen yerdedir: uçlar birbiriyle doğrudan konuşamaz ve merkez, bütün trafiği açık biçimde gören tek nokta hâline gelir. Merkezin ele geçmesi 12.400 anahtarın tamamını düşürür.
Yenileme bedeli üç düzende sırasıyla 2, 12.401 ve 2 uçtur. Ancak “iki uçta yenileme” ifadesi bir işlem sayısı değil, bir erişim sorusudur: yeni anahtar o iki uca nasıl ulaştırılacak?
Etiketin Kanıtladığı Kalem
Doğrulama etiketi, gövdenin bozulmadığını kanıtlar — ama bir şey daha kanıtlar ve o şey düzene göre değişir. Etiket ancak anahtarı bilen bir tarafça üretilebildiği için, geçerli bir etiket “bu mesajı anahtarı bilen biri gönderdi” der. Bu ifadenin ne kadar bilgi taşıdığı, anahtarı kaç tarafın bildiğine bağlıdır.
Sayı üç düzende üç ayrı değerdir. Çift başına ayrı anahtar düzeninde anahtarı iki taraf bilir; etiket, göndereni iki adaya indirir. Yıldız düzeninde de aynı sayı geçerlidir: uç ile merkez. Tek ortak anahtar düzeninde ise anahtarı 12.401 taraf bilir ve etiket göndereni 12.401 adaya indirir — yani hiçbir şey söylemez.
Bu, simetrik şifrelemenin yapısal sınırıdır ve kalem sayısıyla ölçülür. En iyi durumda bile aday sayısı ikidir; bir sayaç ucunun gönderdiği okumayı merkezden ayırt edecek bir kalem yoktur, çünkü merkez de aynı etiketi üretebilir. Alıcının kendi ürettiği bir mesajı gönderene mal etmesini engelleyen hiçbir şey olmadığı için, simetrik etiket bir üçüncü tarafa kanıt olarak sunulamaz. Yedinci ders bu boşluğu adıyla ele alır.
Zincirin Çözülmeyen Kalemi
Üç düzenin üçünde de aynı kalem çözümsüz kalır. Anahtar, kullanılmadan önce iki tarafa ulaşmış olmalıdır ve bu ulaştırma şifrelenerek yapılamaz — şifrelemek için zaten bir anahtar gerekir.
Kurgu ağda bunun karşılığı elle yapılan işlemlerdir: sayaç ucu kurulurken anahtarın aygıta yüklenmesi, şube sunucusuna anahtarın ayrı bir kanaldan taşınması. 12.400 uç için bu, 12.400 elle kalem demektir ve kalemler kurulum anında bir kez değil, her yenilemede yeniden ödenir. Anahtar sızdığında maliyetin büyük bölümü şifreleme işlemlerinde değil, buradadır.
Güven kökü bu yüzden algoritmada değil dağıtımdadır. AES’in kendisi zincirin en sağlam kalemidir; zincirin kırıldığı yer, anahtarın taşındığı kanal ve o kanalın kaç kez kullanıldığıdır.
Özet
- Simetrik çözme dört kalemin aynı anda doğru olmasını ister: anahtar, nonce, doğrulama etiketi ve bozulmamış gövde; beş denemenin yalnız biri çözülür.
- Nonce gizli değildir ama aynı anahtarla iki kez kullanılmamalıdır; kullanılırsa aynı düz metin aynı şifreli metni verir ve eşitlik görünür hâle gelir.
- Çift başına ayrı anahtar düzeninde anahtar kalemi karesel büyür: 7 katılımcıda 21, 12.401 uçta 7,69×10^7; yeni katılımcı o anki katılımcı sayısı kadar kalem ekler.
- Tek ortak anahtar kalem sayısını bire indirir ama kökü de bire indirir: bir kalem düştüğünde bütün bağlantılar düşer ve yenileme 12.401 uçta yapılır.
- Üç düzenin üçünde de anahtarın ilk kez iki tarafa ulaştırılması şifrelenerek yapılamaz; 12.400 uçluk ağda bu, her yenilemede tekrarlanan 12.400 elle kalemdir.
- Doğrulama etiketi göndereni anahtarı bilen taraflara indirir: çift başına düzende 2 adaya, tek ortak anahtar düzeninde 12.401 adaya; simetrik etiket üçüncü tarafa kanıt sunamaz.
Sonraki Adım
Bu dersin çözümsüz kalemi tek bir cümlede duruyor: şifreli konuşmaya başlayabilmek için önceden paylaşılmış bir sır gerekiyor ve o sırrı paylaşmanın kendisi şifreli bir kanal istiyor. Döngü simetrik şifrelemenin içinde kırılamaz, çünkü tek anahtar hem kilidi hem de açarı taşır. Sonraki ders bu kilidi ikiye ayırır: bir anahtar kilitler, ayrı bir anahtar açar ve ikisinden biri herkese verilebilir. Ayrımın kendisi sayılabilir bir soruya dönüşür — dört olası anahtar-işlem birleşiminden hangisi çalışır, hangisi gizlilik verir, hangisi kimlik verir ve hiçbiri neyi vermez.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.