---
title: 'Kimlik, Erişim ve Kriptografi'
source: 'https://academia.sh/tr/kurslar/kimlik-ve-kriptografi'
language: tr
updated: '2026-08-17T04:39:53+00:00'
license: 'CC BY-SA 4.0'
lessons: 21
outcomes:
    - 'Karma, şifreleme ve kodlamayı geri döndürülebilirlik ve amaç ekseninde ayırır'
    - 'Açık anahtar altyapısının güven zincirini kurar ve kök kırıldığında düşen kalemi sayar'
    - 'Kurumsal kimlik mekanizmalarının güven kökünü ve yenileme bedelini ölçer'
---

# Kimlik, Erişim ve Kriptografi

Doğrulamanın neye dayandığı ve o dayanağın nerede kırıldığı: karma, şifreleme ve kodlamanın geri döndürülebilirlik farkı, çakışma direnci ve eskimiş algoritmalar, tuz ile iş çarpanının deneme maliyetine etkisi, simetrik şifrelemenin anahtar dağıtım sorunu, asimetrik anahtar rolleri, güvensiz kanalda ortak sır üretimi, imzanın kanıtladığı ve kanıtlamadığı kalem, sertifika alanları ve güven zinciri, iptal listeleri ile çevrimiçi durum sorgulamanın pencere farkı, el sıkışmanın hangi adımının hangi iddiayı kanıtladığı, sertifika yaşam döngüsü, dizin servisleri, bilet tabanlı kimlik doğrulama, çoklu oturum açma, çok etmenli doğrulama ve atlatma yolları, grup politikaları, yetki yükseltme ve kimlik bilgisi hırsızlığı.

## Kriptografi Temelleri

Kriptografik işlemlerin güven kökü ve kırılma noktası cinsinden ölçülmesi: karma, şifreleme ve kodlamanın geri dönüş için istediği kalem sayısı, çakışma direncinin doğum günü sınırıyla ölçülmesi, iş çarpanının deneme maliyeti eğrisi ve tuzun ön hesaplanmış tabloyu kaç kalemde işe yaramaz kıldığı, simetrik şifrelemenin anahtar dağıtım aritmetiği, açık ve özel anahtarın hangi işlemi hangi yönde yaptığı, güvensiz kanalda ortak sır üretimi ve imzanın kanıtladığı ile kanıtlamadığı kalem.

### Karma, Şifreleme ve Kodlama

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/karma-sifreleme-ve-kodlama

Üç işlemin geri döndürülebilirlik cinsinden ayrılması: aynı sayaç okumasının kodlanmış, şifrelenmiş ve karmalanmış hâli, geri dönüş için gereken gizli kalem sayısının sırasıyla 0, 2 ve hiç olması, dört alan ile üç işlemin on iki eşleşmesinden yalnız dördünün uygun çıkması ve yanlış eşleşmenin 24.800 kaydın geri dönüşünü yok etmesi.

Önceki kurs ağ üzerindeki iddiaları saydı ve yirmi derste hep aynı yere vardı: bir iddia ancak
kanıtlanabildiği ölçüde kabul edilir. Kapanışta kalan soru, kanıtın kendisiyle ilgiliydi — o
kanıt neye dayanıyor, anahtar kimde duruyor, güven tam olarak nereden başlıyor? Bu kurs o
başlangıç noktasını adlandırır ve kırıldığında ne düştüğünü sayar.

Adlandırmadan önce bir ayrım gerekir. Kurgu bölgesel ölçüm ağında bir sayaç okuması sahadan
merkeze giderken üç ayrı işlemden geçer ve üçü de çıktıyı okunamaz hâle getirir. Bir kayıt
görüntüsüne bakan biri için üçü de aynı görünür: anlamsız harf ve rakam dizisi. Oysa üçünün
güvenlik değeri birbirinden bağımsızdır ve aralarındaki fark tek bir soruyla ölçülür — bu
çıktıdan girdiye dönmek için elde kaç gizli kalem olması gerekiyor?

#### Üç İşlem, Üç Ayrı Soru

**KT1:** kodlama (encoding) bir gösterim değişikliğidir; verinin baytlarını başka bir alfabede
yazar ve geri dönüş için hiçbir gizli kalem gerekmez. Amacı taşınabilirliktir: bir baytın
aktarım yolunda bozulmadan geçmesi.

**KT2:** şifreleme (encryption) geri döndürülebilir bir dönüşümdür; geri dönüş, sayılabilir
sayıda gizli kaleme bağlıdır. Amacı gizliliktir: kaleme sahip olmayan tarafın içeriği
öğrenememesi.

**KT3:** karma (hashing) tek yönlü bir özetlemedir; çıktıdan girdiye dönmek için hiçbir kalem
yetmez, çünkü tersi tanımlı bir işlem yoktur. Amacı bütünlük ve karşılaştırmadır: iki verinin
aynı olup olmadığının, verinin kendisi elde tutulmadan sınanması.

Bu üç cümlenin ortak yanı, hiçbirinde "güçlü" ya da "güvenli" sözcüğünün geçmemesidir. Üçü de
sayılabilir bir şey söylüyor: geri dönüş için gereken kalem sayısı sırasıyla sıfır, birden
fazla ve hiç.

#### Aynı Girdi Üç İşlemden Geçiyor

Aşağıdaki birim kurgu bir sayaç okumasını üç işlemden geçirir. Anahtar, çıktı koşumdan koşuma
aynı kalsın diye sabit bir tohumdan türetilmiştir; gerçek bir anahtar değildir ve gerçek bir
kurulumda anahtar bu biçimde üretilmez.

```js
// kripto/uclu.mjs — ayni girdiyi uc islemden gecirip geri donduruleblirligi olcer:
// kodlama (base64), sifreleme (AES-256-GCM), karma (SHA-256). Girdi, kurgu bolgesel
// olcum agindan bir sayac okumasidir. Gercek anahtar yok; anahtar sabit bir tohumdan
// turetilir ki cikti kosumdan kosuma ayni kalsin. Rastgelelik yok.
import { createHash, createCipheriv, createDecipheriv, scryptSync } from "node:crypto";

// KT1: kodlama bir gosterim degisikligidir; geri donus icin gizli kalem gerekmez.
// KT2: sifreleme geri donduruleblir bir donusumdur; geri donus tam olarak sayilabilir
//      sayida gizli kaleme baglidir.
// KT3: karma tek yonlu bir ozetlemedir; hicbir kalem geri donusu vermez.

export const OKUMA = "SAY-4417|2026-03-01T06:00Z|41982";
export const UZUN  = OKUMA + "|SAY-4418|2026-03-01T06:00Z|8813304";
const ANAHTAR = scryptSync("kurgu-tohum", "kurgu-tuz", 32, { N: 2 ** 12, r: 8, p: 1 });
const NONCE = Buffer.alloc(12, 7);                    // kurgu, sabit

export const kodla   = (m) => Buffer.from(m).toString("base64");
export const karmala = (m) => createHash("sha256").update(m).digest("base64");
export function sifrele(m) {
  const s = createCipheriv("aes-256-gcm", ANAHTAR, NONCE);
  const g = Buffer.concat([s.update(m, "utf8"), s.final()]);
  return Buffer.concat([g, s.getAuthTag()]).toString("base64");
}
export function coz(g64, anahtar = ANAHTAR) {
  const t = Buffer.from(g64, "base64");
  const c = createDecipheriv("aes-256-gcm", anahtar, NONCE);
  c.setAuthTag(t.subarray(t.length - 16));
  return Buffer.concat([c.update(t.subarray(0, t.length - 16)), c.final()]).toString();
}
export const denesin = (f) => { try { return f() === OKUMA ? "evet" : "hayir"; }
                                catch { return "hayir"; } };
export const YANLIS = scryptSync("baska-tohum", "kurgu-tuz", 32, { N: 2 ** 12, r: 8, p: 1 });
```

```js
// kripto/olc.mjs — uc islemin cikti bicimi, belirlenimciligi ve geri donusu.
import { OKUMA, UZUN, kodla, karmala, sifrele, coz, denesin, YANLIS } from "./uclu.mjs";

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 A = [-11, 7, 7, 14, 14];
yaz(A, "islem", "kisa", "uzun", "belirlenimci", "gizli kalem");
for (const [ad, f, kalem] of [["kodlama", kodla, 0], ["sifreleme", sifrele, 2],
                              ["karma", karmala, "-"]])
  yaz(A, ad, f(OKUMA).length, f(UZUN).length,
      f(OKUMA) === f(OKUMA) ? "evet" : "hayir", kalem);

console.log("\ngeri donus gercekten denendi (girdiyi aynen geri verdi mi):");
const B = [-32, 6];
for (const [ad, f] of [
  ["kodlama, elde hicbir kalem yok", () => Buffer.from(kodla(OKUMA), "base64").toString()],
  ["sifreleme, dogru anahtarla", () => coz(sifrele(OKUMA))],
  ["sifreleme, yanlis anahtarla", () => coz(sifrele(OKUMA), YANLIS)],
  ["sifreleme, tek bayti degismis", () => {
    const b = Buffer.from(sifrele(OKUMA), "base64"); b[3] ^= 1;
    return coz(b.toString("base64")); }],
]) yaz(B, ad, denesin(f));
yaz(B, "karma, ters islev yok", "hayir");

console.log("\nayni girdinin uc cikti bicimi:");
console.log("  kodlama  :", kodla(OKUMA));
console.log("  sifreleme:", sifrele(OKUMA));
console.log("  karma    :", karmala(OKUMA));
```

```
islem         kisa   uzun  belirlenimci   gizli kalem
kodlama         44     92          evet             0
sifreleme       64    112          evet             2
karma           44     44          evet             -

geri donus gercekten denendi (girdiyi aynen geri verdi mi):
kodlama, elde hicbir kalem yok    evet
sifreleme, dogru anahtarla        evet
sifreleme, yanlis anahtarla      hayir
sifreleme, tek bayti degismis    hayir
karma, ters islev yok            hayir

ayni girdinin uc cikti bicimi:
  kodlama  : U0FZLTQ0MTd8MjAyNi0wMy0wMVQwNjowMFp8NDE5ODI=
  sifreleme: KtcWlbMqgsctrQ9mH5TfZXklUgBZe3RQghkBaCASMIF/zJIXfxBHDQ8B0sIX7nzA
  karma    : 6MaKWYn3eYX57Bdf2685XV76MBSSJCOE1SLYc6Rz7zg=
```

#### Ölçülen Şey: Geri Dönüş İçin Gereken Kalem

Son üç satır dersin çıkış noktasıdır. Üç çıktı da okunamaz görünür ve üçü de yaklaşık aynı
uzunluktadır. Görünüş hiçbir şey söylemez; tablolar söyler.

Uzunluk sütunları ilk ayrımı verir. Girdi uzadığında kodlamanın çıktısı 44'ten 92'ye,
şifrelemenin çıktısı 64'ten 112'ye çıkar — ikisi de girdiyle birlikte büyür, çünkü ikisi de
girdinin tamamını taşır. Karmanın çıktısı iki girdide de 44 karakterdir. Sabit uzunluk, karmanın
girdiyi taşımadığının doğrudan kanıtıdır: 64 karakterlik bir girdi de 6 kilobaytlık bir dosya
da aynı 32 bayta iner. İçine sığmayan bilgi geri çıkarılamaz.

Belirlenimcilik sütununda üçü de `evet` verir; aynı girdi her zaman aynı çıktıyı üretir. Bu
özellik doğrulamayı mümkün kılan şeydir ve aynı zamanda ikinci derste ölçülecek bir kısıtın
kaynağıdır: iki kayıt eşitse çıktıları da eşittir.

Geri dönüş tablosu asıl ölçümdür ve dördü de gerçekten denenmiştir. Kodlanmış değer elde hiçbir
kalem yokken açıldı — geri dönüş, çıktıyı gören herkesin yapabileceği bir işlemdir. Şifrelenmiş
değer doğru anahtarla açıldı, yanlış anahtarla açılmadı. Üçüncü satır ikinci gizli kalemi
gösterir: şifreli metnin tek bir baytı değiştiğinde çözme başarısız oldu, çünkü kullanılan
çalışma kipi çıktıya bir doğrulama etiketi ekler ve çözmeden önce onu sınar. Şifrelemenin geri
dönüşü bu yüzden bir değil iki kaleme bağlıdır: anahtar ve bozulmamış şifreli metin. Karma
satırında denenecek bir şey bile yoktur; ters işlev diye bir şey tanımlı değildir.

#### Kodlamanın Yeri ve Çıktıdan Ayırt Etme

Kodlamanın bir güvenlik işlevi olmaması, gereksiz olduğu anlamına gelmez. Kurgu ölçüm ağında
şubeler arasında aktarılan paket, metin taşıyan bir kanaldan geçer ve ham baytların bir bölümü
o kanalda ayraç ya da denetim karakteri olarak yorumlanır. Kodlama tam olarak bunu çözer:
baytları kanalın güvenle taşıyabileceği bir alfabeye yazar. Tablodaki `aktarim paketi` satırında
kodlamanın uygun çıkmasının nedeni budur — o alanda istenen şey gizlilik değil, bozulmadan
varmaktır.

Karışıklık, kodlanmış bir değerin okunamaz görünmesinden doğar. Çıktıya bakarak üçünü ayırmak
yine de mümkündür ve ayırt edici işaretler yukarıdaki çıktıda hazır durur. Kodlanmış değerin
uzunluğu girdinin uzunluğuyla orantılıdır ve çözüldüğünde anlamlı metin verir; sondaki `=`
dolgusu da kullanılan alfabenin işaretidir. Karmanın çıktısı girdiden bağımsız olarak hep aynı
uzunluktadır — 32 bayt, bu alfabede 44 karakter. Şifrelenmiş değer girdiyle birlikte büyür ama
çözüldüğünde anlamsız bayt verir ve genellikle sabit bir fazlalık taşır: buradaki 16 baytlık
doğrulama etiketi bu fazlalıktır.

Bir kayıt görüntüsünde sabit uzunlukta 44 karakterlik alanlar görülüyorsa bu bir karma
sütunudur; uzunluğu satırdan satıra değişen alanlar kodlama ya da şifrelemedir. Ayrım bir
tahmin değil, ölçülebilir bir özelliktir ve denetim sırasında ilk bakılacak sütundur.

#### Karıştırmanın Sayılabilir Sonucu

Üç işlemin ayrımı bir terim tartışması değildir. Kurgu ölçüm ağında dört alan vardır ve her
alanın iki özelliği bellidir: değerin sonradan geri istenip istenmediği, değerin gizli kalması
gerekip gerekmediği. Bu iki özellik doğru işlemi belirler; yanlış seçim ise iki ayrı sayıya mal
olur.

```js
// kripto/karisim.mjs — kurgu olcum agindaki dort alanin amaci ile uc islemin
// eslestirilmesi (model): her yanlis eslesmenin kac kalemde sonuc verdigi.
// KT4: bir islemi amacinin disinda kullanmanin bedeli goruste degil kalem sayisinda
//      olculur: acilma icin gereken kalem ve geri donusu kaybedilen kayit.
const ALAN = [                       // kayit sayilari kurgudur
  { ad: "sayac okuma degeri",  kayit: 12400, geri: true,  gizli: true,  dogru: "sifreleme" },
  { ad: "saha ekibi parolasi", kayit:   340, geri: false, gizli: true,  dogru: "karma" },
  { ad: "aygit seri ozeti",    kayit: 12400, geri: false, gizli: false, dogru: "karma" },
  { ad: "aktarim paketi",      kayit: 12400, geri: true,  gizli: false, dogru: "kodlama" },
];
const ACILMA = { kodlama: 0, sifreleme: 1, karma: null };   // geri donus icin gereken kalem

function karar(a, islem) {
  if (islem === a.dogru)                 return ["uygun", ACILMA[islem], 0];
  if (islem === "karma")                 return ["geri donus yok", null, a.kayit];
  if (islem === "kodlama" && a.gizli)    return ["0 kalemle okunur", 0, 0];
  if (islem === "kodlama")               return ["ham deger kalir", 0, 0];
  if (!a.geri)                           return ["tek kok tumunu acar", 1, 0];
  return ["gereksiz kok", 1, 0];
}
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 G = [-20, -11, 6, 7, 8, 8, -22];
yaz(G, "alan", "islem", "geri", "gizli", "acilma", "kayip", "  karar");
let uygun = 0, sifir = 0, kayip = 0;
for (const a of ALAN) for (const islem of ["kodlama", "sifreleme", "karma"]) {
  const [k, ac, ky] = karar(a, islem);
  if (k === "uygun") uygun++; else if (ac === 0) sifir++;
  kayip += ky;
  yaz(G, a.ad, islem, a.geri ? "evet" : "hayir", a.gizli ? "evet" : "hayir",
      ac === null ? "-" : ac, ky || "-", "  " + k);
}
console.log(`\n${ALAN.length * 3} eslesmeden ${uygun} uygun; ${sifir} eslesmede ham deger ` +
  `0 kalemle geri gelir, yanlis karma ${kayip.toLocaleString("tr-TR")} kaydin geri donusunu yok eder`);
```

```
alan                islem        geri  gizli  acilma   kayip  karar
sayac okuma degeri  kodlama      evet   evet       0       -  0 kalemle okunur
sayac okuma degeri  sifreleme    evet   evet       1       -  uygun
sayac okuma degeri  karma        evet   evet       -   12400  geri donus yok
saha ekibi parolasi kodlama     hayir   evet       0       -  0 kalemle okunur
saha ekibi parolasi sifreleme   hayir   evet       1       -  tek kok tumunu acar
saha ekibi parolasi karma       hayir   evet       -       -  uygun
aygit seri ozeti    kodlama     hayir  hayir       0       -  ham deger kalir
aygit seri ozeti    sifreleme   hayir  hayir       1       -  tek kok tumunu acar
aygit seri ozeti    karma       hayir  hayir       -       -  uygun
aktarim paketi      kodlama      evet  hayir       0       -  uygun
aktarim paketi      sifreleme    evet  hayir       1       -  gereksiz kok
aktarim paketi      karma        evet  hayir       -   12400  geri donus yok

12 eslesmeden 4 uygun; 3 eslesmede ham deger 0 kalemle geri gelir, yanlis karma 24.800 kaydin geri donusunu yok eder
```

On iki eşleşmenin dördü uygundur; sekizi bir bedel taşır ve bedellerin türü aynı değildir.

En sessiz kusur ilk satırdadır. Sayaç okuması kodlanmışsa kayıt okunamaz görünür ve bakan kişi
korunmuş sanır; oysa açılma kalemi sıfırdır. Kodlamanın hiçbir gizli kalemi olmadığı için,
kodlanmış bir değeri korunmuş saymak, korumasız bir değeri korunmuş yazmakla aynı şeydir. Aynı
kusur parola satırında yinelenir ve orada kayıt sayısı 340'tır.

İkinci kusur ters yöndedir. Saha ekibi parolası şifrelenirse geri dönüş mümkündür — ve bu tam
olarak istenmeyen şeydir. Şifreleme, 340 kaydın tamamını tek bir kaleme, anahtara bağlar. O
kalem kırıldığında düşen kayıt sayısı 340'tır; karmada ise kırılacak ortak bir kalem yoktur.
Bu satır, kursun ölçü ekseninin ilk somut örneğidir: yanlış işlem seçimi bir kök yaratır ve kök
yaratmanın bedeli, kökün kırılması hâlinde düşen kalem sayısıdır.

Üçüncü kusur geri döndürülemez olandır. Sayaç okuması ya da aktarım paketi karmalanırsa değer
korunmuş olmaz, kaybolur; iki alanda toplam 24.800 kayıt bir daha okunamaz. Bu kusur diğer
ikisinin tersine sızıntı anında değil, ilk yazma anında ortaya çıkar ve geri alınamaz.

#### Kursun Üç Sütunu

Bu ders, kurs boyunca her mekanizmaya sorulacak üç soruyu kurar ve ilkini yanıtlar.

**Güven kökü.** Mekanizma neyi baştan doğru varsayıyor? Kodlamanın kökü yoktur — hiçbir şey
varsaymaz, hiçbir şey de vaat etmez. Şifrelemenin kökü anahtarın gizli kalmasıdır. Karmanın
kökü, iki farklı girdinin aynı çıktıyı vermemesidir ve bu kök sonraki dersin konusudur.

**Kaç kalem aynı anda doğru olmalı.** Kökten kullanıma kadar kaç bileşenin birlikte tutması
gerekiyor? Şifrelemede ölçülen sayı ikidir: anahtar gizli kalmalı ve şifreli metin bozulmamış
olmalı. Kodlamada sıfırdır. Karmada bir tanedir: fonksiyonun çakışma direnci.

**Kök kırılırsa kaç kalem düşer.** Anahtar sızarsa o anahtarla şifrelenmiş bütün kayıtlar
düşer; tablodaki parola satırında bu 340'tır. Kodlamada kırılacak bir kök yoktur, çünkü hiçbir
şey kapalı değildir. Karmada kök kırılırsa düşen şey kayıtların gizliliği değil, karşılaştırmanın
anlamıdır.

Kurs boyunca her ders bu üç sütunu doldurur. "Şu algoritma güçlüdür" bir karar taşımaz; kökün
adı, zincirin uzunluğu ve kırılma anında düşen kalem sayısı taşır. Üçüncü sütuna her zaman bir
dördüncü soru eşlik eder: kök kırıldığında yenilemek ne tutuyor? Anahtar sızdığında yeni anahtar
üretmek tek bir işlemdir, ama o anahtarla korunan 12.400 kaydın yeniden şifrelenmesi ve
anahtarın ulaşması gereken her uca ulaştırılması ayrı ayrı sayılan kalemlerdir. Bu kursta
ölçülen bedel, kırılmanın kendisi değil, kırılmadan sonra elle dokunulan kalem sayısıdır.

#### Özet

- Üç işlem geri dönüş için gereken gizli kalem sayısıyla ayrılır: kodlama 0, şifreleme 2
  (anahtar ve bozulmamış şifreli metin), karma için ise hiçbir kalem yetmez.
- Kodlama ve şifrelemenin çıktısı girdiyle birlikte büyür (44→92 ve 64→112 karakter); karmanın
  çıktısı her girdide 44 karakterdir ve bu sabitlik girdinin taşınmadığının kanıtıdır.
- Üç işlem de belirlenimcidir: aynı girdi her zaman aynı çıktıyı verir.
- Dört alan ile üç işlemin on iki eşleşmesinden yalnız dördü uygundur; üç eşleşmede ham değer
  0 kalemle geri gelir, iki eşleşmede 24.800 kaydın geri dönüşü yok olur.
- Her mekanizma üç sütunla ölçülür: güven kökünün adı, kökten kullanıma kadar aynı anda doğru
  olması gereken kalem sayısı ve kök kırıldığında düşen kalem sayısı.

#### Sonraki Adım

Bu derste karmanın kökü bir cümleyle geçildi: iki farklı girdi aynı çıktıyı vermez. Oysa bu
cümle olduğu gibi doğru olamaz. Karmanın çıktısı sabit uzunluktadır ve olası girdi sayısı
sınırsızdır; dolayısıyla aynı çıktıyı veren farklı girdiler kesinlikle vardır. Kök, çakışmanın
var olmaması değil, **bulunamaması** varsayımıdır. Sonraki ders bu varsayımı sayıya çevirir:
çıktı kaç bit olduğunda ilk çakışma kaç denemede bulunur, ölçülen sayı kuramsal sınırla ne kadar
uyuşur ve çıktı uzunluğu iki katına çıktığında aranan deneme sayısı ne olur. Aynı ölçü,
kullanımdan kaldırılmış karma algoritmalarının neden adım adım terk edildiğini de açıklar.

### Karma Fonksiyonları

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/karma-fonksiyonlari

Çakışma direncinin doğum günü sınırıyla ölçülmesi: sabit çıktı uzunluğu, tek bitlik girdi değişiminin çıktı bitlerinin yarısını çevirmesi, kısaltılmış çıktıda ilk çakışmanın 32 turluk ortalamada kuramsal sınırın 0,97–1,15 katında bulunması ve n bitlik çıktının 2^(n/2) ile sınırlanmasının 25.242 kalemlik kullanım kümesinde 12.502 kalemi çakışma direncine bağlaması.

Önceki ders karmanın kökünü tek cümleyle geçmişti: iki farklı girdi aynı çıktıyı vermez. Bu
cümle olduğu gibi doğru olamaz. Karmanın çıktısı sabit uzunluktadır, olası girdi sayısı ise
sınırsızdır; dolayısıyla aynı çıktıyı veren farklı girdiler kesinlikle vardır ve sayıları da
sınırsızdır. Kök, çakışmanın var olmaması değil, bulunamamasıdır.

"Bulunamaz" ise bir sayıdır. Bu ders o sayıyı ölçer: bir çıktı kaç bit olduğunda ilk çakışma
kaç denemede ortaya çıkar, ölçülen değer kuramsal sınırla ne kadar örtüşür ve çıktı uzunluğu
iki katına çıktığında aranan deneme sayısı ne olur.

#### Dört Özellik, İki Ayrı Direnç

**KT5:** karmanın çıktı uzayı sonlu, girdi uzayı sınırsızdır; aynı çıktıyı veren farklı girdiler
kesinlikle vardır. Kök, çakışmanın yokluğu değil, arama maliyetinin karşılanamaz olmasıdır.

**KT6:** n bitlik bir çıktıda çakışma arama maliyeti 2^(n/2) ile üst sınırlıdır ve bu sınır
algoritmanın iç tasarımından bağımsızdır; yalnızca çıktı uzunluğundan gelir.

İki direnç birbirinden ayrılır. **Ön görüntü direnci (preimage resistance)** verilen bir
çıktıyı üreten herhangi bir girdiyi bulmayı zorlaştırır; maliyeti 2^n mertebesindedir.
**Çakışma direnci (collision resistance)** aynı çıktıyı veren *herhangi iki* girdiyi bulmayı
zorlaştırır ve maliyeti 2^(n/2)'dir. Aradaki fark, saldıran tarafın çıktıyı seçme özgürlüğünden
gelir: ilkinde hedef sabittir, ikincisinde iki girdi de serbesttir. Bu özgürlük maliyetin
karekökünü alır.

```js
// karma/ozellik.mjs — karmanin dort ozelligi olculur: sabit uzunluk, belirlenimcilik,
// cig etkisi ve cikti uzunlugunun getirdigi kuramsal sinir. Girdi, kurgu bolgesel olcum
// aginda bir sayac okumasidir. Rastgelelik yok; her kosum ayni sayilari verir.
import { createHash } from "node:crypto";

// KT5: karmanin cikti uzayi sonlu, girdi uzayi sinirsizdir; ayni ciktiyi veren farkli
//      girdiler kesinlikle vardir. Kok, cakismanin yoklugu degil bulunamamasidir.
// KT6: n bitlik ciktida cakisma arama maliyeti 2^(n/2) ile ust sinirlidir; bu sinir
//      algoritmanin ic tasariminden bagimsizdir, yalnizca cikti uzunlugundan gelir.

const OKUMA = "SAY-4417|2026-03-01T06:00Z|41982";
const ALG = ["md5", "sha1", "sha256", "sha512"];
const bitSay = (b) => { let n = 0; for (const x of b) n += (x.toString(2).match(/1/g) || []).length; return n; };
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 A = [-10, 7, 11, 12, 12];
yaz(A, "algoritma", "bayt", "cikti bit", "onceruntu", "cakisma");
for (const a of ALG) {
  const n = createHash(a).update(OKUMA).digest().length * 8;
  yaz(A, a, n / 8, n, "2^" + n, "2^" + n / 2);
}

console.log("\ncig etkisi: girdinin tek biti ceviriliyor, ciktida kac bit degisiyor");
const B = [-10, 10, 8, 10, 8, 10];
yaz(B, "algoritma", "cevrilen", "en az", "ortalama", "en cok", "beklenen");
for (const a of ALG) {
  const ozgun = createHash(a).update(OKUMA).digest();
  const bit = ozgun.length * 8;
  let en = Infinity, ust = 0, t = 0, kez = 0;
  for (let i = 0; i < OKUMA.length * 8; i++) {
    const g = Buffer.from(OKUMA); g[i >> 3] ^= 1 << (i & 7);
    const y = createHash(a).update(g).digest();
    let f = 0;
    for (let j = 0; j < y.length; j++) f += bitSay(Buffer.from([ozgun[j] ^ y[j]]));
    en = Math.min(en, f); ust = Math.max(ust, f); t += f; kez++;
  }
  yaz(B, a, kez, en, (t / kez).toFixed(1), ust, bit / 2);
}

console.log("\nayni girdi ayni ciktiyi veriyor mu:",
  createHash("sha256").update(OKUMA).digest("hex") ===
  createHash("sha256").update(OKUMA).digest("hex") ? "evet" : "hayir");
```

```
algoritma    bayt  cikti bit   onceruntu     cakisma
md5            16        128       2^128        2^64
sha1           20        160       2^160        2^80
sha256         32        256       2^256       2^128
sha512         64        512       2^512       2^256

cig etkisi: girdinin tek biti ceviriliyor, ciktida kac bit degisiyor
algoritma   cevrilen   en az  ortalama  en cok  beklenen
md5              256      50      64.1      78        64
sha1             256      62      79.7     100        80
sha256           256     110     128.8     149       128
sha512           256     219     256.4     288       256

ayni girdi ayni ciktiyi veriyor mu: evet
```

Çığ etkisi tablosu, karmanın girdi ile çıktı arasında hiçbir yapısal iz bırakmadığını ölçer.
Girdinin tek bir biti çevrildiğinde SHA-256 çıktısının ortalama 128,8 biti değişiyor — 256
bitin yaklaşık yarısı. En düşük ölçüm 110, en yüksek 149; dört algoritmanın dördünde de
ortalama, çıktı bitinin yarısına oturuyor. Yarım oran, çıktının girdiden bağımsız gibi
davrandığının işaretidir. Kodlamada bir bitlik girdi değişikliği çıktının yalnız o bölgesine
dokunurdu; burada değişimin yeri de miktarı da girdiyle ilişkisizdir.

Belirlenimcilik ile çığ etkisi birlikte, karmayı bir parmak izi hâline getiren şeydir.
Belirlenimcilik olmasaydı aynı verinin iki özeti karşılaştırılamazdı; çığ etkisi olmasaydı
benzer veriler benzer özetler üretir ve özete bakan taraf verinin bir bölümünü çıkarabilirdi.
İkisi bir arada, "aynı mı" sorusunun verinin kendisi elde tutulmadan yanıtlanmasını sağlar.

Sağdaki iki sütun ise bu dersin asıl konusudur. Her algoritmanın çakışma sınırı, ön görüntü
sınırının karekökü kadardır: 128 bitlik çıktı 2^64'e, 160 bitlik çıktı 2^80'e, 256 bitlik çıktı
2^128'e sınırlanır. Bu sayı algoritmanın kalitesiyle ilgili değildir — çıktı uzunluğunun
kendisiyle ilgilidir ve kusursuz bir karma fonksiyonunda da aynıdır.

#### Doğum Günü Sınırı Ölçülüyor

Kuramsal sınır, ölçülebilir bir iddiadır. Aşağıdaki birim SHA-256 çıktısının yalnız ilk n
bitini alır ve **kendi kısalttığı** bu çıktı üzerinde ilk çakışmayı arar. Ölçülen şey algoritma
değildir; çıktı uzunluğunun getirdiği sınırdır. Her çıktı boyu için otuz iki bağımsız tur
koşturulur ve ortalama alınır, çünkü tek bir turun sonucu geniş bir bantta salınır.

```js
// karma/cakisma.mjs — cakisma direncinin dogum gunu siniriyla olculmesi. SHA-256
// ciktisinin ilk n biti alinir ve kendi kisalttigimiz bu cikti uzerinde ilk cakisma
// aranir. Olculen sey algoritmanin kendisi degil, cikti uzunlugunun getirdigi sinirdir.
// Girdiler sayacla uretilir; rastgelelik yok, her kosum ayni sayilari verir.
import { createHash } from "node:crypto";

// KT7: n bitlik ciktida ilk cakismaya kadar beklenen deneme sayisi 1,2533 * 2^(n/2)'dir;
//      cikti uzunlugu iki katina cikinca beklenen deneme sayisi karesi kadar buyur.

const kes = (m, bit) => {                      // SHA-256 ciktisinin ilk `bit` biti
  const h = createHash("sha256").update(m).digest();
  let v = 0n;
  for (let i = 0; i < 8; i++) v = (v << 8n) | BigInt(h[i]);
  return (v >> BigInt(64 - bit)).toString(16);
};
const ilkCakisma = (bit, tur) => {             // `tur` her turda farkli girdi dizisi verir
  const gorulen = new Map();
  for (let i = 0; ; i++) {
    const m = `t${tur}-olcum-${i}`, k = kes(m, bit);
    if (gorulen.has(k)) return i + 1;
    gorulen.set(k, m);
  }
};
const TUR = 32;                                // her cikti boyu icin bagimsiz tur sayisi
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 G = [7, 17, 11, 11, 8, 10, 10];
yaz(G, "cikti", "olasi cikti", "kuramsal", "olculen", "oran", "en erken", "en gec");
for (const bit of [8, 12, 16, 20, 24, 28, 32]) {
  let toplam = 0, en = Infinity, ust = 0;
  for (let j = 0; j < TUR; j++) {
    const d = ilkCakisma(bit, j);
    toplam += d; en = Math.min(en, d); ust = Math.max(ust, d);
  }
  const ort = toplam / TUR, kuram = 1.2533 * 2 ** (bit / 2);
  yaz(G, bit + " bit", (2 ** bit).toLocaleString("tr-TR"), kuram.toFixed(0),
      ort.toFixed(0), (ort / kuram).toFixed(2), en, ust);
}
```

```
  cikti      olasi cikti   kuramsal    olculen    oran  en erken    en gec
  8 bit              256         20         21    1.03         7        48
 12 bit            4.096         80         92    1.15        28       188
 16 bit           65.536        321        368    1.15        91       675
 20 bit        1.048.576       1283       1397    1.09       127      3395
 24 bit       16.777.216       5134       4986    0.97      1630     11910
 28 bit      268.435.456      20534      21479    1.05      2771     48277
 32 bit    4.294.967.296      82136      86497    1.05     10808    167350
```

Yedi satırın yedisinde ölçülen değer kuramsal sınırın 0,97 ile 1,15 katı arasında kalıyor. Bu,
formülün bir yaklaşıklık değil ölçülebilir bir tahmin olduğunun kanıtıdır. Kısaltılmış çıktı
gerçek bir kırma girişimi değildir; SHA-256 çıktısının atılan bitleri hesaplanmaya devam eder
ve arama yalnız elde tutulan n bit üzerinde yürür. Ölçülen şey, o n bitin taşıdığı sınırdır.

Asıl sonuç ikinci ve dördüncü sütunun karşılaştırılmasındadır. 32 bitlik çıktının dört milyarı
aşkın olası değeri var; ilk çakışma ortalama 86.497 denemede bulunuyor. Oran yaklaşık elli
bin**e bir**dir. Sezgi burada yanılır: uzay büyüdükçe çakışma zorlaşıyor gibi görünür, oysa
aranan şey belirli bir değere düşmek değil, *herhangi iki* denemenin birbirine düşmesidir ve
deneme sayısı arttıkça çift sayısı karesel büyür.

Bu kareselliği tablodaki sayılarla doğrulamak mümkündür. 86.497 denemede birbiriyle
karşılaştırılabilecek çift sayısı 86.497 × 86.496 / 2, yani yaklaşık 3,74 milyardır; 32 bitlik
çıktı uzayı ise 4,29 milyar değer taşır. İki sayının aynı mertebeye gelmesi çakışmanın
beklendiği andır. Aranan şey deneme sayısının çıktı uzayına yaklaşması değil, **çift sayısının**
yaklaşmasıdır ve çift sayısı deneme sayısının karesiyle büyür. Doğum günü sınırının tamamı bu
tek gözlemden çıkar.

Son iki sütun bandın genişliğini gösterir. 32 bit için en erken çakışma 10.808. denemede,
en geç 167.350. denemede bulundu — on beş kat fark. Ortalama kuramla örtüşse de tek bir koşum
örtüşmez. Bu, güvenlik sınırlarının neden ortalamayla değil **en erken** durumla yazıldığının
nedenidir: bir savunma, koşumların yarısında değil hepsinde tutmak zorundadır.

Satırdan satıra geçiş de sayılabilir. Çıktı 16 bitten 32 bite çıktığında olası çıktı sayısı
65.536'dan dört milyarın üzerine, yani karesine gider; ölçülen deneme sayısı ise 368'den
86.497'ye, yaklaşık aynı oranda çıkar. Çıktıya eklenen her bit aranan deneme sayısını
yalnız 1,41 katına çıkarır. Sekiz bit eklemek on altı kat, altmış dört bit eklemek dört milyar
kat getirir. Kök buradadır: çakışma direnci, çıktı uzunluğunun **yarısı** kadar bit güvenlik
verir ve bu oran hiçbir tasarımla değiştirilemez.

#### Kısaltmanın Bedeli

Yukarıdaki ölçüm, kursun güvenlik kuralı gereği gerçek bir algoritmaya karşı değil **kendi
kısalttığımız** çıktı üzerinde yapıldı. Bu kısaltma yalnız bir ölçüm hilesi değildir; kurulumda
gerçekten karşılaşılan bir karardır. Bir kütük satırında ya da bir veritabanı sütununda yer
kazanmak için özetin tamamı değil ilk birkaç baytı saklanır ve bu, çoğu zaman yalnız bir
depolama tercihi sanılır.

Sayı bunun bir depolama tercihi olmadığını gösterir. 256 bitlik bir çıktının ilk 64 biti
saklanırsa çakışma sınırı 2^128'den 2^32'ye iner. Tablonun son satırında ölçülen tam olarak
budur: 32 bitlik çıktıda ilk çakışma ortalama 86.497 denemede bulundu. 64 bitlik çıktıda aynı
formül yaklaşık 5,4 milyar deneme verir — büyük bir sayı gibi görünür, ama sıradan bir makinenin
saatler mertebesinde yapabileceği bir iştir. Kısaltmanın maliyeti doğrusal değildir: çıktının
yarısını atmak, güvenliğin yarısını değil **karekökünü** bırakır.

Kısaltma her kullanımda aynı sonucu doğurmaz. Kütükteki bir eşleştirme alanı için 64 bit
yeterli olabilir, çünkü orada aranan şey aynı özeti veren iki kayıt değil, belirli bir kaydın
izlenmesidir. Bütünlük denetiminde ise aynı kısaltma doğrudan kökü kırar. Ölçüt tek cümleyle
yazılır: alanın taşıdığı iddia çakışma direncine dayanıyorsa çıktı kısaltılmaz.

#### Hangi Kullanım Hangi Dirence Bağlı

Kırılan bir kökün bedeli, o köke bağlı kalem sayısıdır. Kurgu bölgesel ölçüm ağında karma beş
ayrı yerde kullanılıyor ve beşi aynı dirence dayanmıyor.

| Kullanım | Dayandığı direnç | Kalem | Çakışma direnci düşerse |
|---|---|---|---|
| Aygıt yazılımı bütünlük özeti | çakışma | 12.400 | düşer |
| Kütükteki seri numarası özeti | ön görüntü | 12.400 | ayakta |
| Şubeler arası imzalanan özet | çakışma | 6 | düşer |
| Saha ekibi parola kaydı | ön görüntü | 340 | ayakta |
| Yedek dosya parmak izi | çakışma | 96 | düşer |

Yirmi beş bin iki yüz kırk iki kalemin 12.502'si çakışma direncine, 12.740'ı ön görüntü
direncine bağlıdır. Ayrım keskindir: çakışma direnci düştüğünde, aynı özeti veren iki farklı
aygıt yazılımı üretilebilir hâle gelir ve bütünlük denetimi ikisini de kabul eder. Parola
kaydında ise saldıran tarafın elinde hedef bir çıktı vardır ve ona düşen bir girdi araması
gerekir; bu ön görüntü sorunudur ve çakışma direncinin düşmesi onu kolaylaştırmaz.

MD5 ve SHA-1 bu ayrımın somut örneğidir. İkisi de açık şartnamedir, ikisi de hâlâ hesaplanabilir
ve ikisinin de ön görüntü direnci kırılmış değildir. Kullanımdan kaldırılmalarının nedeni
çakışma tarafındadır: 2^64 ve 2^80'lik sınırlar erişilebilir mertebeye indi ve yapısal
zayıflıklar bu sınırların da altına inilmesine yol açtı. Sonuç, tablodaki iki sütunun ayrı ayrı
etkilenmesidir — bu algoritmalarla üretilmiş bir parola kaydı ile bir bütünlük özeti aynı
aciliyette değildir.

Yenilemenin bedeli üçüncü sütundur ve kalem kalem sayılır. Aygıt yazılımı özetleri için
yenileme tek bir toplu işlemdir: 12.400 özet yeniden hesaplanır ve elle dokunulan kalem
sayısı sıfırdır. Yedek dosya parmak izlerinde durum farklıdır — 96 yedeğin özgün özeti eski
kayıtlarda durur ve yenisiyle eşleştirilmesi elle yapılır. Şubeler arası imzalanan özette ise
yalnız özet değil imza da yenilenir; altı şube için altı ayrı onay adımı gerekir ve yenileme
penceresinde aktarımların doğrulaması yapılamaz. Aynı kök kırılmasının bedeli üç kullanımda
sıfır, 96 ve 6 elle kalemdir; kalem sayısını belirleyen şey kaç kaydın etkilendiği değil, kaç
kaydın **yenilenmesi için insan kararı gerektiğidir**.

#### Özet

- Karmanın çıktı uzayı sonlu olduğu için çakışma kesinlikle vardır; güven kökü çakışmanın
  yokluğu değil, arama maliyetinin karşılanamaz olmasıdır.
- Girdinin tek biti çevrildiğinde çıktı bitlerinin yaklaşık yarısı değişir: SHA-256 için ölçülen
  ortalama 256 bitte 128,8'dir.
- n bitlik çıktıda ilk çakışmaya kadar beklenen deneme sayısı 2^(n/2) mertebesindedir; yedi
  ayrı çıktı boyunda ölçülen değer kuramsal sınırın 0,97–1,15 katı çıkmıştır.
- Ortalama kuramla örtüşse de tek koşum örtüşmez: 32 bitte en erken çakışma 10.808, en geç
  167.350 denemededir; güvenlik sınırı en erken duruma göre yazılır.
- Çakışma direnci çıktı uzunluğunun yarısı kadar bit güvenlik verir; kurgu ağdaki 25.242
  kalemin 12.502'si bu dirence, 12.740'ı ön görüntü direncine bağlıdır.

#### Sonraki Adım

Bu derste ölçülen maliyet, saldıran tarafın **hiçbir bilgisi olmadığı** varsayımına dayanıyordu:
girdiler sayaçla üretildi ve her deneme eşit olasılıklıydı. Parola söz konusu olduğunda bu
varsayım düşer. İnsanların seçtiği dizgiler olası girdi uzayına eşit dağılmaz; birkaç yüz
milyonluk bir aday listesi, uzayın hesaplanabilir bir bölümünü kaplar. O durumda 2^256'lık
ön görüntü sınırının hiçbir hükmü kalmaz, çünkü arama uzayın tamamında değil listenin içinde
yapılır. Sonraki ders bu duruma karşı iki ayrı savunmayı ölçer: her denemenin birim maliyetini
büyüten iş çarpanı ve ön hesaplanmış tabloyu kayıt sayısıyla çarpan tuz. İkisinin de kendi
sınırı vardır ve o sınır sayılabilir.

### Tuz ve Parola Saklama

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/tuz-ve-parola-saklama

İş çarpanı ile tuzun birbirinden bağımsız iki çarpan olarak ölçülmesi: N iki katına çıkınca birim maliyetin 16 katına kadar ölçülen bant içinde büyümesi, ön hesaplanmış tablonun 9 bitlik tuz eşiğinde kayıt başına baştan iş yapmakla eşitlenmesi, tuz uzunluğunu belirleyenin tablo boyutu değil doğum günü sınırı olması ve iki çarpanın da parolanın öngörülemezliği kökünü onaramaması.

Önceki dersteki bütün ölçümler tek bir varsayıma dayanıyordu: girdiler sayaçla üretiliyordu ve
her deneme eşit olasılıklıydı. Parola söz konusu olduğunda bu varsayım düşer. İnsanların seçtiği
dizgiler olası girdi uzayına eşit dağılmaz; birkaç yüz milyonluk bir aday listesi, uzayın
hesaplanabilir bir bölümünü kaplar. O durumda 2^256'lık ön görüntü sınırının hiçbir hükmü
kalmaz, çünkü arama uzayın tamamında değil listenin içinde yapılır.

Bu derste ölçülen şey, o listenin nasıl pahalılaştırıldığıdır. İki ayrı çarpan vardır ve ikisi
farklı şeyi çarpar. Aşağıdaki hesapların tamamı kendi modelimiz üzerindedir; gerçek bir parola
kümesine karşı deneme yapmak, **yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek
dışıdır**.

#### Neyi Çarpan Çarpan

**KT8:** anahtar türetme fonksiyonunun **iş çarpanı (work factor)**, tek bir denemenin birim
maliyetini doğrusal olarak büyütür. Savunan taraf bu maliyeti giriş başına bir kez öder;
deneyen taraf aday sayısı kadar öder. Asimetri buradadır.

**KT9:** **ön hesaplanmış tablo (precomputed table)** aynı tuzu paylaşan kayıtların tamamına
birden uyar. Tuz kayıt başına ayrı üretilirse aynı tablo yalnızca tek bir kayda uyar.

İkisi çarpanın farklı yerine oturur. İş çarpanı **deneme başına maliyeti**, tuz ise
**tekrarlanacak deneme kümesi sayısını** büyütür. Biri diğerinin yerine geçmez; birlikte
kullanıldıklarında toplam iş ikisinin çarpımıdır. Bu ayrım, iki savunmanın ayrı ayrı ölçülmesini
zorunlu kılar: iş çarpanı yükseltilip tuz atlanırsa toplam iş kayıt sayısına bölünür, tuz
konulup çarpan düşük bırakılırsa birim maliyet ölçülemeyecek kadar küçük kalır.

#### Deneme Maliyeti Eğrisi

Aşağıdaki birim iş çarpanının maliyet üzerindeki etkisini ölçer. Ölçüm kalıbı özeldir: ham süre
hiçbir yerde yazdırılmaz. Beklenen kat, girdiden — yani seçilen `N` değerlerinin oranından —
türetilir; ölçülen değer yalnızca bir bant denetiminden geçirilir ve sonuç `evet` ya da `hayır`
olarak yazılır. Bunun nedeni, mutlak sürenin makineye ve çalışma zamanına bağlı olmasıdır;
ölçülmek istenen ise makineden bağımsız olan orandır.

```js
// parola/carpan.mjs — is carpani ile deneme maliyeti egrisi. Sure ham olarak
// yazdirilmaz: beklenen kat girdiden (N oraninindan) turetilir, olculen deger yalnizca
// bant denetiminden gecirilip evet/hayir yazilir. Kurgu saha ekibi parolasi kullanilir.
import { scryptSync } from "node:crypto";

// KT8: anahtar turetme fonksiyonunun is carpani, tek bir denemenin birim maliyetini
//      dogrusal olarak buyutur; savunan taraf bu maliyeti bir kez, deneyen taraf aday
//      sayisi kadar oder.

const PAROLA = "kurgu-saha-ekibi-girisi";
const TUZ = Buffer.alloc(16, 3);                 // kurgu, sabit
const TABAN_US = 12;
const ayar = (us) => ({ N: 2 ** us, r: 8, p: 1, maxmem: 512 * 1024 * 1024 });
const olc = (us, kez) => {
  scryptSync(PAROLA, TUZ, 32, ayar(us));                       // isinma
  const t0 = process.hrtime.bigint();
  for (let i = 0; i < kez; i++) scryptSync(PAROLA, TUZ, 32, ayar(us));
  return Number(process.hrtime.bigint() - t0) / kez;
};
const taban = olc(TABAN_US, 8);
const ADAY = 1_000_000;                          // kurgu aday listesi buyuklugu
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 G = [8, 9, 11, 13, 22];
console.log(`taban is carpani N=2^${TABAN_US}; birim = taban carpanda tek deneme`);
yaz(G, "N", "bellek", "beklenen", "bant icinde", "aday listesi (birim)");
for (const us of [12, 13, 14, 15, 16]) {
  const beklenen = 2 ** (us - TABAN_US);                       // girdiden turetildi
  const oran = olc(us, us > 14 ? 1 : 3) / taban;               // yalnizca bant denetimi
  const bantta = oran >= beklenen * 0.55 && oran <= beklenen * 1.8 ? "evet" : "hayir";
  yaz(G, "2^" + us, (128 * 8 * 2 ** us / 2 ** 20) + " MiB", beklenen + "x", bantta,
      (ADAY * beklenen).toLocaleString("tr-TR"));
}
```

```
taban is carpani N=2^12; birim = taban carpanda tek deneme
       N   bellek   beklenen  bant icinde  aday listesi (birim)
    2^12    4 MiB         1x         evet             1.000.000
    2^13    8 MiB         2x         evet             2.000.000
    2^14   16 MiB         4x         evet             4.000.000
    2^15   32 MiB         8x         evet             8.000.000
    2^16   64 MiB        16x         evet            16.000.000
```

Beş satırın beşinde ölçülen oran beklenen katın bandı içinde kaldı. Eğri doğrusaldır: `N` iki
katına çıktığında hem birim maliyet hem de bellek tüketimi iki katına çıkar. Son sütun bunun
deneyen taraftaki karşılığıdır — bir milyonluk aday listesinin tamamı taban çarpanda bir milyon
birim, `N=2^16` çarpanında on altı milyon birim tutar.

Asimetri bu tabloda görünmez ama tabloyu okumanın tek yolu odur. Savunan taraf çarpanı on altı
katına çıkardığında **giriş başına** on altı kat öder ve bu, kullanıcının fark etmediği bir
gecikmedir. Deneyen taraf aynı kararın bedelini **aday başına** öder. Bir tarafta günde birkaç
bin giriş, öteki tarafta bir milyon aday vardır; aynı çarpan iki tarafta çok farklı toplamlara
gider.

Asimetriyi sayıya çevirmek için iki tarafın toplamını yazmak yeterlidir. Kurgu ağda 340 saha
hesabı var ve her hesap günde ortalama üç kez giriş yapıyor; bu, günde 1.020 doğrulamadır.
`N=2^16` çarpanında savunan tarafın günlük toplamı 16.320 birimdir. Deneyen taraf ise tuz
nedeniyle listeyi her kayıt için baştan geçmek zorundadır: 340 × 16.000.000, yani 5,44×10^9
birim. İki toplamın oranı üç yüz binin üzerindedir. Çarpanı büyütmenin savunan tarafa maliyeti
gündelik ve sabittir; deneyen tarafa maliyeti kayıt sayısıyla çarpılır.

Bellek sütunu ikinci ve ayrı bir kaldıraçtır. `N=2^16` için her deneme 64 MiB tutar. Bu miktar
tek bir doğrulama yapan sunucu için önemsizdir; çok sayıda denemeyi koşut yürütmek isteyen taraf
için belirleyicidir, çünkü koşutluk artık işlem birimi sayısıyla değil bellek miktarıyla
sınırlanır. İş çarpanı hesabı yavaşlatır, bellek katsayısı hesabı ucuz donanıma dağıtılamaz
kılar.

#### Tablo Kaç Kalemde İşe Yaramaz Olur

İş çarpanının kapatmadığı bir yol vardır. Aday listesinin karmaları bir kez hesaplanıp
saklanırsa, sızmış bir kayıt için yapılacak iş bir arama işlemine iner; hesap zaten yapılmıştır.
Tuzun ölçülen etkisi tam olarak buradadır ve etkisi kalem sayısıyla yazılır.

```js
// parola/tuz.mjs — on hesaplanmis tablonun tuz karsisinda kac kalemde ise yaramaz hale
// geldigi ve tuz uzunlugunu neyin belirledigi (model). Kurgu bolgesel olcum aginda 340
// saha ekibi hesabi var. Rastgelelik yok; her kosum ayni sayilari verir.

// KT9: on hesaplanmis tablo, ayni tuzu paylasan kayitlarin tamamina birden uyar; tuz
//      kayit basina ayri uretilirse ayni tablo yalnizca tek bir kayda uyar.
// KT10: tuz uzunlugunu belirleyen sey tablo boyutu degil, tuzlarin kendi aralarinda
//       cakismamasidir; olcut ikinci derste olculen dogum gunu sinirdir.

const ADAY = 1_000_000;                            // kurgu aday listesi
const KAYIT = 340;                                 // kurgu saha ekibi hesabi sayisi
const cift = (n) => (n * (n - 1)) / 2;
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 === 0 ? "0" : x >= 1e6 ? x.toExponential(2)
  : x >= 1 ? x.toLocaleString("tr-TR", { maximumFractionDigits: 2 })
  : x >= 1e-3 ? x.toFixed(3).replace(".", ",") : x.toExponential(1);

console.log(`aday listesi ${say(ADAY)}, kayit ${KAYIT}, kayit cifti ${say(cift(KAYIT))}`);
const G = [9, 10, 14, 14, 18];
yaz(G, "tuz biti", "ayri tuz", "tablo kalemi", "uydugu kayit", "beklenen cakisma");
for (const bit of [0, 8, 16, 32, 64, 128]) {
  const uzay = 2 ** bit;
  const ayri = Math.min(uzay, KAYIT);              // kullanimda olan ayri tuz sayisi
  yaz(G, bit, say(ayri), say(ADAY * ayri),         // tumunu kapsayan tablo kalemi
      say(Math.max(1, Math.round(KAYIT / uzay))), say(cift(KAYIT) / uzay));
}
const esik = Math.ceil(Math.log2(KAYIT));
console.log(`\ntuz uzayi ${KAYIT} kaydi astigi anda (${esik} bit) tablo kalemi ` +
  `${say(ADAY * KAYIT)} olur: kayit basina bastan is yapmakla ayni.`);

console.log("\ncakisma olcutu daha sikidir: beklenen tuz cakismasi 1'in altina insin");
const H = [12, 16, 12, 20];
yaz(H, "kayit", "kayit cifti", "en az bit", "128 bitte cakisma");
for (const n of [340, 12_400, 1e6, 1e9])
  yaz(H, say(n), say(cift(n)), Math.ceil(Math.log2(cift(n))), say(cift(n) / 2 ** 128));
```

```
aday listesi 1.00e+6, kayit 340, kayit cifti 57.630
 tuz biti  ayri tuz  tablo kalemi  uydugu kayit  beklenen cakisma
        0         1       1.00e+6           340            57.630
        8       256       2.56e+8             1            225,12
       16       340       3.40e+8             1             0,879
       32       340       3.40e+8             1            1.3e-5
       64       340       3.40e+8             1           3.1e-15
      128       340       3.40e+8             1           1.7e-34

tuz uzayi 340 kaydi astigi anda (9 bit) tablo kalemi 3.40e+8 olur: kayit basina bastan is yapmakla ayni.

cakisma olcutu daha sikidir: beklenen tuz cakismasi 1'in altina insin
       kayit     kayit cifti   en az bit   128 bitte cakisma
         340          57.630          16             1.7e-34
      12.400         7.69e+7          27             2.3e-31
     1.00e+6        5.00e+11          39             1.5e-27
     1.00e+9        5.00e+17          59             1.5e-21
```

İlk satır tuzsuz kurulumdur ve kritik sayı oradadır: bir milyon kalemlik tek bir tablo, 340
kaydın tamamına uyar. Yapılan iş bir kez yapılır ve kayıt sayısı kadar bölüşülür.

Sonraki satırlarda `uydugu kayit` sütunu 1'e iner ve bir daha yükselmez. Tuz sekiz bit
olduğunda bile bir tablo artık ortalama tek bir kayda uymaktadır. Bu, tuzun asıl etkisinin
uzunluktan değil **kayıt başına ayrı olmasından** geldiğini gösterir.

Bu ayrım kurulumdaki en yaygın kusuru da ölçer. Uygulama genelinde tek bir tuz kullanmak,
tuzun uzunluğu 128 bit bile olsa tabloda **sıfır bit satırına** düşer: ayrı tuz sayısı birdir,
tablo bir milyon kalemdir ve 340 kaydın tamamına uyar. Tuzu uzatmak bu satırı hiç
değiştirmez; onu değiştiren tek şey tuzun kayıt başına ayrı üretilmesidir. Aynı biçimde,
kullanıcı kodundan ya da kayıt zamanından türetilen tuz da tabloyu geri getirir, çünkü tablo
o türetimi de önceden yapabilir.

Eşik `tablo kalemi` sütununda okunur. Tuz uzayı kayıt sayısını aştığı anda — burada dokuz bit —
tabloyu bütün kayıtlara uydurmak 3,4×10^8 kalem ister ve bu, her kayıt için baştan iş yapmakla
aynıdır. Dokuz bitten sonra sütun sabitlenir; daha uzun tuz, tabloyu daha fazla işe yaramaz
kılmaz, çünkü zaten tamamen işe yaramaz durumdadır. Ön hesaplama, tuz karşısında **9 bitte**
avantajını yitirir.

#### Tuz Uzunluğunu Ne Belirliyor

**KT10:** tuz uzunluğunu belirleyen şey tablo boyutu değil, tuzların kendi aralarında
çakışmamasıdır; ölçüt önceki derste ölçülen doğum günü sınırıdır.

Dokuz bit yetiyorsa, yerleşik seçim neden on altı bayttır? İkinci tablo yanıtı verir ve ölçüt
önceki dersten gelir. Tuz kayıt başına ayrı olmalıdır; iki kaydın aynı tuza düşmesi, o iki kayıt
arasında tek tablo avantajını geri getirir. Aynı tuza düşme olasılığı ise doğum günü sınırına
tabidir.

Tablo bunu sayıya çevirir. 340 kayıtta beklenen çakışmanın birin altına inmesi için en az on altı
bit gerekir — dokuz değil. Kayıt sayısı 12.400'e çıkınca eşik yirmi yediye, bir milyona çıkınca
otuz dokuza, bir milyara çıkınca elli dokuza gider. Eşik kayıt sayısıyla birlikte hareket eder ve
bir kurulumda kaç kayıt olacağı yazılırken bilinmez.

On altı baytlık tuz bu belirsizliği ortadan kaldıran seçimdir. 128 bitte beklenen çakışma bir
milyar kayıtta bile 1,5×10^-21'dir; kayıt sayısı hangi mertebeye giderse gitsin ölçüt sağlanır.
Seçimin gerekçesi "daha uzun daha iyidir" değil, **eşiğin hesaplanmasına gerek bırakmamasıdır**.
Tuz gizli olmadığı ve karmanın yanında saklandığı için uzatmanın bir maliyeti de yoktur:
340 kayıt için on altışar bayt, toplam 5.440 bayttır ve bu, tek bir kaydın geri kalanının
yanında ölçülemeyecek kadar küçüktür. Son sütunun dört satırında da çakışma olasılığı sıfıra
yuvarlanacak mertebede kalır; parametreyi bir kez fazlasıyla seçmek, her kurulumda yeniden
hesaplamaktan ucuzdur.

#### İki Çarpanın Onaramadığı Kök

Bu dersin üçüncü sayısı, ilk ikisinin yetmediği yerdedir. İş çarpanı birim maliyeti çarpar, tuz
tekrarlanacak küme sayısını çarpar; ikisi de aday listesinin **kendisine** dokunmaz.

Güven kökü buradadır ve adı şudur: parolanın aday listesinde bulunmaması. Kök tutuyorsa arama
listede değil uzayın tamamında yapılır ve önceki dersin 2^n sınırı geçerli olur. Kök
kırıldığında — yani parola listedeyse — kırılan tek kalem o hesabın kaydıdır, ama kırılmanın
maliyeti listedeki sırasıyla orantılıdır. Bir milyonluk listenin başındaki bir aday, `N=2^16`
çarpanında birkaç birime bulunur; iş çarpanının on altı katı da bunu değiştirmez.

Kalem sayısı bu yüzden asimetriktir. Tuz ve iş çarpanı, 340 kaydın tamamını **birden** düşmekten
korur: kırılma kayıt kayıt olur, toplu olmaz. Öngörülemezlik kökü ise kayıt başına ayrıdır ve
tek bir kaydın kırılması diğer 339'unu etkilemez. Üç savunma üç ayrı şeyi yapar ve hiçbiri
ötekinin yerini almaz.

Yenileme bedeli üç savunmada üç ayrı sayıdır. İş çarpanını yükseltmek elle sıfır kalemdir:
kayıt, kullanıcının bir sonraki başarılı girişinde yeni çarpanla yeniden üretilir ve kimse bir
şey yapmaz. Tuzu yenilemek de sıfır kalemdir, çünkü tuz zaten her parola değişikliğinde
yenilenir. Kayıtların sızması durumunda ise yenileme 340 elle kalemdir — her hesabın parolası
yeniden belirlenmek zorundadır ve bu, tek tek insan eylemi gerektirir. Sızıntı penceresinde
duran meşru iş de sayılır: parolalar yenilenene kadar saha ekiplerinin girişi ya kapalı kalır
ya da kırılmış sayılan bir kayıtla açık tutulur. Bu kursun üçüncü sütunu her derste aynı biçimde
okunur — kırılmanın büyüklüğü değil, **kırılmadan sonra elle dokunulan kalem sayısı**.

#### Özet

- İş çarpanı deneme başına birim maliyeti doğrusal büyütür: `N` 2^12'den 2^16'ya çıktığında beş
  ölçümün beşi de beklenen katın bandı içinde kalır ve bir milyonluk liste 1 milyon birimden
  16 milyon birime çıkar.
- Aynı karar iki tarafta farklı toplama gider: savunan taraf giriş başına, deneyen taraf aday
  başına öder; bellek katsayısı ayrıca koşutluğu bellekle sınırlar.
- Tuzsuz kurulumda bir milyon kalemlik tek tablo 340 kaydın tamamına uyar; tuz kayıt başına ayrı
  olduğunda aynı tablo tek bir kayda uyar.
- Ön hesaplama tuz karşısında 9 bitte avantajını yitirir; bundan sonrası tabloyu daha işe
  yaramaz kılmaz.
- Tuz uzunluğunu belirleyen ölçüt tablo boyutu değil çakışmadır: 340 kayıtta eşik 16 bit,
  bir milyarda 59 bittir; 128 bit eşiğin hesaplanmasını gereksiz kılar.

#### Sonraki Adım

Buraya kadarki üç ders tek yönlü işlemlerin etrafında döndü: karma geri dönmüyordu ve amaç zaten
geri dönmemekti. Oysa kurgu ölçüm ağının asıl trafiği 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. Sonraki ders o birinci kalemi asıl sorunuyla birlikte ele alıyor.
Aynı anahtarı iki tarafın da bilmesi gerekiyorsa, o anahtar oraya nasıl gitti? Altı şube ve
merkez arasında kaç ayrı anahtar tutulur, ağa yeni bir şube eklendiğinde kaç kalem eklenir ve
tek bir anahtar sızdığında kaç bağlantı yenilenmek zorunda kalır — hepsi sayılabilir.

### Simetrik Şifreleme

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/simetrik-sifreleme

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.

Ö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.

```js
// 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, ama bedeli yalnız aynı düz metnin aynı çıktıyı vermesi değildir — aynı anahtarla
tekrarlanan bir nonce, doğrulama etiketini üreten alt anahtarı ele verir ve korumanın tamamı
çöker.

#### 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.

```js
// 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.

### Asimetrik Şifreleme

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/asimetrik-sifreleme

Açık ve özel anahtarın rollerinin ayrılması: dört anahtar-işlem birleşiminden ikisinin çalışması ve birinin gizlilik, ötekinin kaynak iddiası vermesi, 2048 bitlik modülde 190 baytlık üst sınır, gizli kalem sayısının 12.401 katılımcıda 7,69×10^7'den 12.401'e inmesi ve taşınan gizli kalemin sıfırlanması, melez kullanımın şişmeyi yüzde 38'den yüzde 7'ye indirmesi.

Önceki dersin çözümsüz kalemi tek bir cümledeydi: ş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 açarı taşır.

Bu ders kilidi ikiye ayırır. Birlikte üretilen iki anahtardan biri kilitler, öteki açar; ikisi
birbirinin yerine geçmez ve 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 ve çalışanlar ne sağlar?

#### İki Anahtar, Bir Çift

**KT14:** asimetrik şifrelemede iki anahtar birlikte üretilir ve matematiksel olarak bağlıdır.
Biriyle yapılan işlem yalnızca ötekiyle geri alınır; aynı anahtarla geri alınmaz.

**KT15:** açık anahtarla şifreleme gizlilik verir — çıktıyı yalnızca özel anahtarın sahibi
okuyabilir. Özel anahtarla şifreleme gizlilik vermez, çünkü açık anahtar herkestedir; taşıdığı
şey kaynak iddiasıdır.

```js
// asim/rol.mjs — acik ve ozel anahtarin hangi islemi hangi yonde yaptigi gercekten
// kosturulur. Kurgu bolgesel olcum aginda merkez icin bir anahtar cifti uretilir;
// anahtar malzemesi yazdirilmaz, yalnizca uzunluk ve sonuc yazilir.
import { generateKeyPairSync, publicEncrypt, privateDecrypt,
         privateEncrypt, publicDecrypt, constants } from "node:crypto";

// KT14: asimetrik sifrelemede iki anahtar birlikte uretilir; biriyle yapilan islem
//       yalnizca otekiyle geri alinir, ayni anahtarla geri alinmaz.
// KT15: acik anahtarla sifreleme gizlilik verir (yalniz ozel anahtar sahibi okur);
//       ozel anahtarla sifreleme gizlilik vermez, kaynak iddiasini tasir.

const BIT = 2048;
const { publicKey: ACIK, privateKey: OZEL } = generateKeyPairSync("rsa", { modulusLength: BIT });
const OKUMA = "SAY-4417|2026-03-01T06:00Z|41982";
const OAEP = { oaepHash: "sha256", padding: constants.RSA_PKCS1_OAEP_PADDING };
const dene = (f) => { try { return f().toString() === 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 oaepSifreli = publicEncrypt({ key: ACIK, ...OAEP }, Buffer.from(OKUMA));
const ozelSifreli = privateEncrypt(OZEL, Buffer.from(OKUMA));
const R = [-12, -12, 9, -24];
yaz(R, "sifreleyen", "geri alan", "calisti", "  ne saglar");
for (const [a, b, f, ne] of [
  ["acik", "ozel", () => privateDecrypt({ key: OZEL, ...OAEP }, oaepSifreli), "gizlilik"],
  ["acik", "acik", () => publicDecrypt(ACIK, oaepSifreli), "-"],
  ["ozel", "acik", () => publicDecrypt(ACIK, ozelSifreli), "kaynak iddiasi"],
  ["ozel", "ozel", () => privateDecrypt(OZEL, ozelSifreli), "-"],
]) yaz(R, a, b, dene(f), "  " + ne);

const enCok = BIT / 8 - 2 * 32 - 2;                  // OAEP-SHA256 icin ust sinir
const sigar = (n) => { try { publicEncrypt({ key: ACIK, ...OAEP }, Buffer.alloc(n));
                             return "evet"; } catch { return "hayir"; } };
console.log(`\nmodul ${BIT} bit = ${BIT / 8} bayt; OAEP-SHA256 ust siniri ${enCok} bayt`);
const S = [10, 9, 12];
yaz(S, "duz metin", "sigdi", "sifreli boy");
for (const n of [32, enCok, enCok + 1])
  yaz(S, n + " bayt", sigar(n), sigar(n) === "evet"
    ? publicEncrypt({ key: ACIK, ...OAEP }, Buffer.alloc(n)).length + " bayt" : "-");
console.log(`okuma ${Buffer.byteLength(OKUMA)} bayt; sifreli hali ${oaepSifreli.length} bayt`);
```

```
sifreleyen  geri alan     calisti  ne saglar
acik        ozel             evet  gizlilik
acik        acik            hayir  -
ozel        acik             evet  kaynak iddiasi
ozel        ozel            hayir  -

modul 2048 bit = 256 bayt; OAEP-SHA256 ust siniri 190 bayt
 duz metin    sigdi sifreli boy
   32 bayt     evet    256 bayt
  190 bayt     evet    256 bayt
  191 bayt    hayir           -
okuma 32 bayt; sifreli hali 256 bayt
```

Dört birleşimin ikisi çalışır ve ikisi çalışmaz. Çalışmayan iki satır aynı şeyi söyler: bir
anahtarla yapılan işlem o anahtarla geri alınmaz. Bu, simetrik düzenle arasındaki tek yapısal
farktır ve dersin geri kalanı bu farkın sonuçlarını sayar.

Çalışan iki satır ise birbirinin karşıtıdır. **Açık anahtarla şifrele, özel anahtarla çöz**
yönü gizlilik verir: açık anahtar herkeste olduğu için herkes merkeze şifreli okuma
gönderebilir, ama okuyabilen tek taraf özel anahtarın sahibidir. Kurgu ölçüm ağında bunun
anlamı, 12.400 sayaç ucunun hiçbirinin ötekinin gönderdiğini okuyamamasıdır.

**Özel anahtarla şifrele, açık anahtarla geri al** yönü ise gizlilik vermez — açık anahtar
herkeste olduğu için çıktıyı herkes geri alabilir. Verdiği şey kaynak iddiasıdır: geri alma
başarılıysa, işlemi yapan taraf özel anahtarı elinde tutan taraftır. Bu yön dijital imzanın
temelidir ve yedinci derste kendi biçimiyle ele alınır.

Alt tablo asimetrik şifrelemenin ikinci kısıtını verir. Modül 256 bayttır ve dolgu düzeni bunun
66 baytını tüketir; taşınabilecek en büyük düz metin 190 bayttır. 190 bayt çalışır, 191 bayt
çalışmaz. Çıktı ise girdi ne olursa olsun 256 bayttır — 32 baytlık bir okuma da 256 bayta çıkar,
sekiz katlık bir şişme.

#### Gizli Kalem Sayısı ve Melez Kullanım

Boyut sınırı bir engel gibi görünür ama asıl ölçüm başka yerdedir: bu düzen kaç gizli kalem
gerektiriyor ve bunların kaçı taşınıyor?

```js
// asim/kalem.mjs — asimetrik duzenin gizli kalem sayisina etkisi ve buyuk veri icin
// melez kullanim (model + kosan olcum). Katilimci sayilari kurgudur.
import { generateKeyPairSync, publicEncrypt, privateDecrypt, randomBytes,
         createCipheriv, createDecipheriv, constants } from "node:crypto";

// KT16: asimetrik duzen gizli kalem sayisini n(n-1)/2'den n'e indirir ve gizli kalemlerin
//       hicbiri tasinmaz; tasinan tek sey acik anahtardir ve o gizli degildir.

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 A = [10, 12, 11, 11, 14, 14];
yaz(A, "katilimci", "simetrik", "asimetrik", "asimetrik", "tasinan gizli", "tasinan gizli");
yaz(A, "", "gizli kalem", "gizli", "acik", "kalem (sim)", "kalem (asim)");
for (const n of [2, 7, 40, 12_401]) {
  const c = (n * (n - 1)) / 2;
  yaz(A, say(n), say(c), say(n), say(n), say(c), 0);
}

const { publicKey: ACIK, privateKey: OZEL } = generateKeyPairSync("rsa", { modulusLength: 2048 });
const OAEP = { oaepHash: "sha256", padding: constants.RSA_PKCS1_OAEP_PADDING };
const YIGIN = Buffer.alloc(4096, 65);                // kurgu gunluk okuma yigini
const UST = 190;                                     // OAEP-SHA256 ust siniri

const anahtar = randomBytes(32), nonce = randomBytes(12);
const s = createCipheriv("aes-256-gcm", anahtar, nonce);
const govde = Buffer.concat([s.update(YIGIN), s.final()]), etiket = s.getAuthTag();
const zarf = publicEncrypt({ key: ACIK, ...OAEP }, anahtar);
const c = createDecipheriv("aes-256-gcm", privateDecrypt({ key: OZEL, ...OAEP }, zarf), nonce);
c.setAuthTag(etiket);
const geri = Buffer.concat([c.update(govde), c.final()]);

console.log(`\n${YIGIN.length} baytlik yigin iki yolla tasinsa:`);
const B = [-16, 12, 12, 12, 10];
yaz(B, "yol", "asimetrik", "simetrik", "cikti bayt", "sisme");
const dogrudan = Math.ceil(YIGIN.length / UST);
yaz(B, "dogrudan RSA", dogrudan, 0, say(dogrudan * 256),
    "%" + Math.round((dogrudan * 256 / YIGIN.length - 1) * 100));
const melez = zarf.length + nonce.length + govde.length + etiket.length;
yaz(B, "melez", 1, 1, say(melez), "%" + Math.round((melez / YIGIN.length - 1) * 100));
console.log("melez yol yigini aynen geri verdi mi:", geri.equals(YIGIN) ? "evet" : "hayir");
```

```
 katilimci    simetrik  asimetrik  asimetrik tasinan gizli tasinan gizli
           gizli kalem      gizli       acik   kalem (sim)  kalem (asim)
         2           1          2          2             1             0
         7          21          7          7            21             0
        40         780         40         40           780             0
    12.401     7.69e+7     12.401     12.401       7.69e+7             0

4096 baytlik yigin iki yolla tasinsa:
yol                asimetrik    simetrik  cikti bayt     sisme
dogrudan RSA              22           0       5.632       %38
melez                      1           1       4.380        %7
melez yol yigini aynen geri verdi mi: evet
```

Birinci tablonun ikinci ve üçüncü sütunu önceki dersin sorusunu kapatır. 12.401 katılımcı için
simetrik düzen 7,69×10^7 gizli kalem isterken asimetrik düzen 12.401 ister — kareselden
doğrusala iner. Açık anahtar sayısı da 12.401'dir ama o kalemler gizli değildir ve gizli
olmayan bir kalemin yönetim maliyeti bambaşkadır.

Asıl sayı son sütundadır ve sıfırdır. Simetrik düzende her gizli kalem iki tarafa **taşınmak**
zorundadır; 12.401 uçlu ağda bu 7,69×10^7 taşıma demektir ve önceki derste sayılan elle
kalemlerin kaynağı buydu. Asimetrik düzende taşınan gizli kalem yoktur: her taraf kendi özel
anahtarını kendi üretir ve hiçbir yere göndermez. Taşınan tek şey açık anahtardır ve o açık
kanaldan gidebilir.

İkinci tablo boyut sınırının nasıl aşıldığını gösterir. 4096 baytlık bir yığın doğrudan
asimetrik şifrelemeyle taşınırsa 22 ayrı işlem gerekir ve çıktı 5.632 bayta, yüzde 38 şişmeye
çıkar. Melez yolda ise asimetrik şifreleme yalnızca 32 baytlık bir simetrik anahtarı taşır;
yığının kendisi simetrik kiple şifrelenir. İşlem sayısı bire iner, çıktı 4.380 bayt olur ve
şişme yüzde 7'ye düşer. Son satır bu yolun gerçekten çalıştığını doğrular.

İşlem sayısındaki fark yalnız bir bayt hesabı değildir. Asimetrik işlemler simetrik işlemlerden
kat kat pahalıdır ve doğrudan yol, 4 kilobaytlık bir yığın için bu pahalı işlemi 22 kez
tekrarlar. Melez yolda pahalı işlem bir kez yapılır ve yığının tamamı ucuz işlemle taşınır.
Kurgu ağda günde 12.400 yığın işleniyorsa, iki yol arasındaki fark günlük 260.400 fazladan
asimetrik işlemdir.

Melez düzenin ayrımı nettir: asimetrik şifreleme **anahtar taşır**, simetrik şifreleme **veri
taşır**. Her ikisinin de zinciri kendi dersindeki gibi kalır; melez yolda zincir uzar, çünkü
artık hem özel anahtarın gizliliği hem de simetrik zincirin dört kalemi aynı anda doğru olmak
zorundadır.

#### Anahtar Uzunlukları Neden Karşılaştırılamaz

Simetrik anahtar 256 bit, buradaki asimetrik anahtar 2048 bitti. Sayılar aynı ölçekte
okunamaz, çünkü iki düzenin güvenliği farklı yerden gelir. Simetrik anahtarda tek yol anahtarı
tek tek denemektir ve maliyet 2^256'dır. Asimetrik anahtarda ise açık anahtar, özel anahtarla
matematiksel olarak bağlıdır ve o bağı çözmenin tek tek denemekten ucuz yolları vardır; anahtar
uzunluğu bu ucuz yolları karşılamak için büyütülür.

| Düzen | Anahtar biti | Eşdeğer simetrik güvenlik | Anahtar/çıktı boyu |
|---|---|---|---|
| simetrik | 128 | 128 bit | 16 bayt |
| simetrik | 256 | 256 bit | 32 bayt |
| çarpanlara ayırmaya dayalı | 2048 | yaklaşık 112 bit | 256 bayt |
| çarpanlara ayırmaya dayalı | 3072 | yaklaşık 128 bit | 384 bayt |
| eliptik eğriye dayalı | 256 | yaklaşık 128 bit | 32 bayt |

Tablonun okunuşu şudur: 2048 bitlik bir asimetrik anahtar, 256 bitlik bir simetrik anahtarın
sağladığı güvenliğe yaklaşmaz; yaklaşık 112 bitlik bir simetrik anahtara denktir. Eşdeğerliği
yükseltmek için asimetrik tarafta anahtarı 3072 bite çıkarmak gerekir ve bu, her işlemin
çıktısını 384 bayta taşır.

Son satır ayrı bir seçenektir. Eliptik eğriye dayalı düzende aynı eşdeğerlik 256 bitlik bir
anahtarla, yani 32 baytla elde edilir. Kurgu ölçüm ağında bu fark doğrudan kaleme çevrilir:
12.400 uç her mesajda 256 baytlık bir zarf taşırsa günlük yük, 32 baytlık zarfa göre sekiz
katıdır. Kısıtlı uçlarda seçimi belirleyen şey algoritmanın adı değil, bu boyut aritmetiğidir.

#### Kökün Adı ve Kanıtlanmayan Kalem

Güven kökü burada tek bir kalemdir: özel anahtarın yalnızca sahibinde bulunması. Bu kalem
anahtarın üretildiği anda doğar ve üretimin nerede yapıldığı kökün ilk kalemidir. Anahtar çifti
merkezde üretilip uçlara dağıtılırsa, özel anahtar en az bir kez taşınmış olur ve önceki dersin
taşıma sorunu geri gelir; her uç kendi çiftini kendi üretirse taşınan gizli kalem sıfır kalır.
Kendi üretimin kendi koşulu vardır: uçtaki rastgele sayı üretecinin öngörülemez olması. Öngörülebilir
bir üreteçle üretilmiş bir çiftte özel anahtar hiç sızmasa bile yeniden üretilebilir. Kök kırıldığında
düşen kalem sayısı simetrik düzenden farklıdır. Bir özel anahtar sızarsa, o anahtar sahibine
gönderilmiş bütün geçmiş ve gelecek mesajlar düşer; 12.401 katılımcılı ağda merkeze gelen bütün
trafiktir bu. Yenileme ise ucuzdur — yeni bir çift üretilir ve **açık** anahtar dağıtılır; gizli
bir kalem taşınmaz.

Kökün nerede durduğu ayrı bir kalem sayısıdır. Özel anahtar merkezde bir dosyada duruyorsa, ona
erişebilen kalemler tek tek sayılabilir: dosyanın izin kaydı, dosyayı okuyan sürecin belleği,
yedek kopyası, yedeğin taşındığı ortam ve dağıtımı yapan otomasyonun eriştiği kopya — beş kalem.
Beşinin beşi aynı anda doğru tutulmalıdır ve herhangi birindeki kusur kökü açar.

Anahtarın hiç dışarı çıkmadığı bir **donanım güvenlik birimi** içinde üretilip orada tutulması
bu sayıyı değiştirir. Anahtar birimin dışına çıkmadığı için okunacak bir dosya, alınacak bir
yedek ve taşınacak bir kopya yoktur; geriye tek bir kalem kalır — birimi kullanma yetkisi. Kalem
sayısı beşten bire iner. Bedeli de sayılabilir: anahtar dışarı çıkarılamadığı için yedeği de
alınamaz ve birim kaybolursa anahtar kalıcı olarak kaybolur, yani yenileme 12.401 uçta açık
anahtar dağıtımı demektir.

Ama zincirde adı konmamış bir kalem daha vardır ve bu ders onu kapatmaz. Bir sayaç ucu merkeze
şifreli okuma göndermek için merkezin açık anahtarını kullanır. O açık anahtarın gerçekten
merkeze ait olduğunu kanıtlayan hiçbir şey yoktur. Açık anahtar gizli olmadığı için açık
kanaldan gelir ve açık kanaldan gelen her şey değiştirilebilir. Yanlış bir açık anahtarla
şifrelenen okuma, o anahtarın özel eşini elinde tutan tarafça okunur.

Bu kalem, kursun ikinci konusunun tamamının konusudur. Bu derste yalnızca sayılabilir: dört
birleşimden ikisi çalışıyor, gizli kalem sayısı doğrusala iniyor, taşınan gizli kalem sıfır —
ve **açık anahtarın sahibi hâlâ doğrulanmamış** durumda.

#### Özet

- Açık ve özel anahtar birlikte üretilir; dört anahtar-işlem birleşiminden ikisi çalışır ve bir
  anahtarla yapılan işlem aynı anahtarla geri alınmaz.
- Açık anahtarla şifrelemek gizlilik verir; özel anahtarla şifrelemek gizlilik vermez, kaynak
  iddiası taşır.
- 2048 bitlik modülde taşınabilecek en büyük düz metin 190 bayttır ve çıktı girdi ne olursa
  olsun 256 bayttır.
- Asimetrik düzen gizli kalem sayısını 12.401 katılımcıda 7,69×10^7'den 12.401'e indirir;
  taşınan gizli kalem sayısı sıfırdır.
- Melez kullanımda asimetrik şifreleme anahtarı, simetrik şifreleme veriyi taşır: 4096 baytlık
  yığında işlem sayısı 22'den 1'e, şişme yüzde 38'den yüzde 7'ye iner.
- Güven kökü özel anahtarın gizliliğidir; açık anahtarın kime ait olduğu bu düzende
  kanıtlanmaz.

#### Sonraki Adım

Melez yol anahtarı taşıdı ama taşınan anahtarı gönderen taraf **seçti**. Bunun iki sonucu var.
Birincisi, oturum anahtarının kalitesi tümüyle o tarafın üretecine bağlı. İkincisi ve daha
ağırı: kaydedilmiş şifreli trafik saklanır ve merkezin özel anahtarı yıllar sonra sızarsa,
o güne kadarki bütün oturum anahtarları zarflardan geri çıkarılır ve geçmiş trafiğin tamamı
açılır. Sonraki ders bu iki sonucu birden ortadan kaldıran bir yöntemi küçük parametrelerle
gerçekten koşturuyor: iki tarafın da katkı verdiği, kanaldan hiç geçmeyen ve hiçbir tarafın tek
başına belirlemediği bir ortak sır. Dinleyicinin elinde kalan kalemler tek tek sayılacak.

### Anahtar Değişimi

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/anahtar-degisimi

Güvensiz kanalda ortak sır üretiminin küçük parametrelerle koşturulması: iki tarafın gizli üssünü hiç göndermeden aynı ortak sırra ulaşması, kanalda geçen 4 kalem ile sırra yeten 3 kalemin kesişiminin sıfır olması, geçici anahtar değişiminin geçmişe dönük açılan oturum sayısını 52.560'tan 0'a indirmesi ve değişimin üç kaleminden ikisini doğrulayıp karşı tarafın kimliğini doğrulamaması.

Önceki dersteki melez yol anahtarı taşıdı ama taşınan anahtarı gönderen taraf seçti. Bunun
iki sonucu vardı. Birincisi, oturum anahtarının kalitesi tümüyle o tarafın üretecine bağlıydı.
İkincisi ve daha ağırı: kaydedilmiş şifreli trafik saklanabilir ve özel anahtar yıllar sonra
sızarsa, o güne kadarki bütün oturum anahtarları zarflardan geri çıkarılır.

Bu ders ikisini birden ortadan kaldıran yöntemi ele alır. İki taraf, gizli değerlerini hiç
göndermeden aynı ortak sırra ulaşır; ortak sır kanaldan geçmez ve hiçbir taraf onu tek başına
belirlemez. Yöntem küçük parametrelerle gerçekten koşturulacak, sonra dinleyicinin elinde kalan
kalemler tek tek sayılacak.

#### Kanaldan Geçmeyen Sır

**KT17:** iki taraf, gizli üssünü hiç göndermeden ortak bir sır üretebilir; kanaldan geçen
kalemler ile ortak sır arasında doğrudan bir hesap yolu yoktur.

**KT18:** ortak sır iki tarafın katkısıyla oluşur; hiçbir taraf onu tek başına belirlemez.

Yöntem şudur. Taraflar bir asal `p` ve bir üreteç `g` üzerinde açıkça anlaşır. Her taraf gizli
bir üs seçer, `g` üssünü `p` modunda hesaplar ve **sonucu** karşıya gönderir. Karşıdan gelen
değeri kendi gizli üssüyle yeniden üsse alan iki taraf da aynı değere iner, çünkü üs alma
sırasından bağımsızdır. Aşağıdaki parametreler öğretim boyutundadır ve gerçek bir kurulumda
kullanılmaz.

```js
// degisim/dh.mjs — anahtar degisimi kucuk parametrelerle gercekten kosturulur. p ve g
// ogretim icin secilmis kucuk kurgu degerlerdir; gercek kurulumda kullanilmaz. Ozel
// usler sabittir ki cikti kosumdan kosuma ayni kalsin. Rastgelelik yok.
import { hkdfSync, createCipheriv, createDecipheriv } from "node:crypto";

// KT17: iki taraf, gizli usunu hic gondermeden ortak bir sir uretebilir; kanaldan gecen
//       kalemler ile ortak sir arasinda dogrudan bir hesap yolu yoktur.
// KT18: ortak sir iki tarafin katkisiyla olusur; hicbir taraf onu tek basina belirlemez.

const p = 65267n, g = 2n;                     // kurgu, ogretim boyutunda asal ve uretec
const usal = (t, u, m) => { let r = 1n; t %= m;
  while (u > 0n) { if (u & 1n) r = r * t % m; t = t * t % m; u >>= 1n; } return r; };

const a = 6421n, b = 8973n;                   // kurgu gizli usler: sube ve merkez
const A = usal(g, a, p), B = usal(g, b, p);   // kanaldan gecen genel degerler
const subeSir = usal(B, a, p), merkezSir = usal(A, b, p);

console.log(`kanaldan gecen kalemler : p=${p} g=${g} A=${A} B=${B}`);
console.log("kanaldan gecmeyen kalem : a ve b (iki gizli us)");
console.log("sube  ortak sir         :", String(subeSir));
console.log("merkez ortak sir        :", String(merkezSir));
console.log("iki taraf ayni sirri mi uretti:", subeSir === merkezSir ? "evet" : "hayir");
console.log("ortak sir kanaldan gecti mi  :",
  [p, g, A, B].includes(subeSir) ? "evet" : "hayir");

// Ortak sir dogrudan anahtar olarak kullanilmaz; anahtar turetme ile sabit boya cekilir.
const ham = Buffer.from(subeSir.toString(16).padStart(4, "0"), "hex");
const anahtar = Buffer.from(hkdfSync("sha256", ham, Buffer.alloc(16, 9),
  "olcum-agi-oturum", 32));
const nonce = Buffer.alloc(12, 4), OKUMA = "SAY-4417|2026-03-01T06:00Z|41982";
const s = createCipheriv("aes-256-gcm", anahtar, nonce);
const govde = Buffer.concat([s.update(OKUMA, "utf8"), s.final()]), etiket = s.getAuthTag();
const c = createDecipheriv("aes-256-gcm", Buffer.from(hkdfSync("sha256",
  Buffer.from(merkezSir.toString(16).padStart(4, "0"), "hex"), Buffer.alloc(16, 9),
  "olcum-agi-oturum", 32)), nonce);
c.setAuthTag(etiket);
console.log("turetilen anahtar boyu       :", anahtar.length, "bayt");
console.log("merkez, sube paketini cozdu  :",
  Buffer.concat([c.update(govde), c.final()]).toString() === OKUMA ? "evet" : "hayir");
```

```
kanaldan gecen kalemler : p=65267 g=2 A=10224 B=40077
kanaldan gecmeyen kalem : a ve b (iki gizli us)
sube  ortak sir         : 41173
merkez ortak sir        : 41173
iki taraf ayni sirri mi uretti: evet
ortak sir kanaldan gecti mi  : hayir
turetilen anahtar boyu       : 32 bayt
merkez, sube paketini cozdu  : evet
```

Beşinci satır yöntemin tamamıdır: şube 41173'e, merkez de 41173'e ulaştı ve bu değer hiçbir
zaman gönderilmedi. Kanaldan yalnız 65267, 2, 10224 ve 40077 geçti.

Son iki satır ortak sırrın nasıl kullanıldığını gösterir. Ham ortak sır doğrudan anahtar olarak
kullanılmaz — sayısal bir değerdir, uzunluğu parametreye bağlıdır ve dağılımı bir anahtardan
beklenen dağılım değildir. Anahtar türetme işlemi onu sabit boyda, düzgün dağılmış bir anahtara
çevirir. Türetilen anahtarla şifrelenen paketi karşı taraf kendi ortak sırrından türettiği
anahtarla çözebiliyor; zincir uçtan uca çalışıyor.

#### Dinleyicinin Elindeki Kalemler

Yöntemin dayandığı şey, `g^a mod p` değerinden `a` değerine dönmenin — kısaca kesikli
logaritmanın — pahalı olmasıdır. Aşağıdaki sayım bunu kalem kalem yazar.

```js
// degisim/kalem.mjs — anahtar degisiminin kalem sayimi (model): dinleyicinin elindeki
// kalemler, parametre boyu ile aday us sayisi, gecmise donuk acilan oturum sayisi ve
// dogrulanan kalem sayisi. Kurgu bolgesel olcum agi sayilari kullanilir.

// KT19: anahtar degisimi ortak sirri uretir ama karsi tarafin kimligini dogrulamaz;
//       dogrulanmayan bir degisimde iki taraf ayri ayri iki sir uzerinde anlasabilir.

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));

console.log("dinleyicinin elindeki kalemler:");
const A = [-26, 10, 12];
yaz(A, "kalem", "kanalda", "sirra yeter");
for (const [ad, kanal, yeter] of [
  ["asal p", "evet", "hayir"], ["uretec g", "evet", "hayir"],
  ["subenin genel degeri A", "evet", "hayir"], ["merkezin genel degeri B", "evet", "hayir"],
  ["subenin gizli usu a", "hayir", "evet"], ["merkezin gizli usu b", "hayir", "evet"],
  ["ortak sir", "hayir", "evet"],
]) yaz(A, ad, kanal, yeter);
console.log("kanalda gecen kalem 4, sirra yeten kalem 3, ikisinin kesisimi 0");

console.log("\naday us sayisi parametre boyuyla:");
const B = [10, 20, 18];
yaz(B, "p biti", "aday us", "kurgu agda sinama");
for (const bit of [16, 32, 64, 2048])
  yaz(B, bit, bit <= 32 ? (2 ** bit).toLocaleString("tr-TR") : "2^" + bit,
      bit <= 32 ? "sayilabilir" : "sayilamaz");

const SUBE = 6, OTURUM = 24 * 365;                 // kurgu: sube basina saatlik oturum
console.log(`\ngecmise donuk acilma (kurgu ${SUBE} sube, sube basina ${OTURUM} oturum/yil):`);
const C = [-24, -16, 16];
yaz(C, "duzen", "sirri belirleyen", "acilan oturum");
yaz(C, "asimetrik zarfla tasima", "gonderen taraf", (SUBE * OTURUM).toLocaleString("tr-TR"));
yaz(C, "gecici anahtar degisimi", "iki taraf birden", 0);

console.log("\ndegisimin dogruladigi kalem:");
const D = [-32, 13];
yaz(D, "kalem", "dogrulaniyor");
for (const [ad, d] of [["ortak sirrin gizliligi", "evet"],
                       ["iki tarafin ayni sirri uretmesi", "evet"],
                       ["karsi tarafin kimligi", "hayir"]]) yaz(D, ad, d);
console.log("3 kalemden 2'si dogrulaniyor; dogrulanmayan kalem araya giren bir tarafin");
console.log("iki ayri degisim yurutmesine kapiyi acik birakir (model, 2 ayri ortak sir).");
```

```
dinleyicinin elindeki kalemler:
kalem                        kanalda sirra yeter
asal p                          evet       hayir
uretec g                        evet       hayir
subenin genel degeri A          evet       hayir
merkezin genel degeri B         evet       hayir
subenin gizli usu a            hayir        evet
merkezin gizli usu b           hayir        evet
ortak sir                      hayir        evet
kanalda gecen kalem 4, sirra yeten kalem 3, ikisinin kesisimi 0

aday us sayisi parametre boyuyla:
    p biti             aday us kurgu agda sinama
        16              65.536       sayilabilir
        32       4.294.967.296       sayilabilir
        64                2^64         sayilamaz
      2048              2^2048         sayilamaz

gecmise donuk acilma (kurgu 6 sube, sube basina 8760 oturum/yil):
duzen                   sirri belirleyen   acilan oturum
asimetrik zarfla tasima gonderen taraf            52.560
gecici anahtar degisimi iki taraf birden               0

degisimin dogruladigi kalem:
kalem                            dogrulaniyor
ortak sirrin gizliligi                   evet
iki tarafin ayni sirri uretmesi          evet
karsi tarafin kimligi                   hayir
3 kalemden 2'si dogrulaniyor; dogrulanmayan kalem araya giren bir tarafin
iki ayri degisim yurutmesine kapiyi acik birakir (model, 2 ayri ortak sir).
```

Birinci tablonun son satırı yöntemin özüdür: kanalda geçen dört kalem ile sırra yeten üç
kalemin **kesişimi sıfırdır**. Dinleyici dört kalemi de kaydeder ve hiçbiri onu üçüncü kümeye
taşımaz. "Dinleyici sırra ulaşamaz" ifadesinin sayısal karşılığı budur.

İkinci tablo bu ayrımın neye bağlı olduğunu gösterir. Kanalda geçen kalemlerden gizli üsse
dönmek imkânsız değildir — yalnızca pahalıdır ve pahalılık parametre boyuyla belirlenir. Bu
dersteki 16 bitlik asal için aday üs sayısı 65.536'dır ve bu, sıradan bir makinede sayılabilir
bir kümedir. Öğretim parametresi olarak seçilmesinin nedeni budur; koşan örnek küçük olduğu
için hızlıdır, güvenli olduğu için değil. Gerçek kurulumlarda kullanılan boy 2048 bit ve
üzeridir; oradaki aday sayısı 2^2048'dir.

Aynı yöntem, üs alma yerine eliptik eğri üzerinde tanımlanmış bir işlemle de kurulur ve
mantığı değişmez: her taraf bir gizli değer seçer, karşılığını gönderir, karşıdan geleni kendi
gizli değeriyle işler. Değişen tek şey aynı güvenlik için gereken parametre boyudur. Önceki
dersteki tabloya göre 3072 bitlik bir asalın eşdeğeri 256 bitlik bir eğri parametresidir; yani
her turda taşınan genel değer 384 bayt yerine 32 bayta iner.

Kurgu ölçüm ağında bu fark doğrudan trafiğe yazılır. Günde 297.600 tur, tur başına 384 bayt
genel değer taşırsa günlük yük yaklaşık 109 MiB'dir; 32 baytlık genel değerle aynı yük 9,1
MiB'ye iner. On iki kat fark, kısıtlı uçlarda değişimin yapılabilir olup olmamasını belirler.

#### İki Sonuç, İki Ayrı Sayı

Üçüncü tablo önceki dersin ikinci sorununu kapatır. Asimetrik zarfla anahtar taşındığında
oturum anahtarını gönderen taraf belirler ve zarf, uzun ömürlü özel anahtarla açılır. Kayıtlı
trafiği elinde tutan bir taraf o özel anahtara yıllar sonra ulaşırsa, kurgu ağdaki 52.560
oturumun tamamını açar; oturumların ne zaman yapıldığının hiçbir önemi yoktur.

Bu satırın altında yatan varsayım, şifreli trafiğin kaydedilebilmesidir. Kaydetmenin maliyeti
düşüktür ve çözmenin maliyeti sonraya bırakılabilir; kurgu ağda bir yılın bütün oturumları
birkaç yüz gigabaytlık bir arşive sığar. Bu yüzden "anahtar sızmadı" durumu bugünün sorusuyla
değil, arşivin ömrüyle ölçülür.

Geçici anahtar değişiminde sayı sıfırdır. Her oturum için yeni gizli üsler seçilir, ortak sır
o oturumla sınırlıdır ve oturum bittiğinde üsler silinir. Uzun ömürlü anahtarın sonradan
sızması geçmişe dönük hiçbir oturumu açmaz, çünkü geçmiş oturumların sırrı hiçbir yerde
saklanmamıştır. Bu özellik **ileri gizlilik (forward secrecy)** adını taşır ve bedeli her oturum
için bir çift üs üretmek ile fazladan bir tur alışveriştir.

#### Zincirin Yedi Kalemi

Bu mekanizmanın kaç kalemi aynı anda doğru olmalı sorusunun yanıtı yedidir ve altısı
mekanizmanın kendi içindedir.

Birincisi ve ikincisi parametrelerdir: `p` gerçekten asal ve yeterince büyük olmalı, `g` o
asalın uygun bir üreteci olmalıdır. Parametreler gizli değildir ve genellikle taraflarca
paylaşılan sabitlerdir; bu, onların denetlenmesini kolaylaştırır ama kusurlu bir parametre
kümesini de her oturuma taşır. Kötü seçilmiş bir asal, aday üs sayısını tablodaki 2^2048
değerinden çok daha küçük bir sayıya indirir ve bu, koşum sırasında hiçbir belirti üretmez —
değişim yine çalışır, yine aynı sırrı verir.

Üçüncü ve dördüncü kalemler iki gizli üstür. Beşinci kalem üslerin her oturumda yenilenmesidir;
yenilenmediklerinde ileri gizlilik tablosundaki sıfır, oturum sayısına döner. Altıncı kalem
türetme adımıdır: ham ortak sır anahtar olarak kullanılırsa dağılım bozuk kalır ve zincirin
geri kalanı bu bozuk anahtarın üzerine kurulur.

Yedinci kalem mekanizmanın dışındadır ve bir sonraki bölümün konusudur. Altı kalemin altısı
doğru olsa bile, karşı tarafın kim olduğu bu yöntemin içinde hiçbir biçimde belirlenmez.

Bedeli de sayılabilir. Değişim, bağlantı kurulumuna en az bir ek tur ekler ve iki tarafta da
üs alma hesabı gerektirir. Kurgu ölçüm ağında 12.400 uç saatte bir oturum açarsa bu, günde
297.600 ek tur ve aynı sayıda üs alma işlemi demektir. Karşılığında elde edilen şey, üçüncü
tablodaki 52.560 oturumun geçmişe dönük kapanmasıdır.

#### Doğrulanmayan Kalem

Dördüncü tablo bu dersin sınırıdır. Değişim üç kalemden ikisini doğruluyor: ortak sır gizli
kalıyor ve iki taraf aynı sırrı üretiyor. Üçüncü kalem — karşı tarafın kimliği — doğrulanmıyor.

Sonucu sayıyla yazmak mümkündür. Değişimin iki ucu arasına giren bir taraf, iki ayrı değişim
yürütebilir: bir tarafla bir ortak sır, öteki tarafla başka bir ortak sır. İki uç da doğru
çalıştığını görür, çünkü ikisi de kendi tarafında geçerli bir sır üretmiştir. Doğrulanan kalem
sayısı iki, açık kalan kalem sayısı bir ve ortaya çıkan ortak sır sayısı ikidir. Bu bir
yapılandırma kusuru değildir; değişim yönteminin kapsamına kimlik girmez.

Parametre üzerinde anlaşmanın kendisi de aynı boşluğun içindedir. `p` ve `g` kanaldan açıkça
geçtiği için, iki tarafın hangi parametrelerde anlaştığı da doğrulanmamış bir kalemdir; araya
giren bir taraf, iki ucun da desteklediği en küçük parametre kümesini seçtirebilir ve tablodaki
2^2048 değeri sessizce 2^32'ye iner. Değişim yine tamamlanır, iki taraf yine aynı sırrı üretir
ve hiçbir belirti oluşmaz. Bu yüzden kurulumlarda kabul edilen en küçük parametre boyu bir
politika kalemi olarak ayrıca yazılır — anlaşmaya bırakılmaz.

Yöntemin adı da bu sınırı taşır: anahtar **değişimi**, kimlik doğrulaması değil. Kurgu ölçüm
ağında bir şube ile merkez arasındaki değişim, karşı tarafın gerçekten merkez olduğunu
söylemez — yalnızca kiminle konuşuluyorsa onunla bir sır paylaşıldığını söyler.

#### Özet

- İki taraf gizli üssünü hiç göndermeden aynı ortak sırra ulaşır: koşan örnekte iki taraf da
  41173 değerine indi ve bu değer kanaldan hiç geçmedi.
- Kanalda geçen 4 kalem ile sırra yeten 3 kalemin kesişimi sıfırdır; dinleyici kaydettiği
  kalemlerden ortak sırra geçemez.
- Güvenlik parametre boyuna bağlıdır: 16 bitlik asalda aday üs sayısı 65.536'dır ve sayılabilir;
  öğretim örneği küçük olduğu için hızlıdır, güvenli olduğu için değil.
- Ham ortak sır doğrudan anahtar olarak kullanılmaz; anahtar türetmeyle sabit boyda ve düzgün
  dağılmış bir anahtara çevrilir.
- Geçici değişimde uzun ömürlü anahtarın sızması geçmişe dönük 0 oturum açar; asimetrik zarfla
  taşımada aynı sızıntı kurgu ağdaki 52.560 oturumun tamamını açar.
- Değişim üç kalemden ikisini doğrular; karşı tarafın kimliği doğrulanmaz ve doğrulanmayan bir
  değişimde iki ayrı ortak sır oluşabilir.

#### Sonraki Adım

Doğrulanmayan kalem bir adım daha geriye götürür. Karşı tarafın kimliğini değişimin kendisi
veremiyorsa, dışarıdan bir kanıt gerekir ve o kanıt beşinci derste bir kez görülmüştü: özel
anahtarla yapılan işlem, açık anahtarla geri alınıyor ve geri alınabilmesi kaynağı gösteriyordu.
Sonraki ders bu yönü kendi biçimiyle ele alıyor — imza üretilip doğrulanıyor, imzalanan verinin
tek bir biti çevrildiğinde doğrulamanın düştüğü sayılıyor ve imzanın kanıtladığı kalemler ile
kanıtlamadığı kalemler ayrı ayrı yazılıyor. Bütünlük ile inkâr edilemezliğin farkı da orada
sayıya bağlanıyor. Konu bu dersle kapanmıyor; asıl boşluk yedinci dersin sonunda ortaya çıkacak.

### Dijital İmzalar

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/dijital-imzalar

İmzanın kanıtladığı ve kanıtlamadığı kalemin ayrılması: 440 bitlik yığının her biti ve 512 bitlik imzanın her biti tek tek çevrildiğinde doğrulamanın 952 denemenin hiçbirinde ayakta kalmaması, altı kalemden ikisinin kanıtlanıp dördünün kanıtlanmaması, anahtarlı karmanın göndereni 2 adaya imzanın 1 adaya indirmesi ve imzalama anahtarı sızdığında 2.190 geçmiş imzanın tartışmalı hâle gelmesi.

Önceki ders doğrulanmayan bir kalemle kapandı: anahtar değişimi ortak sırrı üretiyor ama karşı
tarafın kim olduğunu söylemiyordu. Kanıt dışarıdan gelmek zorundaydı ve beşinci derste o kanıtın
yönü bir kez görülmüştü — özel anahtarla yapılan bir işlem açık anahtarla geri alınıyor ve geri
alınabilmesi kaynağı gösteriyordu.

Bu ders o yönü kendi biçimiyle ele alır. **Dijital imza (digital signature)**, özel anahtarla
üretilen ve açık anahtarla doğrulanan bir değerdir; doğrulama için gizli hiçbir kalem gerekmez.
Ölçülecek şey imzanın çalışıp çalışmadığı değil, tam olarak neyi kanıtladığı ve neyi
kanıtlamadığıdır.

#### İmza ve Tek Bitlik Değişiklik

**KT20:** imza, özel anahtarı elinde tutan tarafça üretilir ve açık anahtarla herkes tarafından
doğrulanır; doğrulama için gizli hiçbir kalem gerekmez.

**KT21:** imza, imzalanan bayt dizisinin tamamına bağlıdır; tek bir bitin değişmesi doğrulamayı
düşürür.

```js
// imza/uret.mjs — imza uretilip dogrulanir, sonra imzalanan verinin her biti tek tek
// cevrilip dogrulamanin kac kez ayakta kaldigi sayilir. Kurgu bolgesel olcum aginda bir
// gunluk okuma yigini imzalanir. Anahtar malzemesi yazdirilmaz.
import { generateKeyPairSync, sign, verify } from "node:crypto";

// KT20: imza, ozel anahtari elinde tutan tarafca uretilir ve acik anahtarla herkes
//       tarafindan dogrulanir; dogrulama icin gizli hicbir kalem gerekmez.
// KT21: imza, imzalanan bayt dizisinin tamamina baglidir; tek bir bitin degismesi
//       dogrulamayi dusurur.

const { publicKey: ACIK, privateKey: OZEL } = generateKeyPairSync("ed25519");
const YIGIN = Buffer.from("SUBE-03|2026-03-01|okuma=4180|toplam=8813304|kayit=1240");
const imza = sign(null, YIGIN, OZEL);

console.log("imzalanan yigin :", YIGIN.length, "bayt,", YIGIN.length * 8, "bit");
console.log("imza boyu       :", imza.length, "bayt");
console.log("degismemis yigin:", verify(null, YIGIN, ACIK, imza) ? "gecerli" : "gecersiz");

let ayakta = 0;
for (let i = 0; i < YIGIN.length * 8; i++) {
  const b = Buffer.from(YIGIN); b[i >> 3] ^= 1 << (i & 7);
  if (verify(null, b, ACIK, imza)) ayakta++;
}
console.log(`yigin biti cevrildi: ${YIGIN.length * 8} deneme, dogrulama ayakta kalan: ${ayakta}`);

let imzaAyakta = 0;
for (let i = 0; i < imza.length * 8; i++) {
  const s = Buffer.from(imza); s[i >> 3] ^= 1 << (i & 7);
  if (verify(null, YIGIN, ACIK, s)) imzaAyakta++;
}
console.log(`imza biti cevrildi : ${imza.length * 8} deneme, dogrulama ayakta kalan: ${imzaAyakta}`);

const { publicKey: BASKA } = generateKeyPairSync("ed25519");
console.log("baska acik anahtarla dogrulama:",
  verify(null, YIGIN, BASKA, imza) ? "gecerli" : "gecersiz");
```

```
imzalanan yigin : 55 bayt, 440 bit
imza boyu       : 64 bayt
degismemis yigin: gecerli
yigin biti cevrildi: 440 deneme, dogrulama ayakta kalan: 0
imza biti cevrildi : 512 deneme, dogrulama ayakta kalan: 0
baska acik anahtarla dogrulama: gecersiz
```

Dokuz yüz elli iki denemenin hiçbirinde doğrulama ayakta kalmadı. Yığının 440 bitinin herhangi
biri ya da imzanın 512 bitinin herhangi biri çevrildiğinde sonuç aynıdır: geçersiz. Bu, ikinci
derste ölçülen çığ etkisinin imza tarafındaki karşılığıdır — imza, veriyi bir bütün olarak
bağlar ve hiçbir bölümü ayrı ele alınmaz.

Son satır ayrı bir kalemdir. İmza, üretildiği özel anahtarın **eşi** olan açık anahtarla
doğrulanır; başka bir açık anahtarla doğrulama geçersiz döner. Doğrulayan tarafın elinde doğru
açık anahtarın bulunması, bu zincirin ayrı bir kalemidir ve bu dersin sonunda açıkta kalacak
kalem tam olarak budur.

İmza boyu da bir karardır. Buradaki 64 bayt, beşinci dersteki 256 baytlık çıktıyla
karşılaştırıldığında dörtte birdir; kurgu ağda günde 12.400 imza üretiliyorsa fark günde 2,3
MiB'lik bir yüktür. İmzanın boyu güvenliğini değil, taşınma maliyetini belirler.

#### İmza Özet Üzerinden Üretilir

Yığın 55 bayttı, ama imzalanan şey doğrudan o 55 bayt değildir. İmza şemaları veriyi önce bir
karma fonksiyonundan geçirir ve asimetrik işlemi **özet** üzerinde yapar. Nedeni beşinci derste
ölçülen boyut sınırıdır: asimetrik işlem sabit ve küçük bir girdi alır, oysa imzalanacak veri
herhangi bir uzunlukta olabilir. Sabit uzunluklu özet bu iki gereksinimi bağlar.

Bunun doğrudan sonucu, imzanın güvenliğinin karma fonksiyonunun **çakışma direncine** bağlı
olmasıdır. İkinci dersteki tabloda "şubeler arası imzalanan özet" satırının çakışma sütununda
yer almasının nedeni budur. Aynı özeti veren iki farklı yığın bulunabilirse, birine üretilen
imza ötekine de uyar; imzalayan taraf bir yığını imzalarken, hiç görmediği başka bir yığını da
imzalamış olur.

Sayı buradan çıkar. Çakışma direnci düştüğünde tartışmalı hâle gelen imza sayısı, imzalama
anahtarının sızmasındaki sayıyla aynıdır — kurgu ağda 2.190. Ama neden farklıdır: birinde
anahtar başkasının eline geçmiştir, ötekinde anahtara hiç dokunulmamıştır ve zincirin başka
bir halkası kırılmıştır. Zincirin kalemleri bu yüzden ayrı ayrı sayılır; imzanın güvenliği en
zayıf halkasının güvenliğidir.

Buradan çıkan ikinci kural anahtar ayrımıdır. Aynı anahtar çiftinin hem şifreleme hem imza için
kullanılması kalem sayısını yarıya indirir ama iki kırılmayı tek köke bağlar: imza anahtarının
sızması, o çiftle şifrelenmiş bütün trafiği de açar. Kurgu ağda ayrı çiftler kullanmak katılımcı
başına iki anahtar kalemi demektir — 7 katılımcıda 14 kalem — ve bunun karşılığı, bir kırılmanın
öteki kullanımı düşürmemesidir.

#### İmzanın Kanıtladığı ve Kanıtlamadığı

**KT22:** imza, imzalayan tarafın özel anahtarı elinde tuttuğunu kanıtlar; o anahtarın kime ait
olduğunu, ne zaman kullanıldığını ve o an çalınıp çalınmadığını kanıtlamaz.

```js
// imza/kalem.mjs — imzanin kanitladigi ve kanitlamadigi kalemler, butunluk ile inkar
// edilemezligin ayrimi ve imzalama anahtari sizarsa dusen kalem (model). Kurgu bolgesel
// olcum agi sayilari kullanilir.

// KT22: imza, imzalayan tarafin ozel anahtari elinde tuttugunu kanitlar; o anahtarin
//       kime ait oldugunu, ne zaman kullanildigini ve o an calinip calinmadigini
//       kanitlamaz.

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 KALEM = [
  ["veri imzalandiktan sonra degismedi", "evet"],
  ["imzayi ureten taraf ozel anahtari tutuyordu", "evet"],
  ["o ozel anahtar kime ait", "hayir"],
  ["imza ne zaman uretildi", "hayir"],
  ["imzalayan icerigi gormus ve kabul etmis miydi", "hayir"],
  ["anahtar o anda calinmis miydi", "hayir"],
];
const A = [-46, 13];
yaz(A, "kalem", "kanitlaniyor");
for (const [ad, k] of KALEM) yaz(A, ad, k);
const olan = KALEM.filter(([, k]) => k === "evet").length;
console.log(`${KALEM.length} kalemden kanitlanan ${olan}, kanitlanmayan ${KALEM.length - olan}`);

const KATILIMCI = 7;                                 // kurgu: merkez + 6 sube
console.log(`\nayni yigin iki yolla imzalansa (${KATILIMCI} katilimci):`);
const B = [-22, 12, 12, 16];
yaz(B, "yol", "dogrulayan", "gonderen", "ucuncu tarafa");
yaz(B, "", "taraf", "adayi", "kanit");
yaz(B, "anahtarli karma", 2, 2, "hayir");
yaz(B, "dijital imza", KATILIMCI, 1, "evet");

const SUBE = 6, GUN = 365;
console.log(`\nimzalama anahtari sizarsa (${SUBE} sube, gunde 1 yigin):`);
const C = [-26, 14, 14];
yaz(C, "kalem", "bir subede", "tum aginda");
yaz(C, "tartismali gecmis imza", GUN, SUBE * GUN);
yaz(C, "yeni anahtar cifti", 1, SUBE);
yaz(C, "dagitilacak acik anahtar", 1, SUBE);
yaz(C, "yeniden imzalanacak yigin", GUN, SUBE * GUN);
```

```
kalem                                          kanitlaniyor
veri imzalandiktan sonra degismedi                     evet
imzayi ureten taraf ozel anahtari tutuyordu            evet
o ozel anahtar kime ait                               hayir
imza ne zaman uretildi                                hayir
imzalayan icerigi gormus ve kabul etmis miydi         hayir
anahtar o anda calinmis miydi                         hayir
6 kalemden kanitlanan 2, kanitlanmayan 4

ayni yigin iki yolla imzalansa (7 katilimci):
yol                     dogrulayan    gonderen   ucuncu tarafa
                             taraf       adayi           kanit
anahtarli karma                  2           2           hayir
dijital imza                     7           1            evet

imzalama anahtari sizarsa (6 sube, gunde 1 yigin):
kalem                         bir subede    tum aginda
tartismali gecmis imza               365          2190
yeni anahtar cifti                     1             6
dagitilacak acik anahtar               1             6
yeniden imzalanacak yigin            365          2190
```

Altı kalemden ikisi kanıtlanıyor, dördü kanıtlanmıyor. Bu oran imzanın zayıflığı değil,
kapsamının tanımıdır; kanıtlanmayan dört kalemin her biri ayrı bir mekanizma ister. Zaman için
bağımsız bir zaman damgası, anahtarın çalınıp çalınmadığı için bir iptal düzeni, anahtarın
sahibi için bir kimlik belgesi gerekir — üçü de bu konunun dışındadır ve üçü de kendi güven
kökünü getirir.

İmzanın ürettiği ikinci kalem — imzayı üretenin özel anahtarı elinde tutması — bir kimlik
değildir. Anahtarın **kime** ait olduğu imzanın içinde yazmaz. Ne zaman imzalandığı da yazmaz;
imzaya bir zaman damgası eklenebilir ama o damgayı da imzalayan taraf koyar ve dolayısıyla
damga, imzalayanın iddiasıdır. Anahtarın imzalama anında çalınmış olup olmadığı ise imzaya
hiçbir biçimde yansımaz: çalınmış bir anahtarla üretilen imza, geçerli bir imzadır.

#### Bütünlük ve İnkâr Edilemezlik

İkinci tablo bu dersin kavramsal ayrımını sayıya bağlar. Dördüncü derste ölçülen anahtarlı
karma da bütünlük sağlıyordu — gövde değişirse etiket tutmuyordu. Fark, bütünlüğün ötesindedir.

**Bütünlük (integrity)** verinin değişmediğini gösterir ve iki mekanizma da bunu yapar.
**İnkâr edilemezlik (non-repudiation)** ise imzalayanın "bunu ben üretmedim" diyememesidir ve
bunun için gönderen adayının **bire** inmesi gerekir.

Anahtarlı karmada anahtarı iki taraf bilir; doğrulayabilen taraf sayısı ikidir ve gönderen
adayı da ikidir. Alıcı, aynı etiketi kendisi de üretebildiği için üçüncü bir tarafa hiçbir şey
kanıtlayamaz. Dijital imzada gizli kalem tek tarafta durur: doğrulayabilen taraf sayısı yedidir
— açık anahtarı olan herkes — ve gönderen adayı birdir. Üçüncü tarafa kanıt sunulabilir.

"Sunulabilir" sözcüğü koşulludur ve koşulu birinci tablodadır. İnkâr edilemezlik, ancak özel
anahtarın gerçekten yalnız o tarafta bulunduğu kabul edilirse geçerlidir. Anahtar bir dosyada
duruyorsa ve o dosyaya birkaç kişi erişebiliyorsa, matematiksel olarak kusursuz bir imza da
"ben yapmadım" savunmasını çürütmez. Bu yüzden inkâr edilemezlik kriptografik değil, kriptografi
ile desteklenen **işletimsel** bir özelliktir.

#### Zincirin Altı Kalemi

Bir imzanın doğrulanmasından bir sonuç çıkarabilmek için aynı anda doğru olması gereken kalem
sayısı altıdır ve beşi teknik, biri işletimseldir.

Birincisi imzalayanın özel anahtarının gizli kalmasıdır. İkincisi, imzanın üzerinde üretildiği
karma fonksiyonunun çakışma direncidir. Üçüncüsü doğrulayanın doğru açık anahtarı elinde
tutmasıdır. Dördüncüsü şema parametrelerinin doğru seçilmiş olmasıdır.

Beşinci kalem en sessiz olanıdır: imzalanan bayt dizisi ile doğrulanan bayt dizisinin **birebir
aynı** olması. İmza bir anlam üzerine değil, bir bayt dizisi üzerine üretilir. Kurgu ağda
şube, günlük yığını bir metin satırına çevirip imzalar; merkez o satırı ayrıştırıp kendi
biçiminde yeniden yazar ve sonra doğrulamaya kalkarsa doğrulama düşer — veri değişmemiş olsa
bile. Ters durumu daha ağırdır: doğrulama, gelen ham baytlar üzerinde yapılıp iş mantığı
**yeniden ayrıştırılmış** bir kopya üzerinde yürütülürse, imzalanan şey ile üzerinde işlem
yapılan şey ayrışır. Bu yüzden imza doğrulanan bayt dizisi ile kullanılan veri aynı kaynaktan
gelmelidir.

Altıncı kalem şema seçimine bağlıdır. Bazı imza şemaları her imza için taze bir rastgele değer
ister ve o değerin tekrarlanması özel anahtarı açığa çıkarır; bu, dördüncü dersteki nonce
koşulunun imza tarafındaki karşılığıdır. Bu dersteki şema imzayı belirlenimci biçimde üretir ve
kalemi ortadan kaldırır. Altı kalemden biri, şema seçimiyle beşe indirilebilir — kalem sayısını
azaltmanın en ucuz yolu, kalemi yönetmek yerine gereksiz kılmaktır.

#### Kök Kırılırsa

Üçüncü tablo kursun üçüncü sütununu bu mekanizma için doldurur. İmzalama anahtarı sızarsa kaç
kalem düşer? Doğrudan düşen kalem, o anahtarla imzalanmış bütün geçmiş yığınlardır: bir şubede
365, kurgu ağın tamamında 2.190 imza tartışmalı hâle gelir. "Tartışmalı", geçersiz demek
değildir — imzalar hâlâ doğrulanır, ama artık gönderen adayı bir değildir ve inkâr edilemezlik
niteliği geriye dönük olarak düşer.

Yenileme bedeli iki ayrı kalemde sayılır. Yeni anahtar çifti üretmek ve açık anahtarı dağıtmak
altı kalemdir — ucuzdur, çünkü dağıtılan kalem gizli değildir. Geçmişi kurtarmak ise 2.190
kalemdir: her yığının yeni anahtarla yeniden imzalanması. İkinci sayı çoğu kurulumda ödenmez ve
geçmiş, tartışmalı bırakılır.

Tartışmalı geçmişi daraltmanın bir yolu, imzanın ne zaman üretildiğini imzalayandan bağımsız
bir tarafa yazdırmaktır. O durumda sızıntı tarihinden önceki imzalar tartışma dışında kalır ve
2.190 kalemin yalnız bir bölümü düşer. Bedeli, her imza için bir dış tarafa yapılan ek çağrı ve
o tarafın kendisinin yeni bir güven kökü hâline gelmesidir. Kalem sayısı azalmaz, yer değiştirir.

Bu, önceki derslerdeki yenileme bedelleriyle karşılaştırıldığında farklı bir biçimdedir. Simetrik
anahtar sızdığında yenileme **gizli** kalem taşımayı gerektiriyordu; imza anahtarında taşınan
kalem açıktır. Buna karşılık simetrik anahtarın yenilenmesi geçmişi tartışmalı hâle getirmez,
imza anahtarınınki getirir.

#### Özet

- İmza özel anahtarla üretilir, açık anahtarla doğrulanır ve doğrulama gizli hiçbir kalem
  gerektirmez.
- İmza, imzalanan verinin tamamına bağlıdır: 440 bitlik yığının ve 512 bitlik imzanın bitleri
  tek tek çevrildiğinde 952 denemenin hiçbirinde doğrulama ayakta kalmaz.
- İmza altı kalemden ikisini kanıtlar; anahtarın kime ait olduğu, ne zaman kullanıldığı,
  içeriğin görülüp kabul edildiği ve anahtarın o an çalınmış olup olmadığı kanıtlanmaz.
- Bütünlüğü iki mekanizma da sağlar; inkâr edilemezlik gönderen adayının bire inmesini ister —
  anahtarlı karmada aday 2, dijital imzada 1'dir.
- İnkâr edilemezlik koşulludur: özel anahtarın gerçekten tek tarafta durduğu kabulüne dayanır ve
  bu kabul işletimsel bir kalemdir.
- İmzalama anahtarı sızarsa 2.190 geçmiş imza tartışmalı olur; yenileme 6 açık kalem dağıtımı,
  geçmişi kurtarmak ise 2.190 yeniden imzalama kalemidir.

#### Sonraki Adım

Bu konu yedi derste bir zincir kurdu. Geri dönüşün kaç kaleme bağlı olduğu sayıldı, çakışma
direnci ölçüldü, deneme maliyeti eğrisi çıkarıldı, anahtar dağıtımının aritmetiği yazıldı,
roller ayrıldı, ortak sır güvensiz kanalda üretildi ve imza bütünlüğü kanıtladı. Zincirin her
halkası kendi kökünü adlandırdı.

Kökler sırayla şunlardı: kodlamanın kökü yoktu; şifrelemenin kökü anahtarın gizli kalmasıydı;
karmanın kökü çakışmanın bulunamamasıydı; parola saklamanın kökü parolanın aday listesinde
olmamasıydı; simetrik düzenin kökü paylaşılan anahtarın yalnız iki tarafta bulunmasıydı;
asimetrik düzenin kökü özel anahtarın tek tarafta durmasıydı; anahtar değişiminin kökü gizli
üslerin gönderilmemesiydi; imzanın kökü ise imzalama anahtarının sahibinde kalmasıydı. Sekiz
kökün hiçbiri algoritmanın kendisi değildir — her biri bir kalemin nerede durduğuyla ilgilidir.

Ama son çıktı bloğunda bir satır açık kaldı: imza, başka bir açık anahtarla doğrulandığında
geçersiz döndü — yani doğrulama, doğru açık anahtarın elde bulunmasına dayanıyor. O açık anahtar
doğrulayan tarafa açık kanaldan geldi. Beşinci derste sorulan soru burada da yanıtsızdır:
imzayı doğrulayan açık anahtarın **kime ait olduğunu** hiçbir şey kanıtlamıyor. Yanlış bir açık
anahtarı doğru sanan bir doğrulayıcı, o anahtarın eşiyle üretilmiş her imzayı geçerli sayar ve
bunu yaparken hiçbir hata görmez. Sonraki konu **Açık Anahtar Altyapısı**, bu tek kalemi bir
zincire bağlar: bir açık anahtarın bir kimliğe ait olduğunu söyleyen belge, o belgeyi imzalayan
taraf ve zincirin en tepesinde duran kök.

## Açık Anahtar Altyapısı

Bir açık anahtarın kime ait olduğunun neye dayandığı ve o dayanağın nerede kırıldığı: sertifika alanlarının kanıtladığı iddia ile her alanın kapattığı yol, güven zinciri grafiğinde tek kökün taşıdığı kalem sayısı ve kök kırıldığında düşenin yenilenme bedeli, iptal listesi ile çevrimiçi durum sorgulamanın öğrenme penceresi ve başarısız sorgunun açtığı yol, el sıkışmanın hangi adımının hangi iddiayı kanıtladığı, yenileme penceresi ile süresi dolmuş kalemin düşürdüğü bağlantı, uçtan uca şifrelemede içeriği kimin okuyabildiği.

### Sertifikalar

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/sertifikalar

Sertifika alanları kanıtladıkları iddia cinsinden ölçülür: dokuz alanın her biri hangi iddiayı bağlıyor, tek bir uç kalemin kullanılabilmesi için sekiz kalemin aynı anda tutması gerekiyor ve beş denetim on üç kullanım denemesinin sekizini kapatırken beş meşru denemenin hiçbirini durdurmuyor.

Bir önceki ders imzayı ölçtü ve tek bir soruyu açık bıraktı: imza bütünlüğü kanıtlıyor, hatta
imzalayanın o özel anahtarı elinde tuttuğunu da kanıtlıyor, ama doğrulamada kullanılan açık
anahtarın **kime ait olduğunu** hiçbir şey kanıtlamıyor. Doğrulayan taraf elindeki anahtarın
gerçekten karşı tarafa ait olduğunu bir yerden bilmek zorunda.

Sertifika bu boşluğu bir belgeyle doldurur: bir açık anahtarı bir ada bağlayan ve bu bağı üçüncü
bir tarafın imzasıyla onaylayan bir kayıt. Bu ders sertifikayı "alanlar listesi" olarak değil,
**iddialar listesi** olarak ele alır ve üç şey sayar: her alan hangi iddiayı bağlıyor, tek bir
kalemin kullanılabilmesi için kaç şeyin aynı anda doğru olması gerekiyor, alanlar denetlendiğinde
kaç kullanım yolu kapanıyor.

- **PK1.** Bu konunun sayım birimi **kalem**dir: güven kökünden kullanıma kadar zincirde ayrı ayrı
  doğru olması gereken bir bileşen, yapılandırma ya da süreç.
- **PK2.** Sertifika alanları veri yapısı olarak modellenir; **imza gerçekten üretilir ve
  doğrulanır**. Kurgu bölgesel ölçüm ağı üzerinde çalışılır; gerçek alan adı, gerçek sertifika ve
  gerçek otorite adı yazılmaz.
- **PK3.** Değerlendirme anı sabittir ve kurgudur. Saatin doğru olduğu varsayılır; saatin kendisi
  ayrı bir kalem olarak sayılır.
- **PK4.** Kullanım denemesi bir üçlüdür: sunulan kalem, sunulduğu ad, yapılacak iş. Meşru deneme,
  bu üçlünün kalemin alanlarıyla uyuştuğu denemedir.
- **PK5.** Veren kaleminin kendi vereni bu derste tek adım sayılır; zincirin tamamı ve kök sonraki
  derste kurulur.

#### Alan Değil, İddia

Bir sertifikaya alan listesi olarak bakmak yanıltıcıdır, çünkü alanların hepsi aynı işi yapmaz.
Her alan bir iddiayı taşır ve o alan **denetlenmediğinde** iddia kanıtsız kalır — alanın kayıtta
bulunması yetmez.

```js
// alan.mjs — kurgu sertifika alanlari ve her alanin bagladigi iddia. MODELDIR.
// Bolgesel olcum agi KURGUDUR: ad, seri ve tarihler uydurmadir; gercek sertifika yoktur.
export const ALAN = [
  // alan, bagladigi iddia, alan yoksa ya da denetlenmezse kanitsiz kalan
  ["ozne", "anahtar bu adin sahibine ait", "anahtar herhangi bir ada baglanir"],
  ["alternatif ad", "kalem bu uc adlari icin gecerli", "baska ad icin sunulur"],
  ["veren", "alanlari kim onayladi", "zincir kurulamaz"],
  ["seri", "kalem tekil olarak anilabilir", "iptal kaydi hedef gosteremez"],
  ["gecerlilik", "iddia belirli bir araligi kapsar", "iddia sure sinirsiz olur"],
  ["acik anahtar", "dogrulanacak anahtar budur", "imza kimin diye sorulamaz"],
  ["kullanim", "anahtar yalnizca bu isler icin", "her is icin kullanilir"],
  ["temel kisit", "kalem sertifika imzalayabilir mi", "her uc kalem otorite olur"],
  ["imza", "alanlar veren tarafindan onaylandi", "alanlar degistirilebilir"],
];

export const SIMDI = Date.parse("2026-06-01T00:00:00Z");   // kurgu degerlendirme ani

export const KAYIT = [
  ["c1", "olcum-toplayici", ["olcum-toplayici", "toplayici-yedek"], "sunucu-ara",
    "2026-01-10", "2027-01-10", ["sunucu-kimligi"], false],
  ["c2", "sayac-ucu-0042", ["sayac-ucu-0042"], "aygit-ara",
    "2026-03-02", "2027-03-02", ["istemci-kimligi"], false],
  ["c3", "sube-aktarim", ["sube-aktarim"], "imza-ara",
    "2026-02-14", "2027-02-14", ["dijital-imza"], false],
  ["c4", "olcum-toplayici", ["olcum-toplayici"], "sunucu-ara",
    "2024-05-01", "2025-05-01", ["sunucu-kimligi"], false],
  ["c5", "sunucu-ara", ["sunucu-ara"], "kurum-koku",
    "2025-01-01", "2030-01-01", ["sertifika-imzalama"], true],
  ["c7", "coklu-ara", ["coklu-ara"], "kurum-koku",
    "2025-06-01", "2029-06-01", ["sertifika-imzalama", "sunucu-kimligi"], true],
].map(([id, ozne, altAd, veren, bas, bit, kullanim, otoriteMi], i) =>
  ({ id, ozne, altAd, veren, seri: 5100 + i, gecerliBas: Date.parse(bas + "T00:00:00Z"),
     gecerliBit: Date.parse(bit + "T00:00:00Z"), kullanim, otoriteMi }));

// Kullanim denemesi: hangi kalem, hangi ad icin, hangi is icin sunuluyor.
export const DENEME = [
  ["c1", "olcum-toplayici", "sunucu-kimligi", "mesru"],
  ["c1", "toplayici-yedek", "sunucu-kimligi", "mesru"],
  ["c2", "sayac-ucu-0042", "istemci-kimligi", "mesru"],
  ["c3", "sube-aktarim", "dijital-imza", "mesru"],
  ["c5", "sunucu-ara", "sertifika-imzalama", "mesru"],
  ["c6", "olcum-toplayici", "sunucu-kimligi", "alan degistirilmis"],
  ["c4", "olcum-toplayici", "sunucu-kimligi", "suresi dolmus"],
  ["c4", "toplayici-yedek", "sunucu-kimligi", "suresi dolmus, ad yok"],
  ["c1", "fatura-servisi", "sunucu-kimligi", "baska ad"],
  ["c3", "sube-aktarim", "sunucu-kimligi", "imza kalemi sunucu yerine"],
  ["c2", "sayac-ucu-0042", "sunucu-kimligi", "aygit kalemi sunucu yerine"],
  ["c5", "sunucu-ara", "sunucu-kimligi", "otorite kalemi uc yerine"],
  ["c7", "coklu-ara", "sunucu-kimligi", "kullanimi genis otorite kalemi"],
];

export const gun = (ms) => new Date(ms).toISOString().slice(0, 10);
export const yaz = (g) => (h) =>
  h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join("");
export const sol = (g) => (h) => h.map((v, i) => String(v).padEnd(g[i])).join("").trimEnd();
```

```js
// iddia.mjs — alan basina bagladigi iddia ve alan denetlenmezse acilan durum
import { ALAN, KAYIT, DENEME, gun, sol } from "./alan.mjs";

const y = sol([14, 38, 40]);
console.log(`${KAYIT.length} kurgu kalem, ${DENEME.length} kullanim denemesi, ` +
  `${ALAN.length} alan`);
console.log("\n" + y(["alan", "bagladigi iddia", "denetlenmezse"]));
for (const [ad, iddia, acik] of ALAN) console.log(y([ad, iddia, acik]));

const k = KAYIT[0];
console.log(`\nornek kalem ${k.id}: ozne ${k.ozne}, veren ${k.veren}, seri ${k.seri}`);
console.log(`  alternatif ad ${k.altAd.join(", ")} | kullanim ${k.kullanim.join(", ")} | ` +
  `otorite ${k.otoriteMi}`);
console.log(`  gecerlilik ${gun(k.gecerliBas)} -> ${gun(k.gecerliBit)}, ` +
  `pencere ${Math.round((k.gecerliBit - k.gecerliBas) / 86400000)} gun`);
```

```
6 kurgu kalem, 13 kullanim denemesi, 9 alan

alan          bagladigi iddia                       denetlenmezse
ozne          anahtar bu adin sahibine ait          anahtar herhangi bir ada baglanir
alternatif ad kalem bu uc adlari icin gecerli       baska ad icin sunulur
veren         alanlari kim onayladi                 zincir kurulamaz
seri          kalem tekil olarak anilabilir         iptal kaydi hedef gosteremez
gecerlilik    iddia belirli bir araligi kapsar      iddia sure sinirsiz olur
acik anahtar  dogrulanacak anahtar budur            imza kimin diye sorulamaz
kullanim      anahtar yalnizca bu isler icin        her is icin kullanilir
temel kisit   kalem sertifika imzalayabilir mi      her uc kalem otorite olur
imza          alanlar veren tarafindan onaylandi    alanlar degistirilebilir

ornek kalem c1: ozne olcum-toplayici, veren sunucu-ara, seri 5100
  alternatif ad olcum-toplayici, toplayici-yedek | kullanim sunucu-kimligi | otorite false
  gecerlilik 2026-01-10 -> 2027-01-10, pencere 365 gun
```

Tablonun üçüncü sütunu dersin asıl konusudur. Alan orada durur, okunabilir, biçimi geçerlidir;
denetlenmediğinde ise sertifikanın taşıdığı iddia kayıtta bulunmaya devam eder ama **arkasında
kanıt kalmaz**. Geçerlilik penceresi denetlenmeyen bir kalem süresiz bir iddiaya dönüşür; kullanım
amacı denetlenmeyen bir anahtar her işe koşulur.

İki alan ötekilerden ayrılır. **Alternatif ad**, öznenin kendisinden daha bağlayıcıdır: doğrulama
sunulan adı bu listede arar, öznede değil. **Temel kısıt** ise tek bir doğru-yanlış değeriyle bir
kalemin başka sertifika imzalayıp imzalayamayacağını söyler; bu alan denetlenmediğinde her uç
kalem sahibi kendi sertifikalarını üretebilir hâle gelir.

#### Kaç Kalem Aynı Anda Tutmalı

Bu kursun ölçüsü zincirin uzunluğudur. Tek bir uç kalemin bir bağlantıda kabul edilmesi için kaç
ayrı şeyin aynı anda doğru olduğunu saymak, sertifikayı bir dosya olmaktan çıkarıp bir **koşullar
kümesi** hâline getirir.

```js
// denetim.mjs — gercek imza uretimi, tutmasi gereken kalem sayisi ve kapanan yol
import { generateKeyPairSync, sign, verify } from "node:crypto";
import { KAYIT, DENEME, SIMDI, yaz, sol } from "./alan.mjs";

// Her veren icin bir anahtar cifti uretilir; imza gercektir, alanlar kurgudur.
const ANAHTAR = {};
for (const v of new Set(KAYIT.map((k) => k.veren))) ANAHTAR[v] = generateKeyPairSync("ed25519");
const govde = (k) => Buffer.from(JSON.stringify([k.ozne, k.altAd, k.veren, k.seri,
  k.gecerliBas, k.gecerliBit, k.kullanim, k.otoriteMi]));
const KALEM = Object.fromEntries(KAYIT.map((k) =>
  [k.id, { ...k, imza: sign(null, govde(k), ANAHTAR[k.veren].privateKey) }]));
// c6: c1'in alani genisletilmis, imzasi oldugu gibi kopyalanmis kalemi.
KALEM.c6 = { ...KALEM.c1, id: "c6", altAd: [...KALEM.c1.altAd, "fatura-servisi"] };

const DENETIM = [
  ["imza", (k) => verify(null, govde(k), ANAHTAR[k.veren].publicKey, k.imza)],
  ["gecerlilik", (k) => SIMDI >= k.gecerliBas && SIMDI <= k.gecerliBit],
  ["ad", (k, ad) => k.altAd.includes(ad)],
  ["kullanim", (k, ad, is) => k.kullanim.includes(is)],
  ["temel kisit", (k, ad, is) => k.otoriteMi === (is === "sertifika-imzalama")],
];

// c1 kaleminin kullanilabilmesi icin ayni anda dogru olmasi gereken kalemler.
const c1 = KALEM.c1;
const ZINCIR = [
  ["veren acik anahtari elde", () => ANAHTAR["sunucu-ara"].publicKey !== undefined],
  ["alanlar degismemis", () => verify(null, govde(c1), ANAHTAR["sunucu-ara"].publicKey, c1.imza)],
  ["saat penceresi icinde", () => SIMDI >= c1.gecerliBas && SIMDI <= c1.gecerliBit],
  ["sunulan ad listede", () => c1.altAd.includes("olcum-toplayici")],
  ["kullanim amaci esliyor", () => c1.kullanim.includes("sunucu-kimligi")],
  ["temel kisit uc kalemi diyor", () => c1.otoriteMi === false],
  ["veren otorite yetkisi tasiyor", () => KALEM.c5.otoriteMi === true],
  ["ozel anahtar gizli kalmis", () => true],
];
console.log(`c1 icin ayni anda dogru olmasi gereken kalem: ${ZINCIR.length}`);
console.log(`hepsi dogruyken sonuc: ${ZINCIR.every(([, f]) => f()) ? "gecer" : "duser"}   ` +
  `imza dogrulamasi node:crypto ile kosturuldu`);

// Tek tek bozma: hangi denetim yakaliyor, yakalanmazsa hangi yol aciliyor.
const BOZ = [
  ["alan degistirildi", "c6", "olcum-toplayici", "sunucu-kimligi", "ad listesi serbest yazilir"],
  ["saat penceresi disi", "c4", "olcum-toplayici", "sunucu-kimligi", "kalem sonsuza gecerli"],
  ["baska ad icin sunuldu", "c1", "fatura-servisi", "sunucu-kimligi", "her ad icin sunulur"],
  ["imza kalemi sunucu yerine", "c3", "sube-aktarim", "sunucu-kimligi", "tek anahtar her ise"],
  ["otorite kalemi uc yerine", "c7", "coklu-ara", "sunucu-kimligi", "uc kalem sertifika imzalar"],
];
const y1 = sol([28, 16, 30]);
console.log("\n" + y1(["bozulan kalem", "yakalayan", "yakalanmazsa acilan yol"]));
for (const [ad, id, hedef, is, acik] of BOZ) {
  const takilan = DENETIM.filter(([, d]) => !d(KALEM[id], hedef, is)).map(([n]) => n);
  console.log(y1([ad, takilan.join(", ") || "yok", acik]));
}

// Denetimler sirayla eklendiginde gecen deneme sayisi.
const gecen = (n, sec = () => true) => DENEME.filter(([id, ad, is, not]) => sec(not) &&
  DENETIM.slice(0, n).every(([, d]) => d(KALEM[id], ad, is))).length;
const MESRU = DENEME.filter(([, , , n]) => n === "mesru").length;
const y2 = yaz([26, 8, 10, 14]);
console.log(`\n${DENEME.length} kullanim denemesi, ${MESRU} tanesi mesru`);
console.log(y2(["eklenen denetim", "gecen", "kapanan", "mesru gecen"]));
let onceki = DENEME.length;
console.log(y2(["denetim yok", onceki, 0, MESRU]));
DENETIM.forEach(([ad], i) => {
  const g = gecen(i + 1);
  console.log(y2([`+ ${ad}`, g, onceki - g, gecen(i + 1, (n) => n === "mesru")]));
  onceki = g;
});
console.log(`kalan yol ${onceki - MESRU}; durdurulan mesru is ${MESRU - gecen(DENETIM.length,
  (n) => n === "mesru")}`);
```

```
c1 icin ayni anda dogru olmasi gereken kalem: 8
hepsi dogruyken sonuc: gecer   imza dogrulamasi node:crypto ile kosturuldu

bozulan kalem               yakalayan       yakalanmazsa acilan yol
alan degistirildi           imza            ad listesi serbest yazilir
saat penceresi disi         gecerlilik      kalem sonsuza gecerli
baska ad icin sunuldu       ad              her ad icin sunulur
imza kalemi sunucu yerine   kullanim        tek anahtar her ise
otorite kalemi uc yerine    temel kisit     uc kalem sertifika imzalar

13 kullanim denemesi, 5 tanesi mesru
eklenen denetim              gecen   kapanan   mesru gecen
denetim yok                     13         0             5
+ imza                          12         1             5
+ gecerlilik                    10         2             5
+ ad                             9         1             5
+ kullanim                       6         3             5
+ temel kisit                    5         1             5
kalan yol 0; durdurulan mesru is 0
```

Tek bir uç kalemin tek bir bağlantıda kabul edilmesi **sekiz kalemin aynı anda tutmasına** bağlı.
Bunların beşi sertifika alanlarından okunur — dördü uç kalemin kendi alanlarından, biri verenin
kaleminden; kalan üçü sertifikanın tümüyle dışındadır. Veren tarafın açık anahtarının
doğrulayanın elinde olması bir kalemdir ve bu ders onu hazır varsayar. Saatin doğru olması ayrı
bir kalemdir: penceresi geçmiş bir kalemi kabul ettirmenin en kestirme yolu sertifikaya dokunmak
değil, doğrulayanın saatini geriye almaktır. Sekizincisi hiçbir denetimle ölçülemez — özne kendi
özel anahtarını gizli tutmuş olmalıdır ve doğrulayan tarafın bunu sınayacak hiçbir aracı yoktur.

Bozma tablosu her alanın **ayrı bir yolu** kapattığını gösteriyor. Beş bozmanın her biri tam olarak
bir denetime takılıyor; hiçbiri iki denetim tarafından birden yakalanmıyor. En dikkat çeken satır
sonuncusudur: `coklu-ara` kalemi kullanım listesinde sunucu kimliğini taşır, adı doğrudur, imzası
geçerlidir, süresi dolmamıştır — onu durduran tek şey temel kısıt alanının otorite kalemlerini uç
kalem olarak kullanmayı yasaklamasıdır.

#### Kısıtın Kapattığı Yol

Son tablo denetimleri tek tek ekleyip her adımda geçen deneme sayısını veriyor. Hiçbir denetim
yokken on üç denemenin on üçü de geçer; sertifika sunmak yeterlidir. Beş denetim eklendiğinde geçen
sayı beşe iner ve bu beş, tam olarak meşru denemelerin kendisidir.

Kapanan yol dağılımı eşit değil. En çok yolu kullanım amacı denetimi kapatıyor (üç): imza kalemi,
aygıt kalemi ve otorite kalemi sunucu kimliği yerine sunulduğunda hepsi burada durur. Geçerlilik
penceresi iki, imza bir, ad bir, temel kısıt bir kapatıyor. Sıralamanın kendisi de sonucu
değiştirir — denetimler farklı bir sırayla eklenseydi tek tek kapattıkları sayı değişirdi, toplam
değişmezdi. Bu yüzden "hangi denetim ne kadar değerli" sorusunun yanıtı sıradan bağımsız değildir;
değeri sabit olan tek şey **o denetim kaldırıldığında yeniden açılan yol** sayısıdır.

Geçerlilik penceresinin işlevi de tabloda göründüğünden geniştir. Pencere yalnız kalemin ne kadar
süre kullanılacağını söylemez; **yanlış olduğu hiç fark edilmeyen bir iddianın kendiliğinden
düşeceği anı** da söyler. Kurgu `c1` kalemi üç yüz altmış beş günlük bir pencere taşıyor. Özel
anahtarı bugün dışarı çıksa ve bunu kimse görmese bile o kalem pencerenin sonunda geçmeyi bırakır;
pencere sonsuz olsaydı böyle bir son da olmazdı. Daraltmak bu süreyi kısaltır ve karşılığında
yenileme işini çoğaltır — bu iki sayı arasındaki denge beşinci dersin konusudur.

Son satır savunmanın bedelini yazar: durdurulan meşru iş sıfırdır. Beş denetimin hiçbiri meşru bir
kullanımı engellemiyor, çünkü hepsi kalemin kendi alanlarında yazılı olanı sınıyor. Bu, sertifika
denetimlerini bu kursta ölçülen öteki savunmalardan ayıran bir özelliktir: bedeli çalışma anında
değil, **yapılandırma anında** ödenir. Alanların doğru doldurulması, kullanım amaçlarının önceden
düşünülmesi ve adların eksiksiz yazılması işi kalemi üreten tarafa yıkar. Bu bedelin gerçek boyutu
yenileme sıklığıyla birlikte ölçülür ve o ölçüm bu konunun beşinci dersinde yapılır.

Bir şeyi ise bu denetimlerin hiçbiri sınamıyor. On üç denemenin tamamında veren tarafın açık
anahtarı doğrulayanın elinde hazır kabul edildi; `c1` kaleminin imzası `sunucu-ara` anahtarıyla
doğrulandı, çünkü o anahtar zaten oradaydı. Bu, birinci kalemin ta kendisidir ve bu derste
varsayım olarak duruyor.

#### Özet

- Sertifikanın dokuz alanı dokuz ayrı iddia bağlar; alanın kayıtta bulunması yetmez, **denetlenmesi**
  gerekir. Denetlenmeyen alan iddiayı kanıtsız bırakır ve kayıtta hiçbir iz kalmaz.
- Sunulan adı belirleyen alan öznenin kendisi değil alternatif ad listesidir; temel kısıt tek bir
  doğru-yanlış değeriyle bir kalemin sertifika imzalayıp imzalayamayacağını söyler.
- Tek bir uç kalemin tek bir bağlantıda kabul edilmesi 8 kalemin aynı anda tutmasına bağlıdır;
  bunların 5'i sertifika alanlarından okunur, 3'ü sertifikanın dışındadır. Saatin doğruluğu ve
  özel anahtarın gizli kalması sertifikaya bakarak sınanamaz.
- Beş bozmanın her biri tam olarak bir denetime takılıyor: her alan ayrı bir yol kapatıyor, hiçbiri
  bir ötekinin yedeği değil.
- Denetimsiz 13 denemenin 13'ü geçiyor; beş denetim 8 yol kapatıp geçen sayıyı 5'e indiriyor ve
  durdurulan meşru iş 0. Kapanan yol dağılımı sıraya bağlıdır; sıradan bağımsız olan tek ölçü bir
  denetim kaldırıldığında yeniden açılan yol sayısıdır.

#### Sonraki Adım

Bu dersin bütün ölçümü tek bir kalemin üzerinde duruyordu: doğrulayan tarafın, verenin açık
anahtarını zaten elinde tuttuğu. O anahtar oraya nasıl geldi ve arkasında kim var. Bir uç kalem
bir ara otorite tarafından, ara otorite bir kök tarafından imzalanır ve zincirin ucundaki kök
kendi kendini imzalar — yani hiçbir şey onu doğrulamaz, doğrudan güvenilir. Sonraki ders bu grafiği
kurup tek soruyu sayıya bağlar: kurgu ölçüm ağında kaç ara otorite var, her birinin altında kaç uç
kalem duruyor, tek kök kaç kalemi birden taşıyor ve o kök kırıldığında kaç kalem düşüp yenilenmesi
kaç elle dokunuş tutuyor.

### Sertifika Otoriteleri ve Güven Zinciri

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/sertifika-otoriteleri-ve-guven-zinciri

Tek kökün taşıdığı yük sayıyla ölçülür: dört ara otorite altında 4.397 uç kalem ve 4.400 güven deposu kopyası tek köke bağlı, ara otorite kırılması 10 ile 4.101 kalem arasında değişirken kök kırılması 8.802 kalem düşürüyor ve 95 iş günü elle dokunuş istiyor; yedek kök kesintiyi sıfırlıyor ama dokunuş sayısını değiştirmiyor.

Önceki ders sertifikayı bir iddialar kümesi olarak ölçtü ve bir kalemi varsayım olarak bıraktı:
doğrulayan taraf, verenin açık anahtarını zaten elinde tutuyordu. O anahtar oraya kendiliğinden
gelmedi. Bir uç kalem bir ara otorite tarafından, ara otorite bir kök tarafından imzalanır; kökü
imzalayan ise kimse yoktur — kök kendi kendini imzalar ve **doğrulanmadığı için değil, doğrudan
kabul edildiği için** geçerlidir. Güven kökü tam olarak burasıdır: zincirin ilk halkası kanıtla
değil, kararla yerleştirilir.

Bu ders o kararın taşıdığı yükü sayar. Kurgu bölgesel ölçüm ağının sertifika envanteri bir grafik
olarak kurulur ve üç şey ölçülür: tek kök kaç kalemi birden taşıyor, ara otorite eklemek her
doğrulamaya kaç kalem ekliyor, bir otorite kırıldığında kaç kalem düşüp yenilenmesi kaç dokunuş
tutuyor.

- **PK6.** Bir otoritenin **kırılması**, özel anahtarının denetim dışına çıkması ya da otoritenin
  yetkisiz bir kalemi imzalamış olmasıdır. İkisinin de sonucu aynıdır: o otoritenin imzası artık
  kanıt taşımaz.
- **PK7.** Güven deposu, kök kaleminin yazılı olduğu yerdir. Bir makinede bir kopya bulunur ve
  kopya sayısı makine sayısına eşittir.
- **PK8.** Bir makine sınıfı ya uzaktan ulaşılır ya da elle. Uzaktan ulaşılan sınıfta yenileme
  dağıtım kanalından geçer; elle ulaşılan sınıfta makine başına bir dokunuş gerekir ve dokunuş
  dakikası kurgu model değeridir.
- **PK9.** Kesik uç, kırılmadan yenilemenin bitişine kadar doğrulanamayan uç kalemdir; o kalemin
  taşıdığı bağlantı bu süre boyunca kurulamaz.
- **PK10.** Yedek kök, ikinci bir kök kaleminin bütün depolara **önceden** yazılmış ve ara
  otoritelerin bu ikinci kökle de imzalanmış olması demektir. Adetler, sınıflar ve dakikalar
  kurgudur.

#### Kökün Taşıdığı Kalem

Grafik iki türden düğüm taşır: otoriteler ve makineler. Otorite, başka sertifika imzalayabilen bir
kalemdir; makine ise bir uç kalem taşıyan ve güven deposunda kökün bir kopyasını bulunduran
düğümdür.

```js
// zincir.mjs — kurgu guven zinciri grafigi ve makine envanteri. MODELDIR.
// Bolgesel olcum agi KURGUDUR: otorite adlari tur adidir, adetler ve dakikalar uydurmadir.
export const OTORITE = [
  // id, veren, tur, ozel anahtarin durdugu yer (kurgu)
  ["kurum-koku", null, "kok", "cevrimdisi kasa"],
  ["aygit-ara", "kurum-koku", "ara", "donanim guvenlik birimi"],
  ["sunucu-ara", "kurum-koku", "ara", "donanim guvenlik birimi"],
  ["personel-ara", "kurum-koku", "ara", "dizin sunucusu diski"],
  ["imza-ara", "kurum-koku", "ara", "donanim guvenlik birimi"],
].map(([id, veren, tur, yer]) => ({ id, veren, tur, yer }));

export const MAKINE = [
  // sinif, adet, tasidigi uc kalemin vereni, kok deposu var mi, uzaktan ulasilir mi, elle dk
  ["sayac ucu", 4100, "aygit-ara", true, false, 11],
  ["ic servis", 26, "sunucu-ara", true, true, 2],
  ["personel is istasyonu", 262, "personel-ara", true, true, 1],
  ["sube ag gecidi", 9, "imza-ara", true, true, 4],
  ["is ortagi dogrulayicisi", 3, null, true, false, 90],
].map(([sinif, adet, veren, depo, uzaktan, dk]) => ({ sinif, adet, veren, depo, uzaktan, dk }));

export const ara = () => OTORITE.filter((o) => o.tur === "ara");
export const altUc = (id) =>
  MAKINE.filter((m) => m.veren === id).reduce((t, m) => t + m.adet, 0);
export const UC = ara().reduce((t, o) => t + altUc(o.id), 0);
export const DEPO = MAKINE.filter((m) => m.depo).reduce((t, m) => t + m.adet, 0);

// Bir dogrulamada ayni anda dogru olmasi gereken kalem sayisi.
// sertifika basina gecerlilik + bag basina imza + otorite basina temel kisit
// + uc kalem icin ad ve kullanim + anahtar basina gizlilik + depo kaydi + saat
export const kalemSayisi = (zincir) => zincir + (zincir - 1) + (zincir - 1) + 2 + zincir + 1 + 1;

export const yaz = (g) => (h) =>
  h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join("");
```

```js
// kirilma.mjs — grafigin tasidigi kalem, kirilan otoritenin dusurdugu kalem ve yenileme bedeli
import { OTORITE, MAKINE, ara, altUc, UC, DEPO, kalemSayisi, yaz } from "./zincir.mjs";

const y1 = yaz([16, 10, 14, 26, 8]);
console.log(`grafik: 1 kok, ${ara().length} ara otorite, ${UC} uc kalem, ` +
  `${DEPO} guven deposu kopyasi, ${MAKINE.reduce((t, m) => t + m.adet, 0)} makine`);
console.log("\n" + y1(["otorite", "uc kalem", "makine sinif", "ozel anahtar", "zincir"]));
for (const o of OTORITE) {
  const alt = o.tur === "kok" ? UC : altUc(o.id);
  const sinif = MAKINE.filter((m) => m.veren === o.id).length;
  console.log(y1([o.id, alt, o.tur === "kok" ? MAKINE.length : sinif, o.yer,
    o.tur === "kok" ? 1 : 2]));
}
console.log(`\nbir uc kalem dogrulanirken ayni anda dogru olmasi gereken kalem:`);
for (const z of [2, 3]) console.log(`  ${z} sertifikalik zincir (${z === 2 ? "kok dogrudan imzalar"
  : "kok -> ara -> uc"}): ${kalemSayisi(z)} kalem`);
console.log(`  ara otorite eklemenin dogrulama basina bedeli: ` +
  `${kalemSayisi(3) - kalemSayisi(2)} kalem`);

// Kirilma: hangi otorite kirilirsa kac kalem duser, kac makineye dokunulur, kac dakika.
const dokunulan = (siniflar) => siniflar.reduce((t, m) => t + m.adet, 0);
const dakika = (siniflar) =>
  siniflar.filter((m) => !m.uzaktan).reduce((t, m) => t + m.adet * m.dk, 0);
const KOK_DEPO = MAKINE.filter((m) => m.depo);

const SENARYO = [];
for (const o of ara()) {
  const s = MAKINE.filter((m) => m.veren === o.id);
  SENARYO.push([`${o.id} kirildi`, 1 + altUc(o.id), altUc(o.id), s, altUc(o.id)]);
}
SENARYO.push(["kurum-koku kirildi", 1 + ara().length + UC + DEPO, UC, KOK_DEPO, UC]);
SENARYO.push(["kurum-koku kirildi, yedek kok var", 1 + DEPO, 0, KOK_DEPO, 0]);

const y2 = yaz([34, 10, 11, 11, 10, 11]);
console.log("\n" + y2(["senaryo", "dusen", "yenilenen", "dokunulan", "elle dk", "kesik uc"]));
for (const [ad, dusen, yenilenen, siniflar, kesik] of SENARYO)
  console.log(y2([ad, dusen, yenilenen, dokunulan(siniflar), dakika(siniflar), kesik]));

// Elle ulasilan ve uzaktan ulasilan depo kopyalari.
const elle = KOK_DEPO.filter((m) => !m.uzaktan);
const uzak = KOK_DEPO.filter((m) => m.uzaktan);
console.log(`\nkok deposu ${DEPO} kopya: uzaktan ${dokunulan(uzak)}, elle ${dokunulan(elle)}`);
for (const m of elle)
  console.log(`  ${m.sinif.padEnd(24)}${String(m.adet).padStart(6)} kopya, ` +
    `${String(m.adet * m.dk).padStart(6)} dk`);
console.log(`elle dokunus toplami ${dakika(KOK_DEPO)} dk = ` +
  `${Math.round(dakika(KOK_DEPO) / 60)} saat = ${Math.round(dakika(KOK_DEPO) / 480)} is gunu`);
console.log(`kirilan kok cikarilana kadar onu kabul etmeye devam eden makine: ` +
  `${dokunulan(elle)}`);
```

```
grafik: 1 kok, 4 ara otorite, 4397 uc kalem, 4400 guven deposu kopyasi, 4400 makine

otorite           uc kalem  makine sinif              ozel anahtar  zincir
kurum-koku            4397             5           cevrimdisi kasa       1
aygit-ara             4100             1   donanim guvenlik birimi       2
sunucu-ara              26             1   donanim guvenlik birimi       2
personel-ara           262             1      dizin sunucusu diski       2
imza-ara                 9             1   donanim guvenlik birimi       2

bir uc kalem dogrulanirken ayni anda dogru olmasi gereken kalem:
  2 sertifikalik zincir (kok dogrudan imzalar): 10 kalem
  3 sertifikalik zincir (kok -> ara -> uc): 14 kalem
  ara otorite eklemenin dogrulama basina bedeli: 4 kalem

senaryo                                dusen  yenilenen  dokunulan   elle dk   kesik uc
aygit-ara kirildi                       4101       4100       4100     45100       4100
sunucu-ara kirildi                        27         26         26         0         26
personel-ara kirildi                     263        262        262         0        262
imza-ara kirildi                          10          9          9         0          9
kurum-koku kirildi                      8802       4397       4400     45370       4397
kurum-koku kirildi, yedek kok var       4401          0       4400     45370          0

kok deposu 4400 kopya: uzaktan 297, elle 4103
  sayac ucu                 4100 kopya,  45100 dk
  is ortagi dogrulayicisi      3 kopya,    270 dk
elle dokunus toplami 45370 dk = 756 saat = 95 is gunu
kirilan kok cikarilana kadar onu kabul etmeye devam eden makine: 4103
```

İlk tablo kökün yükünü tek satırda veriyor: dört ara otoritenin altında 4.397 uç kalem duruyor ve
hepsi tek bir kalemin imzasına bağlı. Kökün kendisi hiçbir uç kalemi doğrudan imzalamaz; buna
rağmen dört bin üç yüz doksan yedisinin de üzerindedir, çünkü zincirin ucundadır.

Yükün yarısından fazlası ise sertifika bile değil. **4.400 güven deposu kopyası** aynı kök
kaleminin makinelere yazılmış kopyasıdır ve grafikte imzayla değil, **dağıtımla** bağlanır. Bu
kopyaların her biri bağımsız bir kalemdir: biri eksikse o makine hiçbir zinciri doğrulayamaz, biri
fazlaysa o makine fazladan bir kökü kabul eder. İş ortağı doğrulayıcıları bunu açıkça gösteriyor —
üç makine hiçbir uç kalem taşımıyor, yalnız kök deposu var, yani ağdaki rolleri sadece doğrulamak.

Özel anahtarın durduğu yer sütunu grafiğin şeklinden okunamayan bir şey söylüyor. Kök anahtarı
çevrimdışı bir kasadadır ve yalnız ara otorite imzalamak için çıkarılır; yılda birkaç kez
kullanılan bir anahtarın çevrimiçi durmasının bir gerekçesi yoktur. Üç ara otoritenin anahtarı
donanım güvenlik biriminde durur — anahtar birimin dışına çıkmaz, imzalama isteği içeri gönderilir.
Dördüncüsü, `personel-ara`, anahtarını bir dizin sunucusunun diskinde tutuyor. Grafikte bu dört
düğüm birbirinin eşidir; kırılma olasılıkları eş değildir ve o farkı taşıyan tek sütun budur.
Diskteki anahtarın altında 262 uç kalem duruyor.

Zincir uzunluğu ölçüsü ikinci tabloyu kuruyor. Kök uç kalemleri doğrudan imzalasaydı bir
doğrulamada aynı anda tutması gereken kalem sayısı on olurdu. Araya bir otorite girdiğinde bu sayı
on dörde çıkıyor: bir sertifikanın geçerlilik penceresi, bir imza bağı, bir temel kısıt denetimi ve
bir özel anahtarın daha gizli kalması. **Ara otorite bedava değildir**; her doğrulamaya dört kalem
ekler ve bu bedel dört bin üç yüz doksan yedi kalemin her doğrulamasında yeniden ödenir.

#### Kırılma: Hangi Kök, Kaç Kalem

Karşılığı ise ikinci tabloda görünüyor. Aynı grafik, kırılan otoriteye göre tamamen farklı sayılar
üretiyor. `imza-ara` kırıldığında düşen kalem sayısı **on**; `aygit-ara` kırıldığında **4.101**.
Aradaki fark dört yüzden fazla kattır ve grafiğin şekliyle değil, alt ağaçların büyüklüğüyle
ilgilidir. Ara otoritelere bölmenin asıl işi budur: kırılmayı bir alt ağaca hapseder.

Elle dokunuş sütunu aynı hikâyeyi anlatmıyor. `sunucu-ara`, `personel-ara` ve `imza-ara`
kırılmalarının elle dokunuş bedeli sıfırdır, çünkü bu üç sınıfın makinelerine uzaktan ulaşılıyor ve
yenileme dağıtım kanalından geçiyor. `aygit-ara` kırılması ise 4.100 saha ziyareti demek: 45.100
dakika. Düşen kalem sayısıyla yenileme bedeli arasında sabit bir oran yoktur; belirleyici olan
kalem sayısı değil, o kalemlerin durduğu makinelere **nasıl ulaşıldığıdır**.

Aygıt tarafında bunun bir nedeni daha var. Sayaç ucunun yeni kalemini alabilmesi için toplayıcıyla
bağlantı kurması gerekir; o bağlantıyı kurmak için sunduğu kalem ise tam da yenilenmesi gereken
kalemdir. Yenileme kanalı, yenilenecek kalemin kendisine dayanıyorsa uzaktan yenileme yapılamaz.
Bu, ölçüm ağında kalem sayısından bağımsız bir sınırdır ve saha ziyaretini bir tercih olmaktan
çıkarır.

Tablonun hiçbir sütununda görünmeyen bir sayı daha var: kırılmanın **ne zaman fark edildiği**.
Model, kırılma anıyla yenilemenin başlangıcını aynı an sayar. Gerçekte bu ikisinin arasında bir
süre vardır ve o süre boyunca kırılan otoritenin imzaladığı her kalem, doğrulamanın on dört
kaleminin on dördünü de geçer — çünkü kırılma, doğrulanan alanların hiçbirinde iz bırakmaz. Bu
dersin sayıları yenilemenin bedelini verir, fark etmenin süresini vermez; ikincisi bu kursta
ölçülmez.

Kök satırı ölçeği değiştiriyor. Kök kırıldığında düşen kalem sayısı **8.802**: bir kök, dört ara
otorite, 4.397 uç kalem ve 4.400 güven deposu kaydı. Bunun 4.400'ü sertifika değil, kayıt; yani
kökü yenilemenin işi yalnız yeniden imzalamak değil, dört bin dört yüz makinedeki yazıyı
değiştirmektir. Elle dokunuş toplamı 45.370 dakika, yani **95 iş günü**. Bu sayının anlamı bir
maliyet değil, bir **süredir**: kök kırıldığında olayın kapanması üç aydan uzun sürer.

#### Yedek Kök Neyi Kurtarır

Son satır tek başına dersin en öğretici kısmıdır. Bütün depolarda ikinci bir kök önceden yazılıysa
ve ara otoriteler bu ikinci kökle de imzalanmışsa, kök kırıldığında düşen kalem 8.802'den 4.401'e
iniyor ve **kesik uç sayısı 4.397'den sıfıra**. Hiçbir bağlantı kopmuyor; ölçüm ağı çalışmaya devam
ediyor, çünkü her uç kalemin köke ikinci bir yolu var.

Değişmeyen iki sütun ise kararı asıl belirleyen sütunlardır. Dokunulan makine sayısı yine 4.400,
elle dokunuş yine 45.370 dakika. Yedek kök yenileme işini ortadan kaldırmaz, çünkü kırılan kökün
depolardan **çıkarılması** gerekir ve bu, her makineye ayrı ayrı dokunmak demektir. Yedek kökün
kurtardığı şey iş değil, **kesintidir**: aynı 95 iş günü, hizmet açıkken geçer.

Süreyi belirleyen şey depo kopyalarının sayısı değil, dağılımıdır. Dört bin dört yüz kopyanın
297'sine uzaktan ulaşılıyor ve bunların dokunuş bedeli toplam dakikaya hiç girmiyor; kalan 4.103'ü
sürenin tamamını üretiyor. Kopya sayısını azaltmak bu tabloyu değiştirmez, çünkü azaltılacak
kopyalar uzaktan ulaşılan taraftadır. Değiştiren tek şey, elle ulaşılan sınıflara bir dağıtım
kanalı açmaktır — ve o kanalın kendisi de bir güven kökü ister.

Son satır bu yüzden aynı zamanda kökün yetmediği yeri gösteriyor. Elle ulaşılan 4.103 makine
kırılan kökü kabul etmeye devam eder ve bu, dokunuş sırası neyse o sırayla, en son makineye kadar
sürer. Kırılan bir kök iptal edilmiş sayılmaz; **çıkarılmadığı her makinede geçerlidir.** Ortalama
bir sayaç ucunun ziyaret sırası ortada bir yerdeyse, o uç için pencere yaklaşık kırk yedi iş günü
sürer. Bu sürede kırılan kökle imzalanmış yeni bir kalem üretilebilir ve o makinede kabul edilir;
grafikte hiçbir şey bunu engellemez.

Bu boşluk yenilemeyle kapanmıyor. Kapatabilecek tek şey, doğrulayanın "bu kalem hâlâ geçerli mi"
sorusunu kalemin kendi alanlarından değil, **başka bir yerden** sorabilmesidir. Bu, sertifika
alanlarının hiçbirinde yazmayan bir bilgidir ve grafiğin dışında durur.

#### Özet

- Kurgu grafikte 1 kök, 4 ara otorite ve 4.397 uç kalem var; kök hiçbir uç kalemi doğrudan
  imzalamadığı hâlde hepsinin üzerindedir. Yükün 4.400 kalemi ise sertifika değil, güven deposu
  kopyasıdır ve grafiğe imzayla değil dağıtımla bağlanır.
- Kök uç kalemleri doğrudan imzalasa bir doğrulamada 10 kalem tutmalıydı; ara otorite bu sayıyı
  14'e çıkarır. Ara otorite kırılmayı bir alt ağaca hapseder ama her doğrulamaya 4 kalem ekler.
- Kırılan otoriteye göre düşen kalem 10 ile 4.101 arasında değişiyor; elle dokunuş ise 0 ile 45.100
  dakika arasında. Belirleyici olan kalem sayısı değil, makinelere nasıl ulaşıldığıdır.
- Kök kırıldığında 8.802 kalem düşüyor, 4.400 makineye dokunuluyor ve elle dokunuş 95 iş günü
  tutuyor. Yenileme kanalı yenilenecek kaleme dayandığı için 4.100 sayaç ucunda uzaktan yenileme
  yapılamıyor.
- Yedek kök düşen kalemi 4.401'e, kesik ucu 0'a indiriyor ama dokunulan makineyi ve süreyi hiç
  değiştirmiyor: kurtardığı şey iş değil kesintidir. Kırılan kök, çıkarılmadığı 4.103 makinede
  geçerli kalmaya devam eder.

#### Sonraki Adım

Kök kırıldığında ortaya çıkan boşluk yenilemenin hızıyla ilgili değil. Bir kalem geçerliliğini
yitirdiğinde bunu doğrulayan tarafın **öğrenmesi** gerekir ve sertifikanın içinde bunu söyleyen bir
alan yoktur; kalem, alanları değişmediği sürece kendini geçerli göstermeye devam eder. Öğrenmenin
iki yolu vardır: iptal edilmiş kalemlerin listesini dağıtmak ya da her kullanımda otoriteye tek tek
sormak. Sonraki ders ikisini aynı ölçüde karşılaştırır — iptal kararı ile istemcinin bunu öğrenmesi
arasında kaç saat geçiyor, o pencerede kaç bağlantı kabul ediliyor ve sorgu yanıtsız kaldığında
verilen karar kaç yol açıyor.

### Sertifika İptali

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/sertifika-iptali

İptal kararı ile doğrulayanın bunu öğrenmesi arasındaki pencere ölçülür: günlük liste yayınında ortalama 29,5 saat ve 271.877 kabul edilen bağlantı, çevrimiçi sorguda 1,5 saat ve 13.925 bağlantı, sunucunun taşıdığı yanıtta 0,5 saat ve 4.621 bağlantı; listenin penceresini iki saate indirmek günlük indirmeyi 152 MB'tan 1.828 MB'a çıkarıyor ve sorgu yanıtsız kaldığında yumuşak başarısızlık 2 yol açarken sert başarısızlık 6.161 meşru bağlantı düşürüyor.

Önceki ders kırılan bir kökün, depolardan çıkarılmadığı her makinede geçerli kalmaya devam
ettiğini gösterdi. Aynı sorun tek bir uç kalem için de geçerlidir: bir sunucunun özel anahtarı
denetim dışına çıktığında ya da bir sayaç ucu sahadan sökülüp alındığında o kalemin geçersiz
sayılması gerekir — ama kalemin alanları değişmez. Geçerlilik penceresi hâlâ açıktır, imza hâlâ
doğrulanır, ad hâlâ eşleşir. Bir önceki dersin on dört kalemi, iptal edilmiş bir kalem için de
eksiksiz tutar.

İptal bu yüzden sertifikanın dışında durur: doğrulayanın **başka bir yerden** öğrenmesi gereken
bir bilgidir. Öğrenmenin iki temel yolu vardır — iptal edilmiş kalemlerin listesini dağıtmak ya da
her kullanımda otoriteye tek tek sormak. Bu ders ikisini aynı ölçüde karşılaştırır: karar ile
öğrenme arasında kaç saat geçiyor, o pencerede kaç bağlantı kabul ediliyor ve öğrenme kanalı
çalışmadığında verilen karar kaç yol açıyor.

- **PK11.** İptal, bir kalemin geçerlilik penceresi dolmadan geçersiz sayılması kararıdır. Karar
  otoritede verilir ve kalemin alanlarına dokunmaz.
- **PK12.** Öğrenme penceresi, iptal kararı ile o kararın belirli bir doğrulayana ulaşması
  arasındaki süredir. İstemcilerin tazeleme anları eşit dağıtılmıştır; bu bir model kararıdır.
- **PK13.** Pencerede kabul edilen bağlantı, pencere süresi ile istemcinin bağlantı hızının
  çarpımıdır. Adetler, hızlar, liste boyutu ve kesinti süresi kurgudur.
- **PK14.** Yumuşak başarısızlık, durum öğrenilemediğinde bağlantının kabul edilmesi; sert
  başarısızlık reddedilmesidir. Üçüncü bir seçenek yoktur.
- **PK15.** Sunucunun taşıdığı yanıt, durum yanıtını sunucunun kendi tazeleyip bağlantı sırasında
  istemciye vermesidir; istemcinin dış bir uca sorması gerekmez.

#### Öğrenmenin Penceresi

Üç yöntemin farkı bir mekanizma farkı değil, bir **gecikme** farkıdır. İptal listesinde karar önce
bir yayına girer, sonra istemci o yayını kendi sırasında indirir; iki gecikme üst üste biner.
Çevrimiçi sorguda yayın gecikmesi yoktur, yalnız istemcinin önbelleği vardır.

```js
// iptal.mjs — iptal karari ile ogrenme arasindaki pencerenin modeli. MODELDIR.
// Kurgu bolgesel olcum agi: adetler, hizlar ve saatler uydurmadir.
export const SINIF = [
  // ad, istemci adedi, istemci basina saatte baglanti
  ["sayac ucu", 4100, 2],
  ["ic servis", 26, 30],
  ["personel is istasyonu", 262, 1],
].map(([ad, adet, hiz]) => ({ ad, adet, hiz }));

export const IPTAL = 30;              // kurgu iptal karari ani, saat
export const KESINTI = 40;            // kurgu sorgulayici kesintisi, dakika
export const KAYIT_BAYT = 28;         // iptal listesinde kalem basina bayt (kurgu)
export const IPTALLI = 1240;          // listede duran iptal edilmis kalem sayisi (kurgu)

export const YONTEM = [
  // ad, yayin araligi (0 = gecikmesiz), istemcinin tazeleme araligi, istemci disa sorar mi
  ["iptal listesi", 24, 24, false],
  ["cevrimici durum sorgusu", 0, 4, true],
  ["sunucunun tasidigi yanit", 0, 2, false],
].map(([ad, yayin, tazeleme, disaSorar]) => ({ ad, yayin, tazeleme, disaSorar }));

// Bir istemcinin ogrenme ani: once karar yayina girer, sonra istemci kendi sirasinda tazeler.
export const pencere = (y, ofset) => {
  const yayinAni = y.yayin ? Math.ceil(IPTAL / y.yayin) * y.yayin : IPTAL;
  const ogrenme = yayinAni + (((ofset - yayinAni) % y.tazeleme) + y.tazeleme) % y.tazeleme;
  return ogrenme - IPTAL;
};

export const ISTEMCI = SINIF.flatMap((s) =>
  Array.from({ length: s.adet }, (_, i) => ({ sinif: s.ad, hiz: s.hiz, ofset: i })));

export const yaz = (g) => (h) =>
  h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join("");
```

```js
// pencere.mjs — ogrenme penceresi, penceredeki baglanti ve basarisizlik kararinin actigi yol
import { SINIF, YONTEM, ISTEMCI, IPTAL, KESINTI, KAYIT_BAYT, IPTALLI, pencere, yaz }
  from "./iptal.mjs";

const TOPLAM = ISTEMCI.length;
const SAATLIK = ISTEMCI.reduce((t, i) => t + i.hiz, 0);
console.log(`${TOPLAM} istemci, saatte ${SAATLIK} baglanti, iptal karari ${IPTAL}. saatte`);
console.log(`liste boyutu: ${IPTALLI} iptalli kalem x ${KAYIT_BAYT} bayt = ` +
  `${IPTALLI * KAYIT_BAYT} bayt`);

const y1 = yaz([26, 10, 10, 10, 14, 12]);
console.log("\n" + y1(["yontem", "en kisa", "en uzun", "ortalama", "kabul edilen", "gunluk dis"]));
for (const y of YONTEM) {
  const p = ISTEMCI.map((i) => pencere(y, i.ofset));
  const kabul = ISTEMCI.reduce((t, i, k) => t + p[k] * i.hiz, 0);
  const ort = p.reduce((a, b) => a + b, 0) / TOPLAM;
  const disSorgu = y.disaSorar ? TOPLAM * (24 / y.tazeleme)
    : y.yayin ? TOPLAM * (24 / y.tazeleme) : 24 / y.tazeleme;
  console.log(y1([y.ad, `${Math.min(...p)} sa`, `${Math.max(...p)} sa`, `${ort.toFixed(1)} sa`,
    kabul, disSorgu]));
}

// Liste yayin araligini daraltmanin pencereye ve indirme hacmine etkisi.
const y4 = yaz([16, 12, 12, 14, 16]);
console.log("\n" + y4(["liste araligi", "en uzun", "ortalama", "kabul edilen", "gunluk MB"]));
for (const d of [24, 12, 6, 2]) {
  const y = { yayin: d, tazeleme: d };
  const p = ISTEMCI.map((i) => pencere(y, i.ofset));
  const mb = (TOPLAM * (24 / d) * IPTALLI * KAYIT_BAYT) / 1e6;
  console.log(y4([`${d} saat`, `${Math.max(...p)} sa`,
    `${(p.reduce((a, b) => a + b, 0) / TOPLAM).toFixed(1)} sa`,
    ISTEMCI.reduce((t, i, k) => t + p[k] * i.hiz, 0), mb.toFixed(0)]));
}

// Ayni pencerenin sinif basina dagilimi (iptal listesi ile cevrimici sorgu).
const y2 = yaz([24, 10, 14, 14, 12]);
console.log("\n" + y2(["sinif", "istemci", "liste kabul", "sorgu kabul", "oran"]));
for (const s of SINIF) {
  const grup = ISTEMCI.filter((i) => i.sinif === s.ad);
  const [liste, sorgu] = [YONTEM[0], YONTEM[1]].map((y) =>
    grup.reduce((t, i) => t + pencere(y, i.ofset) * i.hiz, 0));
  console.log(y2([s.ad, grup.length, liste, sorgu, `${(liste / sorgu).toFixed(1)}x`]));
}

// Sorgulayici ulasilamadiginda verilen karar: yumusak ve sert basarisizlik.
const kesintiBaglanti = Math.round(SAATLIK * (KESINTI / 60));
const KARAR = [
  // ad, istemci disa soruyor mu, kabul mu, acilan yol, duran mesru is
  ["iptal listesi, onbellek gecerli", false, true, 0, 0],
  ["cevrimici sorgu, yumusak basarisizlik", true, true, 2, 0],
  ["cevrimici sorgu, sert basarisizlik", true, false, 0, kesintiBaglanti],
  ["sunucunun tasidigi yanit, sert", false, true, 0, 0],
];
const y3 = yaz([40, 11, 8, 13, 17]);
console.log(`\nsorgulayici kesintisi ${KESINTI} dk -> ${kesintiBaglanti} baglanti etkileniyor`);
console.log(y3(["karar", "dis bagim", "kabul", "acilan yol", "duran mesru is"]));
for (const [ad, dis, kabul, yol, duran] of KARAR)
  console.log(y3([ad, dis ? "var" : "yok", kabul ? "evet" : "hayir", yol, duran]));

const YOL = ["iptal edilmis kalem kabul edilir",
  "sorgulayiciya erisimi kesen taraf iptali gorunmez kilar"];
console.log("\nyumusak basarisizligin actigi yol:");
YOL.forEach((y, i) => console.log(`  ${i + 1}. ${y}`));
console.log(`sert basarisizligin bedeli: ${kesintiBaglanti} mesru baglanti, ` +
  `${KESINTI} dk boyunca`);
```

```
4388 istemci, saatte 9242 baglanti, iptal karari 30. saatte
liste boyutu: 1240 iptalli kalem x 28 bayt = 34720 bayt

yontem                       en kisa   en uzun  ortalama  kabul edilen  gunluk dis
iptal listesi                  18 sa     41 sa   29.5 sa        271877        4388
cevrimici durum sorgusu         0 sa      3 sa    1.5 sa         13925       26328
sunucunun tasidigi yanit        0 sa      1 sa    0.5 sa          4621          12

liste araligi        en uzun    ortalama  kabul edilen       gunluk MB
24 saat                41 sa     29.5 sa        271877             152
12 saat                17 sa     11.5 sa        105941             305
6 saat                  5 sa      2.5 sa         22973             609
2 saat                  1 sa      0.5 sa          4621            1828

sinif                      istemci   liste kabul   sorgu kabul        oran
sayac ucu                     4100        241820         12300       19.7x
ic servis                       26         22350          1230       18.2x
personel is istasyonu          262          7707           395       19.5x

sorgulayici kesintisi 40 dk -> 6161 baglanti etkileniyor
karar                                     dis bagim   kabul   acilan yol   duran mesru is
iptal listesi, onbellek gecerli                 yok    evet            0                0
cevrimici sorgu, yumusak basarisizlik           var    evet            2                0
cevrimici sorgu, sert basarisizlik              var   hayir            0             6161
sunucunun tasidigi yanit, sert                  yok    evet            0                0

yumusak basarisizligin actigi yol:
  1. iptal edilmis kalem kabul edilir
  2. sorgulayiciya erisimi kesen taraf iptali gorunmez kilar
sert basarisizligin bedeli: 6161 mesru baglanti, 40 dk boyunca
```

İlk tablo pencerenin şeklini veriyor. Günlük yayınlanan bir listede iptal kararı en iyi ihtimalle
on sekiz, en kötü ihtimalle **kırk bir saat** sonra öğreniliyor; ortalama yirmi dokuz buçuk saat.
Sayının yirmi dörtten büyük olması ilk bakışta şaşırtıcıdır ve iki gecikmenin toplanmasından
gelir: karar otuzuncu saatte verildiği için o günün yayınını kaçırır, kırk sekizinci saatteki
yayına girer, sonra her istemci kendi tazeleme sırasında indirir.

Çevrimiçi sorguda yayın gecikmesi ortadan kalkıyor ve pencere en fazla üç saate iniyor. Sunucunun
yanıtı kendisi taşıdığında en fazla bir saat. Penceredeki bağlantı sayısı bu üç yöntemi
kıyaslanabilir hâle getiriyor: **271.877**, **13.925**, **4.621**. İlk iki yöntem arasında yirmi
katına yakın fark var ve bu farkın tamamı zamansaldır — sınıf tablosu bunu doğruluyor, üç istemci
sınıfının üçünde de oran on sekiz ile yirmi arasında. Pencere, istemcinin ne yaptığına değil, ne
zaman sorduğuna bağlıdır.

Ortalama sütunu yanıltıcı olabilir. İptal edilmiş bir kalemi sunacak tarafın hangi istemciye
gideceğini seçebildiği bir durumda geçerli olan sayı ortalama değil, **en uzun** penceredir: kırk
bir saat. Ortalama, kaç bağlantının etkilendiğini söyler; en uzun pencere ise tek bir bağlantının
ne kadar süre boyunca mümkün olduğunu söyler. İki sayı iki ayrı soruya bakar ve bir yöntemi
seçerken ikisi de yazılır.

#### Pencereyi Daraltmanın Bedeli

İkinci tablo, liste yönteminin penceresinin bir kader olmadığını gösteriyor. Yayın aralığı yirmi
dört saatten iki saate indirildiğinde ortalama pencere 29,5 saatten 0,5 saate düşüyor ve kabul
edilen bağlantı 271.877'den 4.621'e — yani sunucunun taşıdığı yanıtla **tam olarak aynı** değere.
Liste yöntemi çevrimiçi sorgudan yapısal olarak daha kötü değildir; yalnız varsayılan aralığıyla
öyledir.

Bedeli ise son sütunda. İki saatlik aralık günlük indirmeyi 152 MB'tan **1.828 MB'a** çıkarıyor,
on iki katına. Bunun nedeni listenin **tamamının** her tazelemede yeniden indirilmesidir: dört bin
üç yüz seksen sekiz istemcinin her biri, on iki kez, bin iki yüz kırk kalemlik listenin tamamını
alır — oysa iptal edilen kalem bir tanedir. İptal listesi, aradığı tek kaydı bulmak için her
seferinde bütün defteri taşır.

Listenin boyutu da sabit değil. Bin iki yüz kırk kalem, geçmişte iptal edilmiş her kalemin
geçerlilik penceresi dolana kadar listede kalmasından gelir; iptal sayısı arttıkça liste büyür ve
her tazelemede taşınan bayt onunla birlikte artar. Sıklığı artırmanın maliyeti bu yüzden zamanla
kendiliğinden yükselir — aynı aralık, bir yıl sonra daha pahalıdır.

Dış sorgu sütunu ise ters yönde bir tablo çiziyor. Günlük listede istemci başına bir indirme var,
toplam 4.388. Çevrimiçi sorguda istemci başına altı sorgu, toplam **26.328**; her biri ayrı bir
uca gidiyor ve her biri o ucun ayakta olmasını gerektiriyor. Sunucunun taşıdığı yanıtta ise günlük
dış sorgu **on iki**, çünkü soran taraf istemci değil sunucudur ve bir kez sorup yanıtı bütün
istemcilere dağıtır. En dar pencereyi veren yöntem, en az dış sorgu üreten yöntemdir; iki ölçü
burada aynı yöne bakar.

#### Sorgu Yanıtsız Kaldığında

Son tablo dersin asıl ayrımını kuruyor. Çevrimiçi sorgunun eklediği şey yalnız hız değil, bir
**dış bağımlılıktır**; ve o bağımlılık düştüğünde doğrulayanın elinde iki seçenek kalır.

Yumuşak başarısızlık bağlantıyı kabul eder. Kırk dakikalık kesintide altı bin yüz altmış bir
bağlantı, durumu bilinmeden kurulur ve bu iki yol açar: iptal edilmiş bir kalem kabul edilir ve
sorgulayıcıya erişimi kesebilen taraf iptali görünmez kılar. İkincisi birincisini içerir —
öğrenmenin tek kanalı düşürülebiliyorsa, iptal kararının kendisi düşürülebilir demektir.

Sert başarısızlık hiçbir yol açmaz ve altı bin yüz altmış bir **meşru** bağlantıyı düşürür. Kırk
dakika boyunca ölçüm ağının veri alımı durur. Bu, ölçülebilir bir bedeldir ve yumuşak
başarısızlığın açtığı iki yolun karşılığıdır; ikisinin arasında doğru bir seçim yoktur, yalnız
yazılı bir seçim vardır.

İlk ve dördüncü satırlar bu ikilemin nasıl kurulmadığını gösteriyor. Liste yönteminde istemcinin
elinde geçerli bir önbellek varken dış bağımlılık yoktur; sorgulayıcının ayakta olup olmaması
bağlantıyı etkilemez. Sunucunun taşıdığı yanıtta da yoktur, çünkü soran taraf istemci değildir.
İkilem ortadan kalkmaz — sunucu yanıtı tazeleyemediğinde aynı iki seçenek sunucu tarafında yeniden
kurulur — ama **dört bin üç yüz seksen sekiz istemciden bir sunucuya taşınır**. Yumuşak ya da sert
başarısızlık kararını dört bin kez değil bir kez vermek, kararın kendisini değiştirmez; kararın
verildiği yeri değiştirir ve o yer, izlenebilen tek yerdir.

Bir kalem türü ise bu üç yöntemin hiçbiriyle iptal edilemez. İptal listesini imzalayan, iptal
edilecek kalemin vereni olan otoritedir; kök için bu, kökün kendi iptalini kendi imzasıyla
duyurması demektir. Kırılmış bir kökün imzası kanıt taşımadığına göre, o duyuru da kanıt taşımaz.
Bir önceki dersin 4.400 makinelik dokunuş sayısı tam olarak bu yüzden ödenir: kök iptal
edilemediği için **çıkarılır** ve çıkarma işi bir yayınla değil, makine makine yapılır.

Bütün bu ölçümün altında değişmeyen bir sınır duruyor. İptal, doğrulanan alanlarda iz bırakmayan
tek karardır: iptal edilmiş bir kalem, öğrenme gerçekleşene kadar on dört kalemin on dördünü de
geçer. Pencere daraltılabilir, sıfırlanamaz. Sıfırlamanın tek yolu, kalemin ömrünü öğrenme penceresinden
kısa tutmaktır — o zaman iptal duyurusu tamamlanmadan kalem kendiliğinden düşer. Bu, iptali bir
duyuru sorunu olmaktan çıkarıp bir yenileme sorununa çevirir; o ölçüm bu konunun beşinci dersinde
yapılır.

#### Özet

- İptal kararı sertifikanın alanlarına dokunmaz; iptal edilmiş bir kalem, öğrenme gerçekleşene
  kadar doğrulamanın bütün denetimlerini geçer. Ölçülen şey mekanizma değil, **öğrenme
  gecikmesidir**.
- Günlük yayınlanan listede pencere 18–41 saat (ortalama 29,5) ve penceredeki bağlantı 271.877;
  çevrimiçi sorguda 0–3 saat ve 13.925; sunucunun taşıdığı yanıtta 0–1 saat ve 4.621. Oran üç
  istemci sınıfında da 18–20 kat arasında, çünkü fark tümüyle zamansaldır.
- Yayın aralığını 2 saate indirmek listeyi çevrimiçi sorgunun da altına, 4.621 bağlantıya çekiyor;
  bedeli günlük indirmenin 152 MB'tan 1.828 MB'a çıkmasıdır, çünkü her tazelemede 1.240 kalemlik
  listenin tamamı yeniden iner.
- Dış sorgu sayısı ters sıralanıyor: liste 4.388, çevrimiçi sorgu 26.328, sunucunun taşıdığı yanıt
  12. En dar pencereyi veren yöntem en az dış bağımlılık üretendir.
- Sorgulayıcının 40 dakikalık kesintisinde yumuşak başarısızlık 2 yol açıp 0 meşru işi durduruyor,
  sert başarısızlık 0 yol açıp 6.161 meşru bağlantıyı düşürüyor. Sunucunun yanıtı taşıması bu
  kararı ortadan kaldırmaz, 4.388 istemciden 1 sunucuya taşır.

#### Sonraki Adım

Bu üç dersin ölçtüğü her şey — alan denetimleri, zincirin kalemleri, iptal durumu — tek bir yerde,
bağlantının kurulduğu ilk saniyelerde toplanır. O konuşma el sıkışmadır ve içinde her adımın
kanıtladığı ayrı bir iddia vardır: karşı tarafın sunduğu kalemin geçerli olduğu, o kalemin özel
anahtarını gerçekten elinde tuttuğu, konuşulan adın kaleme yazılı olduğu. Sonraki ders el
sıkışmayı adım adım söker ve tek soruyu sorar: hangi adım hangi iddiayı kanıtlıyor, bir adım
atlandığında hangi iddia kanıtsız kalıyor ve istemcinin de kalem sunması kaç kalem ekliyor.

### TLS El Sıkışması

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/tls-el-sikismasi

El sıkışma kimlik adımları ekseninde sökülür: altı iddianın her biri tek bir adıma bağlı, dört kimlik adımından herhangi biri kapatıldığında beş kurgu sunuştan tam olarak biri daha kabul ediliyor ve hiçbir kimlik adımı yokken beşinin beşi geçiyor; tam doğrulama 11 kalemin aynı anda tutmasını, karşılıklı doğrulama 15'ini istiyor ve filo ölçeğinde 17.552 kalem ekliyor.

Önceki üç ders sertifikanın alanlarını, zincirini ve iptal durumunu ayrı ayrı ölçtü. Bu
denetimlerin hiçbiri kendi başına yapılmaz; hepsi tek bir konuşmanın içinde, bağlantı kurulurken
ve saniyenin altında bir sürede toplanır. O konuşma el sıkışmadır.

El sıkışmaya çoğunlukla "şifreli kanalın kurulduğu yer" denir. Bu tanım eksiktir: şifreli kanal
kimlikten bağımsız olarak kurulabilir ve kurulduğunda ortaya **kiminle konuşulduğu bilinmeyen**
gizli bir kanal çıkar. Bu ders el sıkışmayı şifreleme tarafından değil kimlik tarafından söker ve
üç şey ölçer: hangi adım hangi iddiayı kanıtlıyor, bir adım atlandığında hangi iddia kanıtsız
kalıyor ve kaç sunuş geçiyor, istemcinin de kalem sunması kaç kalem ekliyor. Yapılandırma
kalemleri ve yanıt başlıkları bu dersin dışındadır; onlar Backend Güvenliği ve Bulut Güvenliği
kurslarında ölçüldü.

- **PK16.** El sıkışma dört kimlik adımı olarak modellenir: zincir doğrulaması, ad denetimi, iptal
  denetimi, kalem sahipliği imzası. Kalemler kurgudur; imza üretimi, anahtar değişimi ve özet
  doğrulaması `node:crypto` ile gerçekten koşar.
- **PK17.** Kalem sahipliği imzası, karşı tarafın el sıkışma özetini sertifikadaki açık anahtarın
  eşiyle imzalamasıdır. Sertifika herkese açık olarak sunulur; imzayı üretebilmek özel anahtarı
  gerektirir.
- **PK18.** Geçici anahtarlar her el sıkışmada yeniden üretilir ve ortak sır bu geçici çiftlerden
  türetilir; sertifikanın anahtarı ortak sırra girmez.
- **PK19.** Sunuş denemesi, karşı tarafın bir kalem sunması ve özeti bir anahtarla imzalamasıdır.
  Beş kurgu sunuşun biri meşrudur.
- **PK20.** Bir ayarda kapatılan adım hiç çalıştırılmaz; o adımın kanıtladığı iddia kanıtsız
  sayılır ve o adımın kalemleri sayımdan düşer.

#### Adımlar ve Kanıtladıkları

Her kimlik adımı ayrı bir cümle kurar. Aşağıdaki koşum bu cümleleri adımlara eşliyor ve her adımın
tutmasını gerektirdiği kalemleri sayıyor.

```js
// adim.mjs — el sikismanin kimlik adimlari; kalemler kurgu, imza ve anahtar uretimi gercek.
import { generateKeyPairSync, sign, verify, diffieHellman, createHmac } from "node:crypto";

const ed = () => generateKeyPairSync("ed25519");
export const KOK = ed(), ARA = ed(), YABANCI_ARA = ed();
const SUNUCU = ed(), FATURA = ed(), YABANCI_UC = ed(), IPTALLI = ed(), ISTEMCI = ed();

let sira = 7300;
const kayit = (ozne, altAd, veren, gizli, cift, otoriteMi = false) => {
  const k = { ozne, altAd, veren, seri: sira++, otoriteMi,
    acik: cift.publicKey.export({ type: "spki", format: "der" }).toString("hex") };
  k.imza = sign(null, govde(k), gizli);
  return k;
};
export const govde = (k) => Buffer.from(JSON.stringify([k.ozne, k.altAd, k.veren, k.seri,
  k.otoriteMi, k.acik]));

export const ARA_KALEM = kayit("olcum-ara", ["olcum-ara"], "kurum-koku",
  KOK.privateKey, ARA, true);
const YABANCI_KALEM = kayit("yabanci-ara", ["yabanci-ara"], "yabanci-kok",
  YABANCI_ARA.privateKey, YABANCI_ARA, true);
export const KALEM = {
  dogru: kayit("olcum-toplayici", ["olcum-toplayici"], "olcum-ara", ARA.privateKey, SUNUCU),
  fatura: kayit("fatura-servisi", ["fatura-servisi"], "olcum-ara", ARA.privateKey, FATURA),
  yabanci: kayit("olcum-toplayici", ["olcum-toplayici"], "yabanci-ara",
    YABANCI_ARA.privateKey, YABANCI_UC),
  iptalli: kayit("olcum-toplayici", ["olcum-toplayici"], "olcum-ara", ARA.privateKey, IPTALLI),
  istemci: kayit("saha-terminali-17", ["saha-terminali-17"], "olcum-ara", ARA.privateKey,
    ISTEMCI),
};
export const GIZLI = { dogru: SUNUCU.privateKey, fatura: FATURA.privateKey,
  yabanci: YABANCI_UC.privateKey, iptalli: IPTALLI.privateKey, istemci: ISTEMCI.privateKey };
export const IPTAL_LISTESI = [KALEM.iptalli.seri];
export const ARA_KAYDI = { "olcum-ara": ARA_KALEM, "yabanci-ara": YABANCI_KALEM };

// Bir el sikisma kosumu: gecici anahtarlar uretilir, ortak sir turetilir, ozet imzalanir.
export function elSikis(sunus, hedefAd, ayar) {
  const iGecici = generateKeyPairSync("x25519"), sGecici = generateKeyPairSync("x25519");
  const ozet = Buffer.concat([Buffer.from("istemci-selami|sunucu-selami|"),
    iGecici.publicKey.export({ type: "spki", format: "der" }),
    sGecici.publicKey.export({ type: "spki", format: "der" })]);
  const sunulan = KALEM[sunus.kalem];
  const sahiplikImzasi = sign(null, ozet, GIZLI[sunus.imzalayan]);

  const sonuc = { zincir: true, ad: true, iptal: true, sahiplik: true };
  if (ayar.zincir) {
    const ara = ARA_KAYDI[sunulan.veren];
    sonuc.zincir = Boolean(ara) && verify(null, govde(ara), KOK.publicKey, ara.imza) &&
      ara.otoriteMi && verify(null, govde(sunulan), ARA.publicKey, sunulan.imza);
  }
  if (ayar.ad) sonuc.ad = sunulan.altAd.includes(hedefAd);
  if (ayar.iptal) sonuc.iptal = !IPTAL_LISTESI.includes(sunulan.seri);
  if (ayar.sahiplik) {
    const acik = { key: Buffer.from(sunulan.acik, "hex"), format: "der", type: "spki" };
    sonuc.sahiplik = verify(null, ozet, acik, sahiplikImzasi);
  }
  const kabul = Object.values(sonuc).every(Boolean);
  // Ortak sir yalnizca kabul edilen el sikismada turetilir.
  let esitAnahtar = false, bitis = false;
  if (kabul) {
    const a = diffieHellman({ privateKey: iGecici.privateKey, publicKey: sGecici.publicKey });
    const b = diffieHellman({ privateKey: sGecici.privateKey, publicKey: iGecici.publicKey });
    esitAnahtar = a.equals(b);
    bitis = createHmac("sha256", a).update(ozet).digest()
      .equals(createHmac("sha256", b).update(ozet).digest());
  }
  return { ...sonuc, kabul, esitAnahtar, bitis };
}

export const yaz = (g) => (h) =>
  h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join("");
```

```js
// olcum.mjs — adim basina kanitlanan iddia, atlanan adimin actigi yol, karsilikli dogrulama
import { elSikis, yaz } from "./adim.mjs";

// Hangi adim hangi iddiayi kanitliyor.
export const IDDIA = [
  ["sunulan kalem tanidik bir koke baglaniyor", "zincir"],
  ["kalem konusulan ad icin duzenlenmis", "ad"],
  ["kalem iptal edilmemis", "iptal"],
  ["karsi taraf kalemin ozel anahtarini elinde tutuyor", "sahiplik"],
  ["oturum anahtari iki tarafta ayni ve ucuncu tarafta yok", "anahtar"],
  ["adim ozeti iki tarafta ayni", "bitis"],
];
// Her adimin tutmasini gerektirdigi kalemler.
const KALEMLER = {
  zincir: ["kok deposu kaydi", "ara kalemin gecerliligi", "ara kalemin ozel anahtari"],
  ad: ["kalemin ad listesi", "istemcinin hedef adi"],
  iptal: ["iptal kaynagi guncel", "iptal kaynagina erisim"],
  sahiplik: ["sunucunun ozel anahtari gizli"],
  anahtar: ["gecici anahtarin her el sikismada tekil olmasi"],
  bitis: ["ozetin iki tarafta ayni sirayla uretilmesi"],
};
const SABIT = ["dogrulayanin saati"];
const ISTEMCI_KALEMLERI = ["istemci kaleminin zinciri", "istemci kaleminin iptal durumu",
  "istemcinin ozel anahtari gizli", "istemci kaleminin dagitimi"];

// Kurgu sunus denemeleri: hangi kalem sunuluyor, ozeti hangi anahtar imzaliyor.
const SUNUS = [
  ["dogru kalem, dogru ad", { kalem: "dogru", imzalayan: "dogru" }, "olcum-toplayici", "mesru"],
  ["baska ad icin duzenlenmis kalem", { kalem: "fatura", imzalayan: "fatura" },
    "olcum-toplayici", "ad"],
  ["bilinmeyen otoritenin kalemi", { kalem: "yabanci", imzalayan: "yabanci" },
    "olcum-toplayici", "zincir"],
  ["iptal edilmis kalem", { kalem: "iptalli", imzalayan: "iptalli" }, "olcum-toplayici", "iptal"],
  ["kopyalanmis kalem, ozel anahtar yok", { kalem: "dogru", imzalayan: "istemci" },
    "olcum-toplayici", "sahiplik"],
];

const AYAR = [
  ["tam dogrulama", { zincir: 1, ad: 1, iptal: 1, sahiplik: 1 }, false],
  ["ad denetimi kapali", { zincir: 1, ad: 0, iptal: 1, sahiplik: 1 }, false],
  ["zincir dogrulamasi kapali", { zincir: 0, ad: 1, iptal: 1, sahiplik: 1 }, false],
  ["iptal denetimi kapali", { zincir: 1, ad: 1, iptal: 0, sahiplik: 1 }, false],
  ["sahiplik imzasi atlanmis", { zincir: 1, ad: 1, iptal: 1, sahiplik: 0 }, false],
  ["hicbir kimlik adimi yok", { zincir: 0, ad: 0, iptal: 0, sahiplik: 0 }, false],
  ["tam dogrulama + karsilikli", { zincir: 1, ad: 1, iptal: 1, sahiplik: 1 }, true],
];

const ilk = elSikis(SUNUS[0][1], SUNUS[0][2], { zincir: 1, ad: 1, iptal: 1, sahiplik: 1 });
console.log(`tam dogrulamada mesru el sikisma: kabul ${ilk.kabul}, ` +
  `ortak sir esit ${ilk.esitAnahtar}, bitis dogrulamasi ${ilk.bitis}`);
console.log(`${SUNUS.length} kurgu sunus denemesi, ${AYAR.length} ayar\n`);

const y1 = yaz([54, 18, 8]);
console.log(y1(["iddia", "kanitlayan adim", "kalem"]));
for (const [ad, adim] of IDDIA)
  console.log(y1([ad, adim, (KALEMLER[adim] ?? []).length]));

const y2 = yaz([30, 12, 10, 10, 16, 8]);
console.log("\n" + y2(["ayar", "kanitlanan", "kanitsiz", "kabul/5", "kanitsiz gecen", "kalem"]));
for (const [ad, ayar, karsilikli] of AYAR) {
  const sonuc = SUNUS.map(([, s, hedef]) => elSikis(s, hedef, ayar));
  const kabul = sonuc.filter((r) => r.kabul).length;
  const kanitlanan = IDDIA.filter(([, a]) => ayar[a] === undefined || ayar[a]).length +
    (karsilikli ? 1 : 0);
  const kalem = [...Object.entries(KALEMLER).filter(([a]) => ayar[a] === undefined || ayar[a])
    .flatMap(([, l]) => l), ...SABIT, ...(karsilikli ? ISTEMCI_KALEMLERI : [])].length;
  const toplamIddia = IDDIA.length + (karsilikli ? 1 : 0);
  console.log(y2([ad, kanitlanan, toplamIddia - kanitlanan, kabul, kabul - 1, kalem]));
}

console.log(`\nkarsilikli dogrulamanin ekledigi iddia: istemci kurumun tanidigi bir ozne`);
console.log(`ekledigi kalem (baglanti basina ${ISTEMCI_KALEMLERI.length}):`);
for (const k of ISTEMCI_KALEMLERI) console.log(`  ${k}`);
const KARSILIKLI = elSikis({ kalem: "istemci", imzalayan: "istemci" }, "saha-terminali-17",
  { zincir: 1, ad: 1, iptal: 1, sahiplik: 1 });
console.log(`istemci yonunde ayni dort adim kosturuldu: kabul ${KARSILIKLI.kabul}`);
const FILO = [["sayac ucu", 4100], ["ic servis", 26], ["personel is istasyonu", 262]];
const toplam = FILO.reduce((t, [, n]) => t + n, 0);
console.log(`filo olceginde eklenen kalem: ${toplam} uc kalem x ` +
  `${ISTEMCI_KALEMLERI.length} = ${toplam * ISTEMCI_KALEMLERI.length}`);
```

```
tam dogrulamada mesru el sikisma: kabul true, ortak sir esit true, bitis dogrulamasi true
5 kurgu sunus denemesi, 7 ayar

iddia                                                    kanitlayan adim   kalem
sunulan kalem tanidik bir koke baglaniyor                         zincir       3
kalem konusulan ad icin duzenlenmis                                   ad       2
kalem iptal edilmemis                                              iptal       2
karsi taraf kalemin ozel anahtarini elinde tutuyor              sahiplik       1
oturum anahtari iki tarafta ayni ve ucuncu tarafta yok           anahtar       1
adim ozeti iki tarafta ayni                                        bitis       1

ayar                            kanitlanan  kanitsiz   kabul/5  kanitsiz gecen   kalem
tam dogrulama                            6         0         1               0      11
ad denetimi kapali                       5         1         2               1       9
zincir dogrulamasi kapali                5         1         2               1       8
iptal denetimi kapali                    5         1         2               1       9
sahiplik imzasi atlanmis                 5         1         2               1      10
hicbir kimlik adimi yok                  2         4         5               4       3
tam dogrulama + karsilikli               7         0         1               0      15

karsilikli dogrulamanin ekledigi iddia: istemci kurumun tanidigi bir ozne
ekledigi kalem (baglanti basina 4):
  istemci kaleminin zinciri
  istemci kaleminin iptal durumu
  istemcinin ozel anahtari gizli
  istemci kaleminin dagitimi
istemci yonunde ayni dort adim kosturuldu: kabul true
filo olceginde eklenen kalem: 4388 uc kalem x 4 = 17552
```

İlk satır meşru el sıkışmanın gerçekten koştuğunu söylüyor: kalem kabul edildi, iki tarafın
türettiği ortak sır birbirine eşit ve özet üzerinde hesaplanan bitiş değeri iki tarafta aynı çıktı.
Bu üç sonuç ayrı ayrı doğrulandı, çünkü üçü ayrı iddiaya karşılık gelir.

İddia tablosu adımların iş bölümünü gösteriyor. **Zincir doğrulaması** kalemin tanıdık bir köke
bağlandığını söyler ama kalemin kimi tanımladığını söylemez. **Ad denetimi** kalemin konuşulan ad
için düzenlendiğini söyler ama kalemin geçerli olup olmadığını söylemez. **Kalem sahipliği imzası**
ise ötekilerin hiçbirinin söylemediği şeyi söyler: karşı taraf bu kalemi yalnız göstermiyor, özel
anahtarını da elinde tutuyor. Sertifika herkese açık olarak sunulan bir belgedir; onu kopyalamak
hiçbir engel gerektirmez. Sahiplik imzasını üretmek ise sertifikanın kendisinde bulunmayan bir
şeyi gerektirir.

Son iki iddia kimlik adımlarından bağımsızdır. Ortak sırrın iki tarafta aynı olması ve özetin
değişmemiş olması, hiçbir kalem sunulmasa bile sağlanır. Bu, dersin en çok karıştırılan noktasıdır
ve son ayar satırında görünür.

#### Bir Adım Atlandığında

İkinci tablo dört ayarı yan yana koyuyor ve her birinde tek bir adım kapatılıyor. Dördünde de aynı
şey oluyor: kanıtlanan iddia altıdan beşe iniyor ve kabul edilen sunuş birden ikiye çıkıyor. Yani
**her adım tam olarak bir sunuşu durduruyor** ve hiçbiri bir ötekinin yedeği değil. Ad denetimi
kapatıldığında fatura servisi için düzenlenmiş kalem toplayıcı yerine geçiyor; zincir doğrulaması
kapatıldığında bilinmeyen bir otoritenin ürettiği kalem geçiyor; iptal denetimi kapatıldığında
geçersiz sayılmış kalem geçiyor.

Beşinci satır bu dördünden ayrılıyor. Sahiplik imzası atlandığında tutması gereken kalem sayısı
on birden **ona** iniyor — bütün ayarlar içinde en küçük düşüş. Buna karşılık geçen sunuş, kalemin
bir kopyasını taşıyan ve özel anahtarı hiç olmayan bir taraftır. En az kalem tasarrufu sağlayan
atlama, savunma açısından en pahalı olanıdır; çünkü kaldırdığı tek kalem, sertifikanın taşımadığı
tek şeydir.

Altıncı satır ölçünün alt sınırını veriyor. Hiçbir kimlik adımı yokken beş sunuşun beşi de kabul
ediliyor, kanıtsız geçen dört, tutması gereken kalem üç. Fakat kanıtlanan iddia sayısı sıfır değil,
**iki**: ortak sır yine iki tarafta aynı ve özet yine değişmemiş. Bu ayarda bağlantı şifrelidir ve
dinleyen bir üçüncü taraf içeriği okuyamaz — yalnız konuşulan tarafın kim olduğu bilinmez.
Şifreleme ile kimlik doğrulama iki ayrı iştir; ilki ikincisi olmadan da tamamlanır ve tamamlandığı
anda ortada başarılı görünen bir bağlantı vardır.

Dört adımın hiçbirinin söylemediği bir şey de var. Ad denetimi, kalemi istemcinin **gitmek
istediği** adla karşılaştırır; o adın doğru olup olmadığını sormaz. İstemci yanlış bir ada
yöneltilmişse ve karşı taraf o ad için geçerli bir kalem taşıyorsa dört adımın dördü de geçer.
Zincir doğrulaması da benzer bir sınır taşır: kalemin tanıdık bir köke bağlandığını söyler, o
kalemin arkasındaki tarafın güvenilir olduğunu değil.

#### Karşılıklı Doğrulamanın Eklediği

Şimdiye kadar ölçülen her şey tek yönlüydü: istemci sunucunun kim olduğunu soruyordu, sunucu
istemciye aynı soruyu sormuyordu. Son ayar bu soruyu ekliyor ve aynı dört adım ters yönde
koşuyor — koşum bunu ayrıca doğruluyor, istemci kalemi de kabul ediliyor.

Kazanç bir iddiadır: istemci, kurumun tanıdığı bir öznedir. Bedeli bağlantı başına dört kalem ve
toplam on beş. Bu dört kalemin üçü sunucu tarafındakilerin aynadaki eşidir; dördüncüsü yenidir ve
asıl yükü taşır: **istemci kaleminin dağıtımı**. Sunucu tarafında bir kalem vardır ve bir yerde
durur; istemci tarafında kalem, bağlanan her makineye ayrı ayrı yerleştirilmelidir.

Filo ölçeğinde bu 4.388 uç kalem için **17.552 kalem** demektir. Sayı, ikinci dersin envanteriyle
birlikte okunduğunda anlam kazanır: karşılıklı doğrulama, kimlik doğrulama tarafında bir iddia
eklerken yaşam döngüsü tarafında dört bin üç yüz seksen sekiz kalemlik bir yük açar. Bu yükün
kendisi bir savunma değildir; savunmanın sürdürülebilmesinin koşuludur ve ödenmediğinde eklenen
iddia da kanıtsız kalır.

Bu, dört adımın hepsi için geçerli bir sonuca işaret ediyor. El sıkışma anında ölçülen her iddia,
bağlantıdan çok önce yapılmış bir işe dayanır: kalemin düzenlenmesine, adının doğru yazılmasına,
köke ulaştırılmasına ve süresi dolmadan yenilenmesine. Ölçüm bağlantı anında yapılır, iş ise başka
bir zamanda.

#### Özet

- El sıkışmanın dört kimlik adımı altı iddiadan dördünü kanıtlar; kalan iki iddia (ortak sırrın
  eşitliği ve özetin değişmemişliği) kimlik adımlarından bağımsız olarak sağlanır.
- Dört adımın herhangi biri kapatıldığında kanıtlanan iddia 6'dan 5'e, kabul edilen sunuş 1'den
  2'ye gider: her adım tam olarak bir sunuşu durdurur ve hiçbiri bir ötekinin yedeği değildir.
- Sahiplik imzasını atlamak tutması gereken kalemi yalnız 1 azaltır (11'den 10'a) ama sertifikanın
  bir kopyasını taşıyan, özel anahtarı olmayan tarafı kabul eder. En küçük tasarruf, en pahalı
  açıklıktır.
- Hiçbir kimlik adımı yokken 5 sunuşun 5'i geçiyor, ama 2 iddia hâlâ kanıtlı: bağlantı şifrelidir
  ve içeriği okunamaz — yalnız karşı tarafın kim olduğu bilinmez. Şifreleme, kimlik doğrulama
  olmadan da tamamlanır.
- Karşılıklı doğrulama 1 iddia ekler, bağlantı başına kalemi 11'den 15'e çıkarır ve filo ölçeğinde
  4.388 uç kalem için 17.552 kalem yük getirir; bu yükün büyük kısmı doğrulama değil, dağıtım ve
  yaşam döngüsü işidir.

#### Sonraki Adım

Bu dersin son cümlesi bir sonrakinin sorusudur. El sıkışmada ölçülen bütün iddialar, bağlantıdan
önce yapılmış bir işin sonucuydu ve o işin en kırılgan parçası zamanla ilgilidir: her kalemin bir
geçerlilik penceresi vardır ve pencere dolduğunda kalem, hiçbir şey değişmemiş olsa bile geçmeyi
bırakır. Sonraki ders bu pencereyi ölçer — yenileme elle yapıldığında kaç kalem gözden kaçıyor,
süresi dolmuş tek bir kalem kaç bağlantı düşürüyor, otomasyon hangi kalemi kapatıyor ve kalem
ömrünü kısaltmak kaç kalem bakım işi ekliyor.

### Sertifika Yaşam Döngüsü Yönetimi

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/sertifika-yasam-dongusu-yonetimi

Yenileme penceresi cinsinden ölçüm: 4.397 kalemin elle yenilenmesi yılda 99 iş günü tutuyor, 111 kalem gözden kaçıyor ve 1.458 bağlantı düşüyor; otomasyon bu üç sayıyı sıfırlarken 5 sistem kalemi ekliyor ve dağınık 111 kırılma noktasını 4.397 kalemi birden taşıyan tek noktaya çeviriyor; ömrü bir güne indirmek iptal duyurusunu gereksiz kılıyor ama yıllık işlemi 4.397'den 1.604.905'e çıkarıp yedek deneme payını sıfırlıyor.

Önceki ders el sıkışmada ölçülen her iddianın bağlantıdan çok önce yapılmış bir işe dayandığını
gösterdi. O işin en kırılgan parçası zamandır: her kalemin bir geçerlilik penceresi vardır ve
pencere dolduğunda kalem, alanları değişmemiş, imzası bozulmamış ve otoritesi ayakta olsa bile
geçmeyi bırakır. Bu, bir sertifika altyapısının en sık karşılaştığı kesinti nedenidir ve nedeni bir
kırılma değil, bir **takvimdir**.

Bu ders yaşam döngüsünü yenileme penceresi cinsinden ölçer: elle yenileme kaç iş günü tutuyor ve
kaç kalem gözden kaçıyor, süresi dolmuş bir kalem kaç bağlantı düşürüyor, otomasyon hangi kalemi
kapatıp hangisini açıyor ve ömrü kısaltmak kaç kalem bakım ekliyor. Anahtar saklama katmanının ve
sır döndürme penceresinin ölçümü Bulut Yönetişimi kursunda yapıldı; burada ölçülen şey kalemin
kendi takvimidir.

- **PK21.** Yenileme işlemi, bir kalemin süresi dolmadan önce yenisiyle değiştirilmesidir. Yıllık
  işlem sayısı, kalem sayısı ile yıl içindeki yenileme sayısının çarpımıdır.
- **PK22.** Elle yenilemede kalem başına bir dokunuş dakikası vardır ve yenilemelerin bir bölümü
  gözden kaçar. Kaçırma oranı, dokunuş dakikaları ve fark etme süresi kurgu model değerleridir.
- **PK23.** Süresi dolan bir kalem, fark edilip düzeltilene kadar taşıdığı bağlantıları düşürür;
  düşen bağlantı, kalem sayısı ile bağlantı hızının ve fark etme süresinin çarpımıdır.
- **PK24.** Yenileme penceresi ömrün üçte biridir ve pencerede günde bir deneme yapılır; deneme
  sayısı, ilk denemenin başarısız olması hâlinde kalan yedek fırsat sayısını verir.
- **PK25.** Otomasyonun sistem kalemleri paylaşılır: kalem sayısıyla çoğalmazlar, ama biri
  kırıldığında bütün envanteri etkilerler.

#### Elle Yenilemenin Defteri

Elle yenilemenin bedeli üç ayrı sayıdır ve üçü birbirinin yerine geçmez: harcanan zaman, gözden
kaçan kalem, kaçan kalemin düşürdüğü bağlantı.

```js
// omur.mjs — kurgu kalem envanteri ve yenileme modeli. MODELDIR.
// Bolgesel olcum agi KURGUDUR: adetler, hizlar, dakikalar ve oranlar uydurmadir.
export const SINIF = [
  // ad, adet, saatte baglanti, elle yenileme dakikasi
  ["sayac ucu", 4100, 2, 11],
  ["ic servis", 26, 30, 18],
  ["personel kimligi", 262, 1, 6],
  ["sube aktarim", 9, 4, 25],
].map(([ad, adet, hiz, dk]) => ({ ad, adet, hiz, dk }));

export const KALEM = SINIF.reduce((t, s) => t + s.adet, 0);
export const KACIRMA = 0.025;    // elle yenilemede gozden kacan oran (kurgu)
export const FARK_ETME = 6;      // suresi dolan kalemin fark edilip duzeltilme suresi, saat
export const OGRENME = 29.5;     // ucuncu dersten: iptal ogrenme penceresi, saat
export const OTOMASYON = ["yenileme servisi", "servisin kendi kimligi",
  "yenileme sonrasi yeniden yukleme", "izleme ve uyari", "yedek yenileme yolu"];

export const yillik = (omur) => Math.ceil(365 / omur);
// Yenileme penceresi omrun ucte biridir; gunde bir deneme yapilir.
export const deneme = (omur) => Math.floor(omur / 3);

export const yaz = (g) => (h) =>
  h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join("");
```

```js
// yenileme.mjs — elle ve otomatik yenilemenin bedeli, kacirilan kalem ve omur suzgeci
import { SINIF, KALEM, KACIRMA, FARK_ETME, OGRENME, OTOMASYON, yillik, deneme, yaz }
  from "./omur.mjs";

const hesap = (omur, otomatik) => {
  let [islem, dakika, kacan, dusen] = [0, 0, 0, 0];
  for (const s of SINIF) {
    const n = yillik(omur) * s.adet;
    islem += n;
    if (otomatik) continue;
    dakika += n * s.dk;
    const k = Math.round(n * KACIRMA);
    kacan += k;
    dusen += k * s.hiz * FARK_ETME;
  }
  return { islem, dakika, kacan, dusen };
};

console.log(`envanter ${KALEM} kalem, ${SINIF.length} sinif; ` +
  `elle yenilemede gozden kacan oran ${KACIRMA * 100}% (kurgu)`);
console.log(`suresi dolan kalem ${FARK_ETME} saatte fark edilip duzeltiliyor (kurgu)\n`);

const y1 = yaz([28, 12, 12, 10, 14, 16]);
console.log(y1(["yol (365 gun omur)", "yenileme", "elle dk", "is gunu", "kacan kalem",
  "dusen baglanti"]));
for (const [ad, otomatik] of [["elle yenileme", false], ["otomatik yenileme", true]]) {
  const h = hesap(365, otomatik);
  console.log(y1([ad, h.islem, h.dakika, Math.round(h.dakika / 480), h.kacan, h.dusen]));
}
const elle365 = hesap(365, false);
console.log(`otomasyonun kapattigi kalem: ${elle365.kacan} kacan yenileme, ` +
  `${elle365.dakika} dk elle is`);
console.log(`otomasyonun ekledigi sistem kalemi: ${OTOMASYON.length}`);
for (const k of OTOMASYON) console.log(`  ${k}`);
console.log(`bu kalemlerden biri (servisin kendi kimligi) kirilirsa etkilenen kalem: ${KALEM}`);

// Sinif basina elle yenilemenin bedeli (365 gun omurde).
const y2 = yaz([20, 10, 12, 10, 14, 16]);
console.log("\n" + y2(["sinif", "kalem", "elle dk", "kacan", "saatte bag.", "dusen baglanti"]));
for (const s of SINIF) {
  const n = yillik(365) * s.adet, k = Math.round(n * KACIRMA);
  console.log(y2([s.ad, s.adet, n * s.dk, k, s.adet * s.hiz, k * s.hiz * FARK_ETME]));
}

// Omur suzgeci: kisaltmanin yenileme hacmine, deneme payina ve iptal ihtiyacina etkisi.
const y3 = yaz([12, 14, 14, 12, 14, 16]);
console.log("\n" + y3(["omur", "yillik islem", "gunluk islem", "deneme", "elle is gunu",
  "iptal gerekli"]));
for (const omur of [365, 90, 30, 7, 1]) {
  const oto = hesap(omur, true), el = hesap(omur, false);
  console.log(y3([`${omur} gun`, oto.islem, Math.round(oto.islem / 365), deneme(omur),
    Math.round(el.dakika / 480), omur * 24 > OGRENME ? "evet" : "hayir"]));
}
console.log(`iptal ogrenme penceresi ${OGRENME} saat (ucuncu ders); ` +
  `omru bundan kisa kalem duyurudan once kendiliginden duser`);
```

```
envanter 4397 kalem, 4 sinif; elle yenilemede gozden kacan oran 2.5% (kurgu)
suresi dolan kalem 6 saatte fark edilip duzeltiliyor (kurgu)

yol (365 gun omur)              yenileme     elle dk   is gunu   kacan kalem  dusen baglanti
elle yenileme                       4397       47365        99           111            1458
otomatik yenileme                   4397           0         0             0               0
otomasyonun kapattigi kalem: 111 kacan yenileme, 47365 dk elle is
otomasyonun ekledigi sistem kalemi: 5
  yenileme servisi
  servisin kendi kimligi
  yenileme sonrasi yeniden yukleme
  izleme ve uyari
  yedek yenileme yolu
bu kalemlerden biri (servisin kendi kimligi) kirilirsa etkilenen kalem: 4397

sinif                    kalem     elle dk     kacan   saatte bag.  dusen baglanti
sayac ucu                 4100       45100       103          8200            1236
ic servis                   26         468         1           780             180
personel kimligi           262        1572         7           262              42
sube aktarim                 9         225         0            36               0

omur          yillik islem  gunluk islem      deneme  elle is gunu   iptal gerekli
365 gun               4397            12         121            99            evet
90 gun               21985            60          30           493            evet
30 gun               57161           157          10          1283            evet
7 gun               233041           638           2          5230            evet
1 gun              1604905          4397           0         36017           hayir
iptal ogrenme penceresi 29.5 saat (ucuncu ders); omru bundan kisa kalem duyurudan once kendiliginden duser
```

Bir yıllık ömürle dört bin üç yüz doksan yedi kalemin elle yenilenmesi 47.365 dakika, yani **99 iş
günü** tutuyor. Bu, bir kişinin doksan dokuz gün boyunca başka hiçbir iş yapmaması
demektir ve sayı, envanterin kendisinden değil, dokunuş dakikalarından gelir.

Sınıf tablosu bu yükün nereden geldiğini gösteriyor: 45.100 dakika, yani toplamın yüzde doksan
beşi, tek bir sınıftan — sayaç uçlarından. Dört bin yüz kalem ve dokunuş başına on bir dakika.
Kalan üç sınıf birlikte 2.265 dakika tutuyor. Envanterin yüzde doksan üçü elle işin yüzde doksan
beşini üretiyor; yaşam döngüsü kararı bu yüzden bir envanter kararı değil, bir **sınıf kararıdır**.

Kaçan kalem sütunu ikinci bedeli yazıyor. Yüzde iki buçukluk oran 111 kaleme karşılık geliyor ve
bu 111 kalem süresi dolduğu için, bir saldırı olmadan, tamamen kendiliğinden düşüyor. Düşürdükleri
bağlantı 1.458. Dağılım burada tersine dönüyor: iç servislerde yalnız bir kalem kaçıyor ama saatte
780 bağlantı taşıdıkları için düşen bağlantı 180 oluyor — personel kimliklerinde yedi kalem
kaçmasına rağmen 42. **Kaçan kalem sayısı riski vermiyor; kaçan kalemin taşıdığı trafik veriyor.**

Şube aktarımı satırı sıfır gösteriyor ve bu bir güvence değil, bir yuvarlama sonucudur: dokuz
kalemin yüzde iki buçuğu bir kalemin altındadır. Küçük sınıflarda oran tabanlı ölçüm anlam
üretmez; orada tek tek sayım gerekir.

Altı saatlik fark etme süresi de bir varsayımdır ve neye bağlı olduğu yazılmalıdır. Süresi dolan
bir kalem hiçbir uyarı üretmez; ürettiği tek şey karşı taraftaki doğrulama hatasıdır. O hatanın
kime ulaştığı sınıfa göre değişir — iç serviste bir çağrı zinciri hemen kırılır ve fark edilir,
sayaç ucunda ise yalnız o ucun verisi gelmez. Fark etme süresi bu yüzden bir izleme kararının
sonucudur: geçerlilik penceresini önceden tarayan bir denetim yoksa, süre kalemin ne kadar
gürültülü düştüğüne bağlıdır.

Bu tablonun sessiz varsayımı envanterin eksiksiz olmasıdır. Yenileme, yalnız listede duran kaleme
yapılır; listede olmayan bir kalem yenilenmez ve süresi dolduğunda kimse onu beklemiyordur. Bir
sertifika altyapısında bu kalemler her zaman vardır — bir sınama için düzenlenip yerinde bırakılan,
bir devir sırasında kimsenin üstlenmediği, bir aygıt görüntüsünün içine gömülüp unutulan kalemler.
Envanterde görünmeyen bir kalemin ölçüsü de yoktur: yukarıdaki 99 iş günü ve 111 kaçan kalem, ancak
envanterin doğru olduğu ölçüde doğrudur.

Zaman dağılımı da bir varsayımdır. Yukarıdaki hesap 4.397 yenilemeyi yıla eşit yayılmış sayıyor;
oysa kalemler çoğu zaman toplu düzenlenir — bir kurulum, bir geçiş ya da bir yenileme kampanyası
sırasında yüzlercesi aynı gün üretilir. Aynı gün üretilen kalemler aynı gün düşer. O durumda 99 iş
günlük yük yıla değil, birkaç güne sıkışır ve kaçan kalem oranı da o günlerde yükselir. Yaşam
döngüsünün ölçülmesi gereken ikinci sayısı bu yüzden toplam değil, **en yoğun gündeki yenileme
sayısıdır**.

#### Otomasyonun Kapattığı ve Açtığı

Otomatik yenileme üç sütunu birden sıfırlıyor: 47.365 dakika, 111 kaçan kalem ve 1.458 düşen
bağlantı. Bu, kursta ölçülen savunmalar içinde en temiz sonuçtur; kapattığı kalemler karşılığında
hiçbir meşru işi durdurmaz. Bedeli çalışma anında değil, kurulum anında ödenir ve kurulum bir kez
yapılır.

Karşılığında beş sistem kalemi ekliyor ve bu kalemler ötekilere benzemiyor. Envanterle birlikte
çoğalmazlar — dört bin üç yüz doksan yedi kalem için de beş tanedirler. Buna karşılık
paylaşıldıkları için **biri kırıldığında bütün envanteri etkilerler**. Listede bunun en açık
örneği ikinci sıradadır: yenileme servisinin kendi kimliği. O kimlik, otorite adına kalem talep
edebilen bir kimliktir ve kırıldığında etkilenen kalem sayısı 4.397'dir.

Listedeki üçüncü kalem, yenilemenin neden yalnız bir imza işi olmadığını söylüyor. Yeni bir kalem
üretilip diske yazıldığında iş bitmiş olmaz; kalemi kullanan sürecin onu yeniden okuması gerekir.
Belleğinde eski kalemi tutmaya devam eden bir servis, diskte yepyeni bir kalem dururken süresi
dolmuş kalemi sunmayı sürdürür ve dışarıdan bakan hiçbir denetim bu ikisini ayırt edemez —
yapılandırma doğrudur, dosya günceldir, sunulan kalem eskidir. Yenileme zincirinin son halkası
imza değil, yeniden yüklemedir.

Buradaki değiş tokuş dersin ana cümlesidir. Elle yenilemede 111 dağınık kırılma noktası vardır ve
her biri tek bir kalemi düşürür; hiçbiri ötekini etkilemez, hepsi görünür ve hepsi ayrı ayrı
düzeltilir. Otomasyon bu 111 noktayı sıfırlar ve yerine bir tane koyar — ama o tek nokta 4.397
kalemi birden taşır. Toplam kırılma sayısı düşer, tek bir kırılmanın kapsamı büyür. İkinci dersin
kök tablosuyla aynı biçimdir bu: yoğunlaştırma, sayıyı azaltırken yarıçapı büyütür.

#### Ömrü Kısaltmanın Faturası

Son tablo, üçüncü dersin açık bıraktığı soruyu kapatıyor. İptal duyurusunun öğrenme penceresi
ortalama 29,5 saatti ve daraltılabiliyor ama sıfırlanamıyordu. Ömrü bir güne indirmek o pencereyi
gereksiz kılar: yirmi dört saatlik bir kalem, iptal duyurusu istemcilere ulaşmadan **kendiliğinden
düşer**. İptal problemi çözülmez, ortadan kalkar.

Faturası aynı satırda. Yıllık işlem 4.397'den **1.604.905'e** çıkıyor, günlük işlem on ikiden dört
bin üç yüz doksan yediye. Bu hacim elle yönetilemez — elle iş günü sütunu 36.017 gösteriyor, yani
yüz kişilik bir ekibin bir buçuk yılı. Kısa ömürlü kalem otomasyonu bir tercih olmaktan çıkarır ve
zorunlu kılar.

Üçüncü sütun daha az görünen bir bedeli yazıyor. Yenileme penceresi ömrün üçte biri olduğu için
kısalan ömürle birlikte **yedek deneme payı** da kısalıyor: bir yıllık kalemde 121 gün boyunca her
gün yeniden denenebilir, doksan günlükte otuz, yedi günlükte iki, bir günlükte **sıfır**. Bir
günlük ömürde ilk yenileme denemesi başarısız olursa ikinci bir fırsat yoktur; kalem düşer.
Kısaltmak riski küçültmez, riskin türünü değiştirir — uzun ömürde risk kalemin çalınıp uzun süre
kullanılmasıdır, kısa ömürde risk yenileme kanalının kırk sekiz saat çalışmamasıdır.

Tablonun ara satırları da bir şey söylüyor. Son sütun yalnız en alt satırda değişiyor: doksan
günlük ya da yedi günlük ömürde iptal duyurusu hâlâ gereklidir, çünkü yirmi dokuz buçuk saatlik
öğrenme penceresi ikisinin de altında kalır. Ömrü bir yıldan yedi güne indirmek, çalınmış bir
kalemin kullanılabileceği süreyi elli kat kısaltır ama iptal mekanizmasını ortadan kaldırmaz;
kaldırılması yirmi dört saatin altına inmeyi gerektirir ve o eşiğin hemen öncesinde günlük işlem
altı yüz otuz sekizden dört bin üç yüz doksan yediye sıçrar. Kazanç sürekli, bedel ise eşikli
artar — bu yüzden ömür kısaltma kararı çoğunlukla ortada bir yerde, işlem hacminin taşınabildiği
ve yedek deneme payının sıfırlanmadığı bir noktada durur.

Bu yüzden ömür seçimi tek bir sayıya değil, iki eğrinin kesiştiği yere bakar: kalemin yanlış ellerde
kalabileceği süre ile yenileme kanalının kesintisiz çalışması beklenen süre. İkinci sürenin
ölçüsüzce varsayılması, kısa ömrü bir savunma değil bir kırılganlık hâline getirir.

#### Özet

- 4.397 kalemin bir yıllık ömürle elle yenilenmesi 99 iş günü tutuyor; bunun yüzde doksan beşi tek
  bir sınıftan, 4.100 sayaç ucundan geliyor. Yaşam döngüsü kararı envanter kararı değil, sınıf
  kararıdır. Sayı, envanterin eksiksiz ve sürelerin yıla yayılmış olduğu varsayımına dayanır.
- Elle yenilemede 111 kalem gözden kaçıyor ve 1.458 bağlantı düşüyor. Kaçan kalem sayısı riski
  vermiyor: 1 iç servis kalemi 180 bağlantı düşürürken 7 personel kalemi 42 düşürüyor.
- Otomasyon üç sütunu birden sıfırlıyor ve hiçbir meşru işi durdurmuyor; karşılığında 5 paylaşılan
  sistem kalemi ekliyor. Bu kalemler envanterle çoğalmaz ama biri kırıldığında 4.397 kalemi birden
  etkiler.
- Değiş tokuş kırılma sayısıyla kapsam arasındadır: elle yenilemede 111 dağınık ve birbirinden
  bağımsız kırılma noktası, otomasyonda 1 nokta ve 4.397 kalemlik yarıçap.
- Ömrü 1 güne indirmek iptal duyurusunu gereksiz kılıyor, çünkü kalem duyurudan önce düşer; bedeli
  yıllık işlemin 1.604.905'e çıkması ve yenileme penceresindeki yedek deneme payının 121'den 0'a
  inmesidir.

#### Sonraki Adım

Beş ders boyunca ölçülen her şey aynı şeyi korudu: **bağlantıyı**. Sertifika bir taşıma kanalının
iki ucunu birbirine bağlar ve o kanal sonlandığında görevi biter. Kanalın sonlandığı yer ise
çoğunlukla içeriğin gideceği yer değildir — bir kayıt toplayıcıya ulaşır, orada çözülür, işlenir,
saklanır ve başka bir kanaldan yoluna devam eder. Her sıçramada içerik açık hâle gelir ve o anda
onu görebilen bir katman vardır. Sonraki ders bu konuyu kapatırken soruyu içeriğin kendisine taşır:
kaç aracı katman içeriği görüyor, anahtarı uçta tutmak kaç kalemi sunucudan çekiyor ve karşılığında
hangi yetenekler kayboluyor.

### Uçtan Uca Şifreleme Uygulamaları

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/uctan-uca-sifreleme-uygulamalari

İçeriği kimin okuyabildiği sayılır: taşıma şifrelemesinde 10 katmanın 10'u da açık içeriği görüyor, uçtan uca şifrelemede 2'si; güvenilmesi gereken kalem 36'dan 4'e, açık görülen kayıt günde 30.930 binden 5.460 bine iniyor. Karşılığında 6 yetenek düşüyor, 4'ünün uç tarafında 16 kalemlik karşılığı var, 2'sinin yok; anahtarı yalnız uçta tutmak yılda 172.200 kaydı kurtarılamaz kılıyor ve emanet anahtarı okuyan katmanı 2'den 3'e çıkarıyor.

Önceki beş ders aynı şeyi korudu: bağlantıyı. Sertifika bir taşıma kanalının iki ucunu birbirine
bağlar ve kanal sonlandığında görevi biter. Kanalın sonlandığı yer ise çoğunlukla içeriğin
gideceği yer değildir. Kurgu ölçüm ağında bir sayaç kaydı saha terminalinden çıkar, şube ağ
geçidinden, ters vekilden, uygulama sunucusundan, kuyruktan, işleyiciden, veritabanından ve
yedekten geçip iş emri terminaline ulaşır. Her sıçramada kanal yeniden kurulur ve **her sıçrama
arasında içerik açıktır**.

Bu ders konuyu kapatırken soruyu içeriğin kendisine taşır. Ölçü birimi artık kalem değil, **kimin
okuyabildiğidir**: kaç aracı katman içeriği görüyor, anahtarın uçta durması kaç kalemi sunucudan
çekiyor ve karşılığında hangi yetenekler kayboluyor.

- **PK26.** Bir katmanın içeriği "okuması", içeriğin o katmanda açık biçimde bulunmasıdır. Taşıma
  şifrelemesinde kanal korunur, katmanın içi korunmaz.
- **PK27.** Güvenilmesi gereken kalem, bir katmanda içeriğe erişebilen ayrı bir yoldur: yönetici
  hesabı, disk, yedek kopya, günlük kaydı, hata ayıklama çıktısı. Sayılar kurgudur.
- **PK28.** Uçtan uca şifrelemede anahtar yalnız uçlarda bulunur; aradaki hiçbir katman içeriği
  çözemez, taşıdığını yine taşır.
- **PK29.** Aygıt kaybı oranı, aygıt başına kayıt sayısı ve kayıt hacimleri kurgu model
  değerleridir.
- **PK30.** Emanet anahtarı, uçların anahtarını çözebilen ayrı bir anahtardır ve kurumda bir yerde
  saklanır.

#### İçeriği Kim Okuyor

Ölçüm iki ayarı aynı katman listesi üzerinde koşturuyor. Değişen tek şey anahtarın nerede durduğu;
katmanlar, hacimler ve yollar aynı kalıyor.

```js
// katman.mjs — icerigi goren katmanlarin ve kaybedilen yeteneklerin modeli. MODELDIR.
// Kurgu bolgesel olcum agi: katman listesi, hacimler, oranlar ve kalem sayilari uydurmadir.
export const KATMAN = [
  // ad, tur, gunde gordugu kayit (bin), guvenilmesi gereken kalem
  ["saha terminali", "uc", 4820, 2],
  ["sube ag gecidi", "araci", 4820, 3],
  ["ters vekil", "araci", 4820, 4],
  ["uygulama sunucusu", "araci", 4820, 5],
  ["kuyruk", "araci", 3100, 3],
  ["isleyici", "araci", 3100, 4],
  ["veritabani", "araci", 1960, 6],
  ["yedek ve arsiv", "araci", 1960, 4],
  ["gunluk toplayici", "araci", 890, 3],
  ["is emri terminali", "uc", 640, 2],
].map(([ad, tur, kayit, kalem]) => ({ ad, tur, kayit, kalem }));

export const YETENEK = [
  // ad, tasima sifrelemesinde var mi, uctan ucada karsiligi, karsiligin ek kalemi
  ["icerik uzerinde arama", true, "uc tarafinda dizin", 4],
  ["sunucu tarafi ozet uretimi", true, "uc tarafinda hesap", 3],
  ["aykirilik tespiti", true, "-", 0],
  ["icerik denetimi", true, "-", 0],
  ["anahtar kaybinda kurtarma", true, "kurtarma anahtari emaneti", 5],
  ["yeni cihazdan gecmise erisim", true, "anahtar aktarimi", 4],
];

// Uctan uca sifreleme icerigi kapatir; ustveri alanlari acik kalir.
export const USTVERI = ["gonderen uc", "alici uc", "zaman damgasi", "kayit boyutu",
  "gonderim sikligi"];

export const AYGIT = 4100;        // sayac ucu ve saha terminali toplami (kurgu)
export const KAYIP_ORAN = 0.03;   // yillik aygit kaybi orani (kurgu)
export const AYGIT_KAYIT = 1400;  // aygitta duran, baska yerde cozulemeyen kayit (kurgu)

export const yaz = (g) => (h) =>
  h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join("");
```

```js
// okuyan.mjs — icerigi kimin okudugu, cekilen kalem ve kaybedilen yetenek
import { KATMAN, YETENEK, USTVERI, AYGIT, KAYIP_ORAN, AYGIT_KAYIT, yaz } from "./katman.mjs";

const top = (l, f) => l.reduce((t, x) => t + f(x), 0);
const ARACI = KATMAN.filter((k) => k.tur === "araci");
const UC = KATMAN.filter((k) => k.tur === "uc");

const y1 = yaz([22, 10, 16, 14, 14]);
console.log(`${KATMAN.length} katman: ${UC.length} uc, ${ARACI.length} araci`);
console.log("\n" + y1(["katman", "tur", "kayit(bin/gun)", "tasimada", "uctan ucada"]));
for (const k of KATMAN)
  console.log(y1([k.ad, k.tur, k.kayit, "okur", k.tur === "uc" ? "okur" : "okuyamaz"]));

const y2 = yaz([26, 12, 16, 18, 14]);
console.log("\n" + y2(["olcu", "tasimada", "uctan ucada", "sunucudan cekilen", "oran"]));
const olcu = [
  ["icerigi goren katman", KATMAN.length, UC.length],
  ["guvenilmesi gereken kalem", top(KATMAN, (k) => k.kalem), top(UC, (k) => k.kalem)],
  ["acik goren kayit (bin/gun)", top(KATMAN, (k) => k.kayit), top(UC, (k) => k.kayit)],
];
for (const [ad, a, b] of olcu)
  console.log(y2([ad, a, b, a - b, `${((1 - b / a) * 100).toFixed(0)}%`]));

// Kaybedilen yetenek ve uc tarafindaki karsiliginin bedeli.
const y3 = yaz([32, 30, 12]);
console.log("\n" + y3(["yetenek", "uctan ucada karsiligi", "ek kalem"]));
for (const [ad, , karsilik, kalem] of YETENEK) console.log(y3([ad, karsilik, kalem]));
const karsiligiYok = YETENEK.filter(([, , k]) => k === "-").length;
console.log(y3(["toplam", `${YETENEK.length - karsiligiYok} karsilik, ${karsiligiYok} yok`,
  top(YETENEK, ([, , , n]) => n)]));

// Anahtar ucta durdugunda: kaybolan aygit, kurtarilamayan kayit.
const kayipAygit = Math.round(AYGIT * KAYIP_ORAN);
console.log(`\naygit ${AYGIT}, yillik kayip orani ${KAYIP_ORAN * 100}% -> ` +
  `${kayipAygit} aygit (kurgu)`);
console.log(`sunucu tarafinda anahtar: kurtarilamayan kayit 0`);
console.log(`anahtar yalniz ucta: kurtarilamayan kayit ` +
  `${kayipAygit * AYGIT_KAYIT} (${kayipAygit} aygit x ${AYGIT_KAYIT})`);
const emanet = YETENEK.find(([a]) => a === "anahtar kaybinda kurtarma")[3];
console.log(`kurtarma anahtari emaneti: kurtarilamayan kayit 0, ek kalem ${emanet}, ` +
  `icerigi okuyabilen katman ${UC.length} -> ${UC.length + 1}`);

console.log(`\nuctan uca sifrelemeden sonra acik kalan ustveri alani: ${USTVERI.length}`);
for (const u of USTVERI) console.log(`  ${u}`);
```

```
10 katman: 2 uc, 8 araci

katman                       tur  kayit(bin/gun)      tasimada   uctan ucada
saha terminali                uc            4820          okur          okur
sube ag gecidi             araci            4820          okur      okuyamaz
ters vekil                 araci            4820          okur      okuyamaz
uygulama sunucusu          araci            4820          okur      okuyamaz
kuyruk                     araci            3100          okur      okuyamaz
isleyici                   araci            3100          okur      okuyamaz
veritabani                 araci            1960          okur      okuyamaz
yedek ve arsiv             araci            1960          okur      okuyamaz
gunluk toplayici           araci             890          okur      okuyamaz
is emri terminali             uc             640          okur          okur

olcu                          tasimada     uctan ucada sunucudan cekilen          oran
icerigi goren katman                10               2                 8           80%
guvenilmesi gereken kalem           36               4                32           89%
acik goren kayit (bin/gun)       30930            5460             25470           82%

yetenek                                  uctan ucada karsiligi    ek kalem
icerik uzerinde arama                       uc tarafinda dizin           4
sunucu tarafi ozet uretimi                  uc tarafinda hesap           3
aykirilik tespiti                                            -           0
icerik denetimi                                              -           0
anahtar kaybinda kurtarma            kurtarma anahtari emaneti           5
yeni cihazdan gecmise erisim                  anahtar aktarimi           4
toplam                                       4 karsilik, 2 yok          16

aygit 4100, yillik kayip orani 3% -> 123 aygit (kurgu)
sunucu tarafinda anahtar: kurtarilamayan kayit 0
anahtar yalniz ucta: kurtarilamayan kayit 172200 (123 aygit x 1400)
kurtarma anahtari emaneti: kurtarilamayan kayit 0, ek kalem 5, icerigi okuyabilen katman 2 -> 3

uctan uca sifrelemeden sonra acik kalan ustveri alani: 5
  gonderen uc
  alici uc
  zaman damgasi
  kayit boyutu
  gonderim sikligi
```

İlk tablonun dördüncü sütunu bütünüyle aynı değeri taşıyor: taşıma şifrelemesinde on katmanın onu
da içeriği okur. Bu, taşıma şifrelemesinin bir eksikliği değil, tanımıdır — kanal korunur, kanalın
bittiği yerde içerik açılır. Kayıt bir sıçramada şifrelenir, ertesi sıçramada yeniden şifrelenir
ve ikisinin arasında bir sürecin belleğinde açık biçimde durur.

Özet tablosu üç ölçüyü yan yana koyuyor. İçeriği gören katman ondan **ikiye**, güvenilmesi gereken
kalem otuz altıdan **dörde**, açık görülen kayıt hacmi günde 30.930 bin'den 5.460 bine iniyor. En
büyük düşüş kalem sütunundadır ve nedeni belirgin: bir katmanın içeriği görmesi tek bir yol değil,
o katmandaki her erişim yoludur. Veritabanı satırı altı kalem taşıyor — yönetici hesabı, disk,
yedek, günlük ve iki tanesi daha; uçtan uca şifreleme bunların altısını birden kapatır, çünkü
katmanda çözecek anahtar yoktur.

Tablonun sekiz aracı satırı eşit ağırlıkta değil. Yedek ve arşiv katmanı günde yalnız 1.960 bin
kayıt görüyor, ötekilerin çoğundan az; buna karşılık gördüğü kaydı **saklar**. Bir kayıt kuyrukta
saniyeler, işleyicide milisaniyeler durur; yedekte yıllarca durur. Katman sayımı bu farkı
göstermez, çünkü sayım bir anı ölçer. Aynı sayının zaman boyutuyla birlikte okunması gerekir: on
katmanın sekizi içeriği görür, ama içeriği **biriktiren** katman birdir ve orada biriken şey,
şifrelemesi bugün değiştirilse bile geçmişe dönük olarak açık kalır.

Ölçünün mantığı bu satırda görünüyor. Sunucu tarafındaki bir denetimi sıkılaştırmak o katmandaki
kalem sayısını azaltır; anahtarı uca taşımak katmanı **denklem dışına çıkarır**. Birincisi kalemi
küçültür, ikincisi sıfırlar. İkinci dersteki kök sayımıyla aynı biçimin tersidir bu: orada tek kök
kalemleri kendinde topluyordu, burada anahtar kalemleri uçlara dağıtıyor.

#### Anahtarı Uca Taşımanın Bedeli

İkinci tablo kaybedilenleri yazıyor. Altı yeteneğin dördünün uç tarafında bir karşılığı var ve bu
karşılıklar toplam **on altı kalem** ekliyor. Karşılıkların hepsi aynı işi yapmıyor: içerik
üzerinde arama uç tarafında bir dizin kurmayı gerektirir, ama o dizin yalnız o uçtaki kayıtları
kapsar — sunucu tarafındaki arama bütün kayıtlar üzerindeydi. Karşılık bir yerine geçme değil, bir
daralmadır.

İki yeteneğin karşılığı yok. Aykırılık tespiti ve içerik denetimi, tanımı gereği içeriği okumayı
gerektirir; okuyamayan bir katman bunları yapamaz. Bu iki satır uçtan uca şifrelemenin karar
niteliğini gösteriyor: kapatılan sekiz katman, yalnız istenmeyen erişimi değil, **istenen erişimi
de** kapatır. Kurgu ölçüm ağında bunun karşılığı, bozuk bir sayacın ürettiği aykırı kaydın
toplayıcıda değil ancak uçta ya da varış noktasında fark edilmesidir.

Modelin ölçmediği bir ara durum da var. Buradaki iki ayar uçları birbirine karşıt koyuyor:
içeriğin tamamı ya açıktır ya kapalıdır. Uygulamada karar çoğunlukla alan bazında verilir — bir
kaydın abone kimliği kapatılırken sayaç okuma değeri açık bırakılabilir. O durumda kapatılan
katman sayısı aynı kalır ama her katmanın gördüğü **alan** sayısı düşer ve karşılığında sunucu
tarafı işleme, açık bırakılan alanlar üzerinde çalışmaya devam eder. Ölçünün birimi o zaman katman
değil, katman ile alanın çarpımı olur; bu dersin tablosu o çarpımın iki uç değerini verir.

Üçüncü bölüm en sert bedeli veriyor. Anahtar yalnız uçta durduğunda kaybolan bir aygıt, üzerindeki
kayıtları da götürür: yılda 123 aygıt ve **172.200 kurtarılamayan kayıt**. Sunucu tarafında anahtar
tutulduğunda bu sayı sıfırdır, çünkü çözebilen bir taraf her zaman vardır. Uçtan uca şifrelemenin
gücü ile bu kaybın nedeni aynı şeydir; biri olmadan öteki de olmaz.

#### Emanetin Geri Açtığı Katman

Kaybı sıfırlamanın bilinen yolu emanet anahtarıdır: uçların anahtarını çözebilen ayrı bir anahtar,
kurumda bir yerde saklanır. Kurtarılamayan kayıt sıfıra iner ve beş kalem eklenir. Ölçüm ise başka
bir sütunda değişiyor: içeriği okuyabilen katman ikiden **üçe** çıkıyor.

Bu üçüncü katman ötekilere benzemiyor. Aracı katmanların her biri yalnız kendi gördüğü hacmi
okurdu — kuyruk günde 3.100 bin kaydı, günlük toplayıcı 890 bini. Emanet anahtarı ise ayrım
yapmaz; uçların şifrelediği **her** kaydı çözebilir. Sekiz katmanı kapatan bir karar, bir kalem
karşılığında hepsinden geniş bir katman açar. Bu, kursun ölçü ekseninin tam da tanımıdır: emanet
anahtarı yeni bir güven köküdür ve kırıldığında düşen kalem sayısı, kapattığı sekiz katmanın
toplamından büyüktür.

Bu kökü tek bir yerde tutmamanın yolu vardır: anahtar paylara bölünür ve çözmek için payların
belirli bir sayısı bir araya getirilir. Bu, kırılma için gereken kalem sayısını birden pay
eşiğine çıkarır ve kalem sütununa aynı sayıda bakım işi ekler — pay saklama, pay yenileme, pay
sahiplerinin devri. Ölçü değişmez, yalnız kökün altına bir zincir daha girer ve o zincirin de
kalemleri sayılır.

Emanet anahtarı yanlış bir karar değildir; ölçülmemiş bir karar olduğunda yanlıştır. Ölçüldüğünde
soru "emanet olsun mu" değil, "bu kök nerede duruyor, kaç kişi ona ulaşabiliyor ve kırıldığında ne
düşüyor" olur — ikinci dersin sorduğu sorunun aynısı, farklı bir kalem üzerinde.

Kalan iki uç da sayımın dışında değil. Uçtan uca şifrelemeden sonra güvenilmesi gereken dört kalem
duruyor ve dördü de uç aygıtların üzerinde: aygıtın diski ve o aygıta erişebilen hesap. Sekiz
aracı katman kapatıldığında koruma ortadan kalkmaz, **yer değiştirir** — içeriğin okunabildiği tek
yer artık uç aygıtın kendisidir. Bu, ilk bakışta bir kazançtır, çünkü dört kalem otuz altıdan
küçüktür; ikinci bakışta bir yoğunlaşmadır, çünkü o dört kalemin tuttuğu şey artık başka hiçbir
katmanda yedeklenmiyor. Kurgu ölçüm ağında bir saha terminaline erişebilen taraf, o terminalin
gördüğü günde 4.820 bin kaydın tamamını okur ve zincirdeki hiçbir denetim bunu görmez; sertifika
geçerlidir, imza doğrudur, el sıkışma tamdır.

Son çıktı bloğu bir sınırı yazıyor. Uçtan uca şifreleme içeriği kapatır, **ilişkiyi kapatmaz**:
gönderen uç, alıcı uç, zaman damgası, kayıt boyutu ve gönderim sıklığı aracı katmanlarda açık
kalır, çünkü kaydı yönlendirmek için gereklidirler. Beş alanlık bu üstveri kümesi, bir sayacın ne
zaman ve hangi sıklıkta veri gönderdiğini, hangi terminale iş emri açıldığını ve hangi uçların
birbiriyle konuştuğunu görünür bırakır. Bir sayacın gönderim sıklığındaki değişim, kaydın içeriği
hiç okunmadan bir arıza ya da bir müdahale işareti olarak okunabilir; aynı görünürlük, aracı
katmanların hâlâ ne kadar şey bildiğini de gösterir. İçeriğin okunamaması, hakkında hiçbir şey
bilinememesi anlamına gelmez.

#### Özet

- Taşıma şifrelemesinde 10 katmanın 10'u da içeriği okur; bu bir eksiklik değil tanımdır — kanal
  korunur, kanalın bittiği yerde içerik açılır.
- Uçtan uca şifreleme içeriği gören katmanı 10'dan 2'ye, güvenilmesi gereken kalemi 36'dan 4'e
  (%89), açık görülen kaydı günde 30.930 binden 5.460 bine indirir. Denetim sıkılaştırmak kalemi
  küçültür, anahtarı uca taşımak katmanı denklem dışına çıkarır.
- Karşılığında 6 yetenek düşer: 4'ünün uç tarafında 16 kalemlik bir karşılığı vardır ve bu
  karşılıklar daha dar kapsamlıdır; aykırılık tespiti ile içerik denetiminin karşılığı yoktur,
  çünkü ikisi de içeriği okumayı gerektirir.
- Anahtar yalnız uçta durduğunda yılda 123 kayıp aygıt 172.200 kaydı kurtarılamaz kılar; sunucu
  tarafında anahtar tutulduğunda bu sayı 0'dır. Güç ile kayıp aynı özelliğin iki yüzüdür.
- Emanet anahtarı kaybı sıfırlar, 5 kalem ekler ve okuyabilen katmanı 2'den 3'e çıkarır; bu
  katman, kapatılan 8 katmanın hiçbirinin görmediği kadar geniş görür. Üstveri ise açık kalır:
  içerik kapansa da 5 alan görünmeye devam eder.

#### Sonraki Adım

Bu konu bir soruyla açılmıştı: imza bütünlüğü kanıtlıyor, ama doğrulamada kullanılan açık anahtarın
kime ait olduğunu ne kanıtlıyor. Altı ders o soruyu bir zincire bağladı — alanların taşıdığı
iddialar, kökün taşıdığı kalemler, iptalin öğrenme penceresi, el sıkışmanın kimlik adımları,
yenilemenin takvimi ve anahtarın uçta durmasının bedeli sayıldı. Anahtarın kime ait olduğu artık
adlandırılmış bir köke dayanıyor.

Açıkta kalan şey adın kendisidir. Bir kalemin öznesinde `saha-terminali-17` yazması o terminali
kimin kullandığını, o kişinin hangi rolde olduğunu, hangi kayıtlara erişebileceğini ve bu kararın
binlerce makinede nasıl uygulanacağını söylemez. Kurum içinde kimin kim olduğu, kimin neye
erişebildiği ve bunun tek tek makinelerde nasıl dayatıldığı hiç ölçülmedi. Sonraki konu
**Kurumsal Kimlik** bu üç soruyu alır: kimliğin merkezî olarak nerede tutulduğu, o merkez
kırıldığında kaç uygulamanın düştüğü ve politikanın kaç makineye kaç turda ulaştığı.

## Kurumsal Kimlik

Kurum ölçeğinde güven kökünün nerede durduğu ve kırıldığında ne tuttuğu: merkezî kimlik deposuna bağlı sistem sayısı ve çoğaltmanın kurtardığı kalem, bilet veren servisin anahtarına indirgenen bilet akışı, merkezî ağ doğrulama servisi erişilemezken geri düşme davranışının açtığı yol, tek kimlik sağlayıcısına bağlı uygulamalar ile iddia belgesinin ömrü ve iptal penceresi, etmen türlerinin kapattığı ve kapatamadığı yol, merkezî politikanın yayılma turları ve ulaşmayan kalem, yatay ile dikey yetki yükseltme yollarının sayımı ve kimlik bilgisi hırsızlığına karşı denetimlerin kapattığı yol.

### Dizin Servisleri

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/dizin-servisleri

Merkezî kimlik deposunun güven kökü olarak ölçülmesi: 16 sistemin 13'ünün tek depoya bağlı olması, kökten girişe uzanan zincirin bağlanma kipine göre 9, 8 ve 2 kalem tutması, 12 saatlik kesintide 13 sistemde 609 hesap girişinin durması, çoğaltmanın üçüncü kopyada hiçbir yeni sistem kurtarmaması ve bütünlük kırıldığında 646 kalemin elle yenilenmesi.

Önceki konu bir açık anahtarın kime ait olduğunu bir zincire bağladı: sertifika, ara otorite,
kök. Zincir sayıldı ve kökün kırılması durumunda düşen kalem çıkarıldı. Kapanışta kalan soru
şuydu — anahtarın sahibi bir ada bağlandı, ama kurumun içinde o adın **kim** olduğu, hangi
ekipte durduğu, hangi sisteme girebildiği ve bunun binlerce makinede nasıl dayatıldığı hiç
sorulmadı. Bu konu o soruyu kurum ölçeğinde ele alır ve aynı üç sütunla ölçer.

İlk mekanizma en alttakidir: kurum, kimin var olduğunu nereden bilir. Her sistem kendi hesap
listesini tutarsa bir kişinin işe girmesi kaç sisteme kayıt açmak, ayrılması kaç kayıt kapatmak
demektir ve kapatılmayan kayıt kimsenin göremediği bir açık bırakır. Bu yükü bir yere toplayan
mekanizma **dizin servisidir (directory service)**: kullanıcı, aygıt ve hizmet hesaplarını tek
bir ağaçta tutan, sorgulanabilir merkezî kimlik deposu. Bu dersin ölçtüğü şey dizinin ne
yaptığı değil, kaç şeyin ona dayandığıdır.

#### Merkezî Depo Bir Kök Olarak

**KK1:** merkezî kimlik deposu bir güven köküdür; ona bağlı her sistem, deponun döndürdüğü
kaydın doğru olduğunu baştan varsayar ve kendi başına sınamaz. **KK2:** kökten kullanıma uzanan
bir kalem zinciri vardır; zincirdeki kalemlerin hepsi **aynı anda** doğru olmalıdır, biri
bozuksa giriş ya durur ya yanlış sonuç verir. **KK3:** çoğaltma kökün **erişilebilirliğini**
çoğaltır, **doğruluğunu** çoğaltmaz — kopya sayısı kesinti süresini kısaltır, bütünlük
kırılmasının etkisini kısaltmaz. **KK4:** kökün dışında kalan sistem, kökün kesintisinden de
kurtulur, denetiminden de.

Bu kursun üç sütunu bu konuda da aynıdır: güven kökü adlandırılır, kökten kullanıma kaç kalem
aynı anda doğru olmalı sayılır, kök kırılırsa kaç kalem düşer ve yenilemenin ne tuttuğu yazılır.
Dizinin sorgu sözdizimi, ağaç şeması ve çoğaltma protokolü burada ölçülmez; ölçülen, bu üç
sayıdır.

#### On Altı Sistem, Tek Depo

Aşağıdaki envanter bir **modeldir**: kurgu bölgesel ölçüm ağını işleten kurumun sistemleri ve
her birinin merkezî depoya bağlanma biçimi. Gerçek bir kurum, gerçek bir dizin ürünü ya da
gerçek bir hesap yoktur.

```js
// kimlik/dizin.mjs — kurgu bolgesel olcum agindaki sistemlerin merkezi kimlik deposuna
// baglanma bicimi (model): gercek bir kurum, gercek bir dizin urunu ya da gercek bir hesap yok.
// Rastgelelik yok.

// KK1: merkezi kimlik deposu bir guven kokudur; ona bagli her sistem, deponun tuttugu
// kaydin dogru oldugunu bastan varsayar.
// Sutunlar: kip = baglanma bicimi (dizin: her giriste sorar; onbellek: son basarili
// dogrulamayi bir sure saklar; yerel: kendi hesap deposunu tutar), hesap = o sistemde
// giris yapan hesap sayisi, basvuru = sistemin yapilandirmasinda tanimli dizin kopyasi
// sayisi, sir = sistemin dizinde duran kendi hizmet hesabi sirri sayisi.
export const SISTEM = `
  okuma-toplayici      dizin      34   2   1
  dogrulayici          dizin      12   2   1
  faturalama           dizin      48   1   2
  is-emri              dizin      61   1   1
  saha-mobil-uc        onbellek  140   2   1
  sube-is-istasyonu    onbellek   96   2   1
  depo-terminali       onbellek   18   1   1
  bakim-plani          dizin      22   1   1
  olcum-arsivi         dizin       9   2   1
  rapor-portali        dizin      55   1   1
  ag-anahtari          dizin      14   2   0
  vpn-ucu              dizin      27   2   0
  yazici-havuzu        onbellek   73   1   0
  eski-scada-konsolu   yerel       6   0   0
  bellenim-sunucusu    yerel       4   0   0
  yedekleme-konsolu    yerel       3   0   0`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s+/);
    return { ad: p[0], kip: p[1], hesap: +p[2], basvuru: +p[3], sir: +p[4] };
  });

// KK2: koke bagli her kullanim, kokten kullanima uzanan bir kalem zinciri kurar; zincirdeki
// kalemlerin hepsi ayni anda dogru olmali. Her kalem, hangi kiplerde zorunlu oldugunu yazar.
export const ZINCIR = [
  { kalem: "hesap kaydi var",        kip: ["dizin", "onbellek"] },
  { kalem: "hesap etkin",            kip: ["dizin", "onbellek"] },
  { kalem: "parola dogrulayicisi",   kip: ["dizin", "onbellek"] },
  { kalem: "grup uyeligi",           kip: ["dizin", "onbellek"] },
  { kalem: "oznitelik eslemesi",     kip: ["dizin", "onbellek"] },
  { kalem: "dizine anlik baglanti",  kip: ["dizin"] },
  { kalem: "kanal korumasi",         kip: ["dizin", "onbellek"] },
  { kalem: "ad cozumleme",           kip: ["dizin", "onbellek"] },
  { kalem: "saat esitligi",          kip: ["dizin", "onbellek"] },
  { kalem: "yerel hesap deposu",     kip: ["yerel"] },
  { kalem: "yerel parola kaydi",     kip: ["yerel"] },
];

export const KIP = ["dizin", "onbellek", "yerel"];
export const zincirUzunlugu = (kip) => ZINCIR.filter((z) => z.kip.includes(kip)).length;
```

```js
// kimlik/sayim.mjs — merkezi kimlik deposu bir guven koku olarak sayilir: zincir kac kalem,
// depo dusunce kac sistemde giris durur, cogaltma kac sistemi kurtarir, kok kirilirsa
// yenileme kac kalem tutar.
import { SISTEM, ZINCIR, KIP, zincirUzunlugu } from "./dizin.mjs";

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 topla = (f, s = SISTEM) => s.reduce((a, x) => a + f(x), 0);
const bagli = SISTEM.filter((s) => s.kip !== "yerel");

console.log(`${SISTEM.length} sistem, ${topla((s) => s.hesap)} hesap girisi, ` +
  `${bagli.length} sistem tek depoya bagli, ${SISTEM.length - bagli.length} sistem kendi deposunda`);

const A = [-10, 8, 8, 8, 8, 6];
console.log("\n1. baglanma kipine gore zincir uzunlugu ve yuk");
yaz(A, "kip", "sistem", "hesap", "zincir", "kalem", "sir");
for (const k of KIP) {
  const s = SISTEM.filter((x) => x.kip === k);
  yaz(A, k, s.length, topla((x) => x.hesap, s), zincirUzunlugu(k),
    s.length * zincirUzunlugu(k), topla((x) => x.sir, s));
}
yaz(A, "toplam", SISTEM.length, topla((s) => s.hesap), "-",
  topla((s) => zincirUzunlugu(s.kip)), topla((s) => s.sir));

const B = [-10, 11, 13, 11, 12];
console.log("\n2. depo erisilemez oldugunda (tek kopya)");
yaz(B, "kesinti", "duran sis", "duran hesap", "acik sis", "acik hesap");
for (const saat of [1, 4, 12, 48]) {
  const durdu = SISTEM.filter((s) => s.kip === "dizin" ||
    (s.kip === "onbellek" && saat > 8));
  yaz(B, `${saat} saat`, durdu.length, topla((s) => s.hesap, durdu),
    SISTEM.length - durdu.length, topla((s) => s.hesap) - topla((s) => s.hesap, durdu));
}

const C = [-10, 11, 11, 13];
console.log("\n3. cogaltma 12 saatlik kesintide kac sistemi kurtariyor");
yaz(C, "kopya", "kurtulan", "duran", "duran hesap");
for (const kopya of [1, 2, 3]) {
  const kurtulan = SISTEM.filter((s) => s.kip !== "yerel" && s.basvuru >= 2 && kopya >= 2);
  const duran = bagli.filter((s) => !kurtulan.includes(s));
  yaz(C, `${kopya}`, kurtulan.length, duran.length, topla((s) => s.hesap, duran));
}

const D = [-24, 8, 8, 20];
console.log("\n4. kok kirilirsa (depo butunlugu bozulursa) dusen kalem ve yenileme");
const kayit = topla((s) => s.hesap, bagli);
const satir = [
  ["dizine bagli sistem", bagli.length, bagli.length, "yeniden eslenir"],
  ["hesap girisi", kayit, kayit, "parola sifirlanir"],
  ["hizmet hesabi sirri", topla((s) => s.sir), topla((s) => s.sir), "elle degistirilir"],
  ["grup uyeligi denetimi", bagli.length, bagli.length, "elle dogrulanir"],
  ["yerel depolu sistem", SISTEM.length - bagli.length, 0, "etkilenmez"],
];
yaz(D, "kalem", "sayi", "dusen", "yenileme");
for (const s of satir) yaz(D, ...s);
console.log(`toplam elle yenilenen kalem ${satir.reduce((a, s) => a + s[2], 0)}, ` +
  `zincir kalem tanimi ${ZINCIR.length}`);
```

```
16 sistem, 622 hesap girisi, 13 sistem tek depoya bagli, 3 sistem kendi deposunda

1. baglanma kipine gore zincir uzunlugu ve yuk
kip         sistem   hesap  zincir   kalem   sir
dizin            9     282       9      81     8
onbellek         4     327       8      32     3
yerel            3      13       2       6     0
toplam          16     622       -     119    11

2. depo erisilemez oldugunda (tek kopya)
kesinti     duran sis  duran hesap   acik sis  acik hesap
1 saat              9          282          7         340
4 saat              9          282          7         340
12 saat            13          609          3          13
48 saat            13          609          3          13

3. cogaltma 12 saatlik kesintide kac sistemi kurtariyor
kopya        kurtulan      duran  duran hesap
1                   0         13          609
2                   7          6          277
3                   7          6          277

4. kok kirilirsa (depo butunlugu bozulursa) dusen kalem ve yenileme
kalem                       sayi   dusen            yenileme
dizine bagli sistem           13      13     yeniden eslenir
hesap girisi                 609     609   parola sifirlanir
hizmet hesabi sirri           11      11   elle degistirilir
grup uyeligi denetimi         13      13     elle dogrulanir
yerel depolu sistem            3       0          etkilenmez
toplam elle yenilenen kalem 646, zincir kalem tanimi 11
```

Sayılar **ölçüm** sınıfındadır; girdileri KK1–KK4 ile envanterdeki değerlerdir.

#### Zincir Kaç Kalem

Birinci tablo zincir uzunluğunu bağlanma kipine göre ayırır. Her girişte depoya soran bir
sistemde zincir **dokuz kalemdir**: kaydın var olması, etkin olması, parola doğrulayıcısının
tutması, grup üyeliğinin doğru olması, özniteliklerin sistemin beklediği alanlara eşlenmesi,
depoya anlık bağlantı, kanalın korunması, adın çözülmesi ve iki taraf saatinin yeterince yakın
olması. Bunların hiçbiri "güvenlik özelliği" değildir; dokuzunun dokuzu da girişin çalışması
için gereken sıradan kalemlerdir ve **biri bozulduğunda giriş durur**.

Önbellekten doğrulayan sistemde zincir sekize iner, çünkü anlık bağlantı kalemi düşer. Bu tek
kalemlik fark, ikinci tablodaki bütün farkı üretir. Kendi deposunu tutan sistemde zincir
**ikidir** — yerel hesap listesi ve yerel parola kaydı. Toplam kalem sayısı on altı sistem için
119'dur; bu, kurumda "bir kişinin bir sisteme girebilmesi" olayının aynı anda doğru olmasını
gerektirdiği bağımsız koşul sayısıdır.

İki kalemlik zincir kısa görünür ama KK4'ün ikinci yarısı buradadır. Yerel depolu üç sistemin
altı, dört ve üç hesabı merkezî hiçbir kayda bağlı değildir: bir kişi ayrıldığında merkezî
kayıt kapatılır, bu üç sistemdeki hesap açık kalır. Kısa zincir, kesintiye dayanıklılık ile
denetimsizliği birlikte satın alır.

#### Zincirin Deponun Dışında Kalan Kalemleri

Dokuz kalemin hepsi depoda durmaz ve bu ayrım kökün sınırını çizer. Beşi deponun içindedir:
kaydın varlığı, etkinliği, parola doğrulayıcısı, grup üyeliği ve öznitelik eşlemesi. Kalan
**dördü depoda değildir** — anlık bağlantı ağın, kanal koruması sertifikanın, ad çözümleme ad
servisinin, saat eşitliği ise zaman kaynağının sorumluluğundadır. Önbellekten doğrulayan
sistemde bu oran beşe üçtür.

Bu dört kalemin her biri **kendi kökünü** taşır. Kanal koruması, önceki konuda ölçülen güven
zincirine dayanır: dizine giden bağlantının şifrelenmesi tek başına yetmez, karşı ucun gerçekten
dizin olduğu bir sertifika zinciriyle kanıtlanmalıdır. Doğrulanmayan bir kanalda depo doğru
kaydı tutsa bile sorgunun yanıtını başkası verebilir. Ad çözümleme aynı türden bir bağımlılıktır:
sistem, deponun adını bir adrese çevirmek için başka bir servise sorar ve o servisin yanıtını
sınamaz.

Saat eşitliği listedeki en sessiz kalemdir ve bir sonraki dersin tamamı onun üzerine kurulur.
Süreli bir kanıtın geçerliliği iki tarafın saatinin yeterince yakın olmasına bağlıdır; saatler
ayrıldığında giriş, hiçbir hesap değişmemiş olmasına rağmen durur. **Bir güven kökü, kendi
dışındaki kalemlerin sayısı kadar kırılgandır**: bu modelde depo kusursuz çalışırken bile girişi
durdurabilecek dört ayrı kalem vardır ve bunların hiçbiri dizin yöneticisinin denetiminde
değildir.

#### Depo Düştüğünde

İkinci tablo kesinti süresine göre duran sistemi sayar. İlk saatte dokuz sistem ve 282 hesap
girişi durur; önbellekten doğrulayan dört sistem çalışmaya devam eder ve 327 hesap etkilenmez.
Sekizinci saatten sonra önbellek penceresi kapanır: duran sistem sayısı 13'e, duran hesap sayısı
609'a çıkar. Açık kalan üç sistemin toplam 13 hesabı vardır.

Buradaki asıl sayı 13 değil, ikisi arasındaki farktır. Kesinti bir saat sürdüğünde etkilenen
hesabın oranı 282/622, on iki saat sürdüğünde 609/622'dir. Önbellek penceresi kurumun kesinti
dayanıklılığını doğrudan belirler ve bu pencere bir güvenlik ayarıdır: pencere uzadıkça
devre dışı bırakılmış bir hesabın çalışmaya devam ettiği süre de uzar. Aynı sayı iki yöne
birden çalışır — sekiz saat hem kesintide kurtarılan süredir hem de kapatılmış bir hesabın
geçerli kaldığı süredir.

#### Çoğaltmanın Kurtardığı ve Kurtarmadığı

Üçüncü tablo KK3'ün ilk yarısını sayıya çevirir. Tek kopya varken on iki saatlik kesintide
bağlı 13 sistemin hiçbiri kurtulmaz. İkinci kopya eklendiğinde yedi sistem kurtulur, altısı
durur ve duran hesap 609'dan 277'ye iner. Üçüncü kopya eklendiğinde tablo **değişmez**: yine
yedi kurtulur, yine altı durur.

Üçüncü kopyanın hiçbir şey getirmemesinin nedeni depoda değil, sistemlerin yapılandırmasındadır.
Altı sistemin yapılandırmasında tek bir başvuru adresi tanımlıdır; ikinci kopya ağda dursa bile
o sistemler ona sormaz. **Çoğaltma bir depo özelliğidir, dayanıklılık ise istemci
yapılandırmasının özelliğidir**; ikincisi yazılmadan birincisi ölçülemez. Kurtarılan sistem
sayısını belirleyen kalem, kopya sayısı değil, kaç sistemin ikinci başvuruyu tanıdığıdır.

#### Kök Kırılırsa Yenileme

Dördüncü tablo KK3'ün ikinci yarısıdır. Kesinti ile bütünlük kırılması farklı olaylardır: kesinti
geçicidir ve giderildiğinde geride bir şey bırakmaz, bütünlük kırılması ise **kalıcıdır**.
Deponun kayıtları değiştirilebildiyse, kimin hangi gruba üye olduğu ve hangi parola
doğrulayıcısının geçerli olduğu artık bilinmez.

Yenileme faturası dört kalemden oluşur: 13 sistemin eşlemesinin yeniden kurulması, 609 hesap
girişinin parolasının sıfırlanması, 11 hizmet hesabı sırrının elle değiştirilmesi ve 13 sistemin
grup üyeliklerinin elle doğrulanması. Toplam **646 kalem**. Bunların 609'u kişilere dokunur ve
paralel yapılabilir; 11'i hizmet hesabı sırrıdır ve her biri bir sistemin çalışmasını durdurma
riski taşıdığı için sırayla yapılır. Yenileme penceresinin uzunluğunu belirleyen sayı 609 değil,
**11'dir**.

Faturanın büyüklüğünden daha belirleyici olan, faturanın **ne zaman** kesileceğidir. Bütünlük
kırılması bir kesinti gibi kendini göstermez: depo çalışmaya devam eder, girişler başarılı olur
ve hiçbir sistem hata vermez. Kırılmanın bilinmesi, kayıtların bağımsız bir kopyayla
karşılaştırılmasına bağlıdır; böyle bir karşılaştırma yoksa 646 kalemlik yenileme kararı
alınamaz, çünkü yenilemeyi gerektiren olayın olduğu bilinmez. **Kök kırılmasının maliyeti
yenilemede değil, kırılmanın fark edilmediği süredeki her girişte birikir.**

Yerel depolu üç sistem bu tabloda sıfır düşer. Bu, o üç sistemin güvenli olduğu anlamına gelmez;
kendi kökleri vardır ve o kök bu ölçümün dışındadır. Bir kökün dışında kalmak, kırılmadan
kurtulmak değil, **ayrı bir kırılma noktası** eklemektir.

#### Özet

- Merkezî kimlik deposu bir güven köküdür: 16 sistemin 13'ü ve 622 hesap girişinin 609'u tek
  depoya bağlıdır.
- Kökten girişe uzanan zincir bağlanma kipine göre 9, 8 ve 2 kalemdir; toplam 119 kalemin hepsi
  aynı anda doğru olmalıdır.
- Kesintide duran sistem sayısı önbellek penceresiyle belirlenir: ilk saatte 9 sistem ve 282
  hesap, on ikinci saatte 13 sistem ve 609 hesap durur.
- Çoğaltma erişilebilirliği çoğaltır, doğruluğu çoğaltmaz; üçüncü kopya hiçbir yeni sistem
  kurtarmaz, çünkü 6 sistemin yapılandırmasında tek başvuru tanımlıdır.
- Bütünlük kırılırsa 646 kalem elle yenilenir; pencerenin uzunluğunu 609 parola değil, sırayla
  değiştirilen 11 hizmet hesabı sırrı belirler.

#### Sonraki Adım

Bu ders deponun **kimin var olduğunu** söylediğini saydı, ama bir kaydın var olması bir kişinin
o an gerçekten orada olduğunu göstermez. Her girişte deponun sorgulanması ikinci tabloda görülen
bağımlılığı üretir; kurumsal ağlarda bunun yerine tek bir doğrulamadan **süreli bir kanıt**
üretilir ve sonraki her erişimde parola yerine o kanıt sunulur. Kanıtı üreten servisin kendi
anahtarı ise yeni bir köktür. Sonraki ders bilet tabanlı kimlik doğrulamayı bu eksende ölçer:
akış kaç adım, hangi adımda hangi iddia kanıtlanıyor, bilet veren servisin anahtarı ele geçerse
kaç kalem düşer ve o anahtarı yenilemek kaç adım tutar.

### Bilet Tabanlı Kimlik Doğrulama

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/bilet-tabanli-kimlik-dogrulama

Bilet akışının bilet veren servisin anahtarına indirgenmesi: altı adımda kanıtlanan iddialar ve her adımın dayandığı anahtar, 471 anahtar kaleminin beş türe dağılması, tek bir kök anahtarın ele geçmesinin 214 aslın ve 21 servisin tamamını düşürmesi, yenilemenin iki tur ve 176 saatlik pencere tutması.

Önceki ders merkezî deponun kesintisinde 13 sistemde 609 hesap girişinin durduğunu saydı. Bu
bağımlılığın kaynağı, her sistemin her girişte depoya sorması ve parolanın her seferinde ağdan
geçmesidir. Kurumsal ağlarda bunun yerine tek bir doğrulamadan **süreli bir kanıt** üretilir ve
sonraki erişimlerde parola yerine o kanıt sunulur. Kanıtın adı **bilettir (ticket)**; onu üreten
mekanizmanın açık şartnamesi Kerberos adıyla anılır.

Bu ders biletin nasıl çalıştığını değil, biletin **neye dayandığını** ölçer. Akış kaç adım,
hangi adımda hangi iddia kanıtlanıyor, kaç anahtar kalemi aynı anda doğru olmalı, hangi anahtar
ele geçerse kaç kalem düşer ve o anahtarı yenilemek kaç tur tutar.

#### Parolanın Yerini Alan Kanıt

**KK5:** bilet tabanlı doğrulamada parola yalnız ilk adımda kullanılır; sonraki her erişimde
sunulan şey süreli bir bilettir ve bilet parolayı taşımaz. **KK6:** bir bileti üretebilen, o
biletin taşıdığı iddiaların hepsini üretebilir; bu yüzden bilet veren servisin anahtarı alanın
güven köküdür. **KK7:** bir anahtarın yenilenmesi, o anahtarla üretilmiş geçerli kanıtları
geçmişe dönük geçersiz kılmaz; yenileme penceresi en uzun ömürlü kanıt kadar sürer.

KK5 iki yönlü bir kazançtır. Parolanın ağdan yalnız bir kez, o da doğrudan değil türetilmiş bir
anahtarla geçmesi, hattı dinleyen için parolayı erişilmez kılar. Aynı tasarım maliyeti de
getirir: kanıt artık bağımsız bir nesnedir, kopyalanabilir ve süresi dolana kadar kimin elinde
olduğu sorulmaz. **Ölçülmesi gereken şey biletin gücü değil, bileti üreten anahtarın kapsamı ve
biletin ömrüdür.**

#### Altı Adım, Beş Anahtar

Aşağıdaki akış bir **modeldir**: kurgu bölgesel ölçüm ağı alanında 214 kullanıcı aslı ve 21
servis aslı vardır. Gerçek bir alan, gerçek bir asıl ya da gerçek bir anahtar yoktur.

```js
// bilet/akis.mjs — bilet tabanli kimlik dogrulamanin adimlari ve dayandigi anahtarlar (model):
// kurgu bolgesel olcum agi alaninda 214 kullanici asli ve 21 servis asli var. Gercek bir alan,
// gercek bir asil ya da gercek bir anahtar yok. Rastgelelik yok.

// KK5: bilet tabanli dogrulamada parola yalnizca ilk adimda kullanilir; sonraki her erisimde
// sunulan sey sureli bir bilettir. KK6: bir bileti uretebilen, o bileti tasidigi iddialarin
// hepsini uretebilir; bilet veren servisin anahtari bu yuzden alanin guven kokudur.
export const ADIM = `
  1  on dogrulama istegi      parolayi bilen benim          kullanici        kimlik-servisi
  2  bilet veren bilet        bu bileti merkez verdi        bilet-servisi    istemci
  3  bilet ve dogrulayici     bileti alan taraf benim       oturum-1         bilet-servisi
  4  servis bileti            bu bileti merkez verdi        servis-hesabi    istemci
  5  bilet ve dogrulayici     bileti alan taraf benim       oturum-2         hedef-servis
  6  karsilikli dogrulama     karsi uc gercekten o servis   servis-hesabi    istemci`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    return { no: +p[0], ileti: p[1], iddia: p[2], anahtar: p[3], dogrulayan: p[4] };
  });

// Anahtar envanteri: adet = alandaki kalem sayisi, asil = anahtar ele gecerse dogrudan
// dusen asil sayisi, servis = dusen servis sayisi, tur = yenilemenin kac turda yapildigi.
export const ANAHTAR = {
  "kullanici":     { adet: 214, asil: 1,   servis: 0,  tur: 1, omurSaat: 2160 },
  "servis-hesabi": { adet: 21,  asil: 214, servis: 1,  tur: 1, omurSaat: 8760 },
  "oturum-1":      { adet: 214, asil: 1,   servis: 0,  tur: 0, omurSaat: 10 },
  "oturum-2":      { adet: 21,  asil: 1,   servis: 1,  tur: 0, omurSaat: 10 },
  "bilet-servisi": { adet: 1,   asil: 214, servis: 21, tur: 2, omurSaat: 8760 },
};

export const BILET_OMUR = 10;      // saat
export const YENILEME_OMUR = 168;  // saat
export const KOPYA = 3;
export const YAYILMA = 4;          // bir anahtar degisikliginin kopyalara ulasma suresi, saat
```

```js
// bilet/sayim.mjs — akis kac adim, hangi adimda hangi iddia kanitlaniyor, hangi anahtar ele
// gecerse kac kalem duser ve bilet veren servisin anahtarini yenilemek kac adim tutar.
import { ADIM, ANAHTAR, BILET_OMUR, YENILEME_OMUR, KOPYA, YAYILMA } from "./akis.mjs";

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 tur = Object.keys(ANAHTAR);
const kalem = tur.reduce((a, t) => a + ANAHTAR[t].adet, 0);

console.log(`${ADIM.length} adim, ${tur.length} anahtar turu, ${kalem} anahtar kalemi; ` +
  `bilet omru ${BILET_OMUR} saat, yenileme penceresi ${YENILEME_OMUR} saat`);

const A = [-3, -24, -30, 18];
console.log("\n1. adim basina kanitlanan iddia ve dayandigi anahtar");
yaz(A, "no", "ileti", "kanitlanan iddia", "dayandigi anahtar");
for (const a of ADIM) yaz(A, a.no, a.ileti, a.iddia, a.anahtar);

const B = [-16, 7, 10, 10, 9, 6];
console.log("\n2. anahtar turu ele gecerse dusen kalem");
yaz(B, "anahtar", "adet", "dusen as", "dus srv", "omur sa", "tur");
for (const t of tur) {
  const k = ANAHTAR[t];
  yaz(B, t, k.adet, k.asil, k.servis, k.omurSaat, k.tur);
}
const kok = ANAHTAR["bilet-servisi"];
console.log(`tek kalemle dusen oran: asil ${kok.asil}/${ANAHTAR["kullanici"].adet}, ` +
  `servis ${kok.servis}/${ANAHTAR["servis-hesabi"].adet}`);

const C = [-4, -30, 7, 23];
console.log("\n3. bilet veren servisin anahtarini yenileme plani");
const plan = [
  ["birinci anahtar degisikligi", 0, "gecmis bilet cozulur"],
  ["kopyalara yayilma", YAYILMA, `${KOPYA} kopya`],
  ["acik biletlerin sonu", BILET_OMUR, "yeni bilet alinir"],
  ["ikinci anahtar degisikligi", 0, "eski anahtar duser"],
  ["kopyalara yayilma", YAYILMA, `${KOPYA} kopya`],
  ["yenileme biletlerinin sonu", YENILEME_OMUR - BILET_OMUR, "yeniden giris"],
];
yaz(C, "no", "adim", "saat", "sonuc");
let gecen = 0;
plan.forEach((p, i) => { gecen += p[1]; yaz(C, i + 1, p[0], p[1], p[2]); });
console.log(`toplam pencere ${gecen} saat, elle dokunulan kalem ` +
  `${kok.tur + ANAHTAR["servis-hesabi"].adet}`);

const D = [-16, 12, 12, 14];
console.log("\n4. bir anahtar turunun yenilenmesinde duran mesru is");
yaz(D, "anahtar", "elle kalem", "duran asil", "duran servis");
for (const t of tur.filter((x) => ANAHTAR[x].tur > 0)) {
  const k = ANAHTAR[t];
  yaz(D, t, k.adet * k.tur, k.asil, k.servis);
}
```

```
6 adim, 5 anahtar turu, 471 anahtar kalemi; bilet omru 10 saat, yenileme penceresi 168 saat

1. adim basina kanitlanan iddia ve dayandigi anahtar
no ileti                   kanitlanan iddia               dayandigi anahtar
1  on dogrulama istegi     parolayi bilen benim                   kullanici
2  bilet veren bilet       bu bileti merkez verdi             bilet-servisi
3  bilet ve dogrulayici    bileti alan taraf benim                 oturum-1
4  servis bileti           bu bileti merkez verdi             servis-hesabi
5  bilet ve dogrulayici    bileti alan taraf benim                 oturum-2
6  karsilikli dogrulama    karsi uc gercekten o servis        servis-hesabi

2. anahtar turu ele gecerse dusen kalem
anahtar            adet  dusen as   dus srv  omur sa   tur
kullanici           214         1         0     2160     1
servis-hesabi        21       214         1     8760     1
oturum-1            214         1         0       10     0
oturum-2             21         1         1       10     0
bilet-servisi         1       214        21     8760     2
tek kalemle dusen oran: asil 214/214, servis 21/21

3. bilet veren servisin anahtarini yenileme plani
no  adim                             saat                  sonuc
1   birinci anahtar degisikligi         0   gecmis bilet cozulur
2   kopyalara yayilma                   4                3 kopya
3   acik biletlerin sonu               10      yeni bilet alinir
4   ikinci anahtar degisikligi          0     eski anahtar duser
5   kopyalara yayilma                   4                3 kopya
6   yenileme biletlerinin sonu        158          yeniden giris
toplam pencere 176 saat, elle dokunulan kalem 23

4. bir anahtar turunun yenilenmesinde duran mesru is
anahtar           elle kalem  duran asil  duran servis
kullanici                214           1             0
servis-hesabi             21         214             1
bilet-servisi              2         214            21
```

Sayılar **ölçüm** sınıfındadır; girdileri KK5–KK7 ile anahtar envanteridir.

#### Hangi Adımda Hangi İddia Kanıtlanıyor

Birinci tablo altı adımı ve her adımın kanıtladığı tek iddiayı verir. Adım 1 parolayı bilen
tarafın kim olduğunu kanıtlar ve bu, akıştaki **tek** parola kullanımıdır. Adım 2 ve 4 aynı
iddiayı taşır — biletin merkezden geldiği — ama farklı anahtarlara dayanır: ilki bilet veren
servisin anahtarına, ikincisi hedef servisin hesap anahtarına. Adım 3 ve 5, bileti sunanın onu
almış taraf olduğunu kanıtlar; kanıt oturum anahtarıyla üretilen ve zaman damgası taşıyan bir
doğrulayıcıdır.

Zaman damgası, önceki derste zincirin dışında kalan kalemlerden biri olan saat eşitliğinin
buradaki karşılığıdır. Doğrulayıcının tazeliği yalnız saate dayanır; iki tarafın saati kabul
edilen pencereden fazla ayrıldığında **hiçbir hesap değişmemiş olmasına rağmen** giriş durur.
Bir güven kökünün altında, güvenlikle ilgisi olmayan bir servis daha vardır.

Altıncı adım listedeki tek ters yönlü kanıttır: istemci karşı ucun gerçekten o servis olduğunu
doğrular. Bu adım isteğe bağlıdır ve atlandığında akış çalışmaya devam eder; kanıtlanmayan tek
iddia, istemcinin bağlandığı ucun kimliğidir. **Çalışan bir akış, kanıtlanmamış bir iddia
bırakabilir ve bunu hiçbir hata iletisi söylemez.**

#### Bir Erişimin Zinciri

Kursun ikinci sütunu burada beş anahtar türünün tamamıyla doludur. Tek bir aslın tek bir servise
erişmesi için beş türün beşi de aynı anda doğru olmalıdır: kullanıcı anahtarı ilk adımı,
kök anahtar ikinciyi, birinci oturum anahtarı üçüncüyü, servis hesabı anahtarı dördüncüyü ve
ikinci oturum anahtarı beşinciyi tutar. Bunların yanına iki kalem daha eklenir — saat penceresi
ve adın asıla çözülmesi.

İkinci kalem ilk bakışta görünmez. İstemci bir servise bağlanırken elindeki ad üzerinden bilet
ister; bilet veren servis o adı bir asıla çevirir ve bileti o asılın hesap anahtarıyla üretir.
Ad ile asıl arasındaki eşleme dizinde durur ve **doğruluğu bu akış içinde hiçbir yerde
sınanmaz**. Yanlış eşlenmiş bir ad, doğru üretilmiş bir bileti yanlış servise götürür. Zincirin
yedi kaleminden yalnız beşi kriptografiktir; kalan ikisi bir kayıt ve bir saattir.

#### Biletin İçindeki Yetki

Bilet kimliği taşır ama yalnız kimliği taşımaz. Hedef servis, aslın hangi gruplara üye olduğunu
öğrenmek için dizine ayrıca sormaz; bu bilgi biletin içine konur ve servis onu kabul eder.
Böylece bir erişim kararı, dizine hiç dokunmadan verilebilir ve önceki derste sayılan kesinti
bağımlılığı azalır.

Bunun bedeli, yetki verisinin **biletin ömrü kadar donmuş** olmasıdır. Bir asıl bir gruptan
çıkarıldığında elindeki bilet on saat daha eski üyeliği söylemeye devam eder; servis, iddiaya
inanmak için elinde başka bir kalem tutmadığından farkı göremez. Kimlik doğrulama ile
yetkilendirmenin ayrı katmanlar olduğu **Siber Güvenliğe Giriş** kursunda ölçülmüştü; burada
görülen, iki katmanın **aynı kanıt nesnesine** paketlenmesinin bir tazelik penceresi
ürettiğidir. Yetkinin geri alınması, kimliğin geri alınmasından on saat yavaştır.

#### Kök: Tek Kalem, İki Yüz On Dört Asıl

İkinci tablo bu dersin merkezidir. Alanda 471 anahtar kalemi vardır ve bunların 428'i tek bir
asıl ya da tek bir oturumla sınırlı kapsam taşır. Bir kullanıcı anahtarı ele geçerse düşen asıl
sayısı birdir; bir oturum anahtarı ele geçerse düşen kalem yine birdir ve zaten on saat sonra
kendiliğinden değersizleşir.

Servis hesabı anahtarı sıçramayı gösterir: tek bir kalem, o servise yapılan **bütün** girişleri
kapsar; 214 aslın hepsi o servis için sahte biletle temsil edilebilir. Bilet veren servisin
anahtarı ise sınırın sonudur — tek kalem, 214 aslın 214'ü ve 21 servisin 21'i. Oran iki satırda
da tamdır.

Bunun nedeni KK6'dır ve mekanizmanın kusuru değil tasarımıdır. Bilet, taşıdığı iddiaların doğru
olduğunu bilet veren servisin anahtarıyla üretilmiş olmasına dayanarak söyler. O anahtarı bilen
taraf, herhangi bir asıl için herhangi bir servise geçerli bir bilet üretebilir ve bunu yapmak
için **hiçbir parolayı bilmesine gerek yoktur**. Böyle bir üretim, yazılı yetki ve tanımlı kapsam
olmadan yapıldığında hem yasadışı hem meslek dışıdır; burada ölçülen şey üretimin nasıl
yapıldığı değil, yapıldığı varsayıldığında düşen kalem sayısıdır.

Tabloda gizli kalan bir ayrıntı bu kökü daha da kırılgan yapar. Kök anahtar ayrıcalıklı bir
donanım biriminde üretilmiş bağımsız bir değer değildir; alandaki bir hesabın anahtarıdır ve o
hesabın parolasından türetilir. Yani 471 kalemin en geniş kapsamlısı, listedeki 214 kullanıcı
anahtarıyla **aynı türden** bir kalemdir ve dayanıklılığı, arkasındaki parolanın uzunluğuyla iş
çarpanının verdiği maliyet eğrisiyle sınırlıdır. O eğri **Kriptografi Temelleri** konusunda
ölçüldü ve burada doğrudan girdidir: kökün kapsamı en geniş, kökü koruyan mekanizma ise
kullanıcı hesaplarıyla aynıdır.

#### Yenileme Penceresi

Üçüncü tablo KK7'yi sayıya çevirir. Kök anahtarın yenilenmesi tek bir değişiklik değildir. Eski
anahtar bir süre saklanmak zorundadır, çünkü dolaşımdaki biletler onunla üretilmiştir; ilk
değişiklikten sonra eski anahtar hâlâ geçerlidir. Gerçek yenileme **ikinci** değişikliktir ve
bunun için önce yayılmanın tamamlanması, sonra açık biletlerin süresinin dolması beklenir.

Pencere altı adımda birikir: iki yayılma turu sekiz saat, açık biletlerin sonu on saat, yenileme
biletlerinin sonu 158 saat. Toplam **176 saat**. Bu sürenin 158 saati tek bir ayardan gelir —
yenileme biletinin yedi günlük ömründen. Kök anahtarın yenilenme süresini belirleyen şey anahtarın
kendisi değil, **en uzun ömürlü kanıtın ömrüdür**; bilet ömrünü kısaltmadan pencere kısalmaz.

Elle dokunulan kalem sayısı 23'tür: kök anahtarın iki turu ve 21 servis hesabı anahtarının
denetimi. Dördüncü tablo bunun karşılığını verir. Kullanıcı anahtarlarının yenilenmesi 214 elle
kalem tutar ama her biri yalnız bir aslı durdurur; kök anahtarın yenilenmesi iki elle kalem
tutar ve 214 aslın hepsini birden durdurur. **Elle kalem sayısı ile durdurulan meşru iş, ters
yönlü iki ölçüdür ve yenileme planı ikincisine göre yapılır.**

Bu ters oran, yenilemenin neden ertelendiğini de açıklar. İki elle kalem küçük bir iştir; 214
aslın yedi güne yayılan kesintisi ise kurumun her ekibini durduran bir olaydır. Kök anahtarın
yenilenmesi tek başına teknik bir işlem değil, planlanmış bir kesintidir ve planlanmadığı sürece
yapılmayacaktır. Üçüncü sütun — yenilemenin ne tuttuğu — bu yüzden bir maliyet kalemi değil,
kökün ne sıklıkta gerçekten yenilendiğini belirleyen sayıdır. Yenilenmemiş bir kök, ele geçtiği
tarihten sonraki her bileti sessizce geçerli kılar ve tabloda yazılı 176 saat hiç harcanmaz.

#### Özet

- Bilet tabanlı doğrulamada parola yalnız ilk adımda kullanılır; kalan beş adımda sunulan şey
  süreli bir kanıttır ve akış 6 adımda 6 ayrı iddia kanıtlar.
- Altıncı adım atlandığında akış çalışır ama istemcinin bağlandığı ucun kimliği kanıtsız kalır.
- Alandaki 471 anahtar kaleminin 428'i tek asıl ya da tek oturum kapsamındadır; kapsam sıçraması
  servis hesabı anahtarında başlar, bilet veren servisin anahtarında tamamlanır.
- Kök anahtar tek kalemdir ve ele geçtiğinde 214 aslın 214'ü ile 21 servisin 21'i düşer; bunun
  için hiçbir parola bilinmesi gerekmez.
- Kök anahtarı yenilemek iki tur, 23 elle kalem ve 176 saatlik pencere tutar; pencerenin 158
  saati en uzun ömürlü kanıtın ömründen gelir.

#### Sonraki Adım

Bu ders bir aslın bir **servise** erişmesini ölçtü; erişimin başlayabilmesi için istemcinin ağa
çoktan bağlanmış olması gerekiyordu. Kurumsal ağlarda bu bağlantının kendisi de bir karar
noktasıdır: bir kablo takıldığında ya da bir aygıt kablosuz ağa katılmak istediğinde, ağ
donanımı kimliği kendisi doğrulamaz, merkezî bir doğrulama servisine sorar ve yanıta göre
bağlantıyı açar. Sonraki ders bunu erişim kararı cinsinden ölçer: kaç aygıt tek servise soruyor,
servis erişilemez olduğunda hangi geri düşme davranışı seçiliyor ve o davranışların her biri kaç
yol açıyor.

### Ağ Erişimi için Kimlik Doğrulama

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/ag-erisimi-icin-kimlik-dogrulama

Merkezî ağ doğrulama servisinin erişim kararı cinsinden ölçülmesi: 80 aygıtın tek servise sorması, aygıt başına 6 kalemlik zincir, servis erişilemezken dört geri düşme davranışının 0 ile 1348 arasında yol açması ve 957 uca kadar meşru erişim durdurması, bugünkü karışımda 436 yeni yolun açık kalması ve tek paylaşılan sırrın yenilenmesinin 80 aygıta elle dokunmak olması.

Önceki ders bir aslın bir servise erişmesini ölçtü ve akışın altı adımını saydı. Adımların hepsi
istemcinin ağa çoktan bağlanmış olmasını varsayıyordu: bilet isteği bir yerden çıkıp bir yere
gitmek zorundadır. Kurumsal ağlarda o bağlantının kendisi de bir karar noktasıdır. Bir kablo
takıldığında ya da bir aygıt kablosuz ağa katılmak istediğinde, kenar anahtarı ile erişim
noktası kimliği kendisi doğrulamaz — merkezî bir servise sorar ve yanıta göre bağlanma noktasını
açar.

Bu ders o servisi **erişim kararı** cinsinden ölçer. Kaç aygıt tek servise soruyor, kararın
verilebilmesi için kaç kalem aynı anda doğru olmalı, servis erişilemez olduğunda hangi geri
düşme davranışı seçiliyor ve o davranışların her biri kaç yol açıyor. İstemci ile ağ arasındaki
sır **Ağ Güvenliği** kursunda ölçüldü; burada ölçülen, aygıt ile servis arasındaki bacaktır.

#### Kararı Veren Servis

**KK8:** erişim katmanındaki aygıt kimliği kendisi doğrulamaz; kararı merkezî bir ağ doğrulama
servisine sorar. Aygıt ile servis arasındaki paylaşılan sır, o aygıtın verdiği **her** erişim
kararının güven köküdür. **KK9:** servis erişilemez olduğunda aygıt bir geri düşme davranışı
seçer; seçilen davranış hem açılan yol sayısını hem durdurulan meşru erişimi belirler ve
seçilmemiş olması bir davranışın olmadığı anlamına gelmez — varsayılan da bir seçimdir.
**KK10:** açılan yol sayısı tek başına bir sıralama ölçütü değildir; aynı sayıda yol, ulaşılan
sistem sayısına göre iki ayrı sonuç verir.

Bu servisin açık şartnamesi RADIUS adıyla anılır ve kararın kendisi iki parçadan oluşur: aygıtın
soru sorma hakkı ile ucun kimliği. Birincisi paylaşılan sırra, ikincisi ucun sunduğu kimlik
bilgisine dayanır. Servis ikinciyi doğrulamak için kendisi bir yere sorar — önceki derslerde
ölçülen merkezî dizine.

#### Seksen Aygıt, Tek Servis

Aşağıdaki envanter bir **modeldir**: kurgu bölgesel ölçüm ağının erişim katmanı. Gerçek bir
kurum, gerçek bir aygıt ya da gerçek bir sır yoktur.

```js
// aguc/erisim.mjs — kurgu bolgesel olcum aginda erisim katmani aygitlarinin merkezi ag
// dogrulama servisine baglanmasi (model): gercek bir kurum, gercek bir aygit ya da gercek
// bir sir yok. Rastgelelik yok.

// KK8: erisim katmanindaki aygit kimligi kendisi dogrulamaz; karari merkezi bir ag dogrulama
// servisine sorar ve yanita gore baglanti noktasini acar. Servis ile aygit arasindaki
// paylasilan sir, o aygitin verdigi her erisim kararinin guven kokudur.
// Sutunlar: adet = aygit sayisi, nokta = dogrulamadan gecmesi gereken baglanma noktasi,
// uc = o an bagli mesru uc, iptal = son donemde yetkisi kaldirilmis uc.
export const AYGIT = `
  merkez-kenar-anahtari     anahtar    6   144   131    4
  merkez-kablosuz-nokta     kablosuz  12   240   186    9
  sube-kenar-anahtari       anahtar   18   216   174    7
  sube-kablosuz-nokta       kablosuz  24   360   212   11
  saha-uzak-erisim-ucu      uzak       3   120    96    6
  depo-kenar-anahtari       anahtar    5    60    41    2
  olcum-toplama-anahtari    anahtar    4    48    44    1
  konuk-kablosuz-nokta      kablosuz   8   160    73    3`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s+/);
    return { ad: p[0], tur: p[1], adet: +p[2], nokta: +p[3], uc: +p[4], iptal: +p[5] };
  });

// KK9: servis erisilemez oldugunda aygit bir geri dusme davranisi secer; secilen davranis
// acilan yol sayisini da duran mesru erisimi de belirler. "erisim" sutunu, geri dusen
// baglantinin ulasabildigi sistem sayisidir (kurumdaki toplam 16 sistemin kaci).
export const GERI_DUSME = {
  "kapali":       { yeni: (a) => 0,       iptal: (a) => 0,       duran: (a) => a.uc, erisim: 0 },
  "acik":         { yeni: (a) => a.nokta, iptal: (a) => a.iptal, duran: (a) => 0,    erisim: 16 },
  "kritik-bolut": { yeni: (a) => a.nokta, iptal: (a) => a.iptal, duran: (a) => 0,    erisim: 2 },
  "onbellek":     { yeni: (a) => 0,       iptal: (a) => a.iptal, duran: (a) => 0,    erisim: 16 },
};

// KK10: kokten karara uzanan zincir, aygit basina ayni anda dogru olmasi gereken kalemlerdir.
export const ZINCIR = ["paylasilan sir", "servis sertifikasi", "uc kimlik bilgisi",
  "servisin dizin baglantisi", "politika kaydi", "bolut eslemesi"];
```

```js
// aguc/sayim.mjs — kac aygit tek servise soruyor, zincir kac kalem, servis erisilemezken
// hangi geri dusme davranisi kac yol aciyor ve paylasilan sir ele gecerse yenileme ne tutar.
import { AYGIT, GERI_DUSME, ZINCIR } from "./erisim.mjs";

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 topla = (f, s = AYGIT) => s.reduce((a, x) => a + f(x), 0);
const kip = Object.keys(GERI_DUSME);
const adet = topla((a) => a.adet);

console.log(`${adet} aygit tek servise soruyor, ${topla((a) => a.nokta)} baglanma noktasi, ` +
  `${topla((a) => a.uc)} bagli uc, ${topla((a) => a.iptal)} iptal edilmis uc`);
console.log(`zincir ${ZINCIR.length} kalem, aygit basina; alanda ${adet * ZINCIR.length} kalem`);

const A = [-10, 7, 8, 8, 8, 8];
console.log("\n1. aygit turune gore yuk");
yaz(A, "tur", "aygit", "nokta", "uc", "iptal", "kalem");
for (const t of ["anahtar", "kablosuz", "uzak"]) {
  const s = AYGIT.filter((a) => a.tur === t);
  yaz(A, t, topla((a) => a.adet, s), topla((a) => a.nokta, s), topla((a) => a.uc, s),
    topla((a) => a.iptal, s), topla((a) => a.adet, s) * ZINCIR.length);
}

const B = [-14, 10, 10, 10, 9];
console.log("\n2. servis erisilemezken ayni ag, dort geri dusme kipi");
yaz(B, "kip", "yeni yol", "iptal yol", "duran uc", "erisim");
for (const k of kip) {
  const g = GERI_DUSME[k];
  yaz(B, k, topla(g.yeni), topla(g.iptal), topla(g.duran), `${g.erisim}/16`);
}

const C = [-24, -14, 9, 10, 10];
console.log("\n3. aygitlarin bugunku kip dagilimi ile sonuc");
const secim = { "merkez-kenar-anahtari": "kapali", "merkez-kablosuz-nokta": "onbellek",
  "sube-kenar-anahtari": "kritik-bolut", "sube-kablosuz-nokta": "onbellek",
  "saha-uzak-erisim-ucu": "kapali", "depo-kenar-anahtari": "acik",
  "olcum-toplama-anahtari": "kapali", "konuk-kablosuz-nokta": "acik" };
yaz(C, "aygit", "kip", "yeni yol", "iptal yol", "duran uc");
let y = 0, i = 0, d = 0;
for (const a of AYGIT) {
  const g = GERI_DUSME[secim[a.ad]];
  y += g.yeni(a); i += g.iptal(a); d += g.duran(a);
  yaz(C, a.ad, secim[a.ad], g.yeni(a), g.iptal(a), g.duran(a));
}
yaz(C, "toplam", "-", y, i, d);

const D = [-24, 8, 9, 16];
console.log("\n4. paylasilan sir ele gecerse dusen kalem ve yenileme");
yaz(D, "kalem", "sayi", "dusen", "yenileme");
const satir = [
  ["bir aygitin sirri", 1, 1, "1 aygit elle"],
  ["ayni sirri tasiyan aygit", adet, adet, `${adet} aygit elle`],
  ["etkilenen nokta", topla((a) => a.nokta), topla((a) => a.nokta), "kendiliginden"],
  ["servis sertifikasi", 1, adet, `${adet} aygit elle`],
  ["uc kimlik bilgisi", topla((a) => a.uc), 0, "etkilenmez"],
];
for (const s of satir) yaz(D, ...s);
console.log(`tek sir tum aygitlarda ayniysa elle kalem ${adet}, ayri ayriysa 1`);
```

```
80 aygit tek servise soruyor, 1348 baglanma noktasi, 957 bagli uc, 43 iptal edilmis uc
zincir 6 kalem, aygit basina; alanda 480 kalem

1. aygit turune gore yuk
tur         aygit   nokta      uc   iptal   kalem
anahtar        33     468     390      14     198
kablosuz       44     760     471      23     264
uzak            3     120      96       6      18

2. servis erisilemezken ayni ag, dort geri dusme kipi
kip             yeni yol iptal yol  duran uc   erisim
kapali                 0         0       957     0/16
acik                1348        43         0    16/16
kritik-bolut        1348        43         0     2/16
onbellek               0        43         0    16/16

3. aygitlarin bugunku kip dagilimi ile sonuc
aygit                   kip            yeni yol iptal yol  duran uc
merkez-kenar-anahtari   kapali                0         0       131
merkez-kablosuz-nokta   onbellek              0         9         0
sube-kenar-anahtari     kritik-bolut        216         7         0
sube-kablosuz-nokta     onbellek              0        11         0
saha-uzak-erisim-ucu    kapali                0         0        96
depo-kenar-anahtari     acik                 60         2         0
olcum-toplama-anahtari  kapali                0         0        44
konuk-kablosuz-nokta    acik                160         3         0
toplam                  -                   436        32       271

4. paylasilan sir ele gecerse dusen kalem ve yenileme
kalem                       sayi    dusen        yenileme
bir aygitin sirri              1        1    1 aygit elle
ayni sirri tasiyan aygit      80       80   80 aygit elle
etkilenen nokta             1348     1348   kendiliginden
servis sertifikasi             1       80   80 aygit elle
uc kimlik bilgisi            957        0      etkilenmez
tek sir tum aygitlarda ayniysa elle kalem 80, ayri ayriysa 1
```

Sayılar **ölçüm** sınıfındadır; girdileri KK8–KK10 ile aygıt envanteridir.

#### Zincir ve Yük

Başlık satırı bağımlılığın büyüklüğünü verir: 80 aygıt tek bir servise sorar, 1348 bağlanma
noktası o yanıta bağlıdır ve o an bağlı 957 uç vardır. Kararın verilebilmesi için aygıt başına
altı kalem aynı anda doğru olmalıdır — paylaşılan sır, servisin sertifikası, ucun kimlik
bilgisi, servisin dizine bağlantısı, politika kaydı ve bölüt eşlemesi. Alandaki toplam 480
kalemin hiçbiri kendiliğinden tutmaz.

Bu altı kalemin dördüncüsü zincirleme bir bağımlılıktır ve önceki iki dersi buraya bağlar.
Servis, ucun kimliğini kendisi bilmez; merkezî dizine sorar. Yani bir kablonun takılması ile bir
portun açılması arasındaki kararın arkasında **iki** kök vardır: aygıt ile servis arasındaki sır
ve servis ile dizin arasındaki bağ. Birincisi bu dersin konusudur, ikincisi ilk derste ölçüldü
ve orada dizin kesintisinde duran sistem sayısı 13'tü; bu ders o listeye 1348 bağlanma noktasını
ekler.

Yük eşit dağılmaz. Kablosuz aygıtlar 44 kalemle aygıt sayısının yarısından fazlasını, 760
noktayla bağlanma noktalarının %56'sını taşır. Uzak erişim ucu yalnız üç aygıttır ama 120 nokta
ve 96 uç barındırır; aygıt başına düşen nokta sayısı 40'tır ve bu, listedeki en yoğun kalemdir.
Tek bir aygıtın yapılandırma hatası, aygıt sayısına değil, taşıdığı nokta sayısına oranlı bir
sonuç üretir.

#### Servis Erişilemezken Dört Davranış

İkinci tablo aynı ağı dört geri düşme davranışıyla koşturur. Kapalı davranışta doğrulanmamış
hiçbir aygıt giremez — yeni yol sıfır, iptal yolu sıfır — ama **957 uç durur**. Bu satır,
listedeki en güvenli ve en pahalı seçimdir; bir doğrulama servisinin kesintisi bütün ağın
kesintisine dönüşür.

Açık davranış tam tersidir: hiçbir meşru uç durmaz, ama 1348 noktanın hepsi doğrulanmamış bir
aygıta açılır ve açılan bağlantı 16 sistemin 16'sına ulaşır. Kritik bölüt davranışı **aynı 1348
yolu** açar; farkı, açılan bağlantının 16 sistemin yalnız ikisine ulaşmasıdır. KK10'un ölçüsü
budur: iki satırın yol sayısı özdeştir, sonucu değildir. Yol sayımını kapsam sütunu olmadan
yazan bir ölçüm, bu iki satırı ayırt edemez.

Önbellek davranışı ilk bakışta ikisinden de iyidir: yeni yol sıfır, duran uç sıfır. Bedeli
üçüncü sütundadır — yetkisi kaldırılmış 43 uç ağa girmeye devam eder. Bu, ilk derste önbellek
penceresi ve ikinci derste bilet ömrü olarak sayılan aynı örüntünün üçüncü görünümüdür.
**Bir kararın saklanması, kararın iptalini saklama süresi kadar geciktirir**; mekanizma değişir,
sayı aynı yerde çıkar.

#### Bugünkü Karışım

Üçüncü tablo davranışın ağ genelinde tek seçilmediğini gösterir. Sekiz aygıt kümesinin dördü
kapalı, ikisi önbellek, biri kritik bölüt, biri açık davranışa ayarlıdır. Toplam 436 yeni yol
açık kalır, 32 iptal yolu geçer ve 271 uç durur.

436 sayısı tek başına okunamaz. Bunun 216'sı kritik bölüte düşen şube anahtarlarından gelir ve
o yollar iki sisteme ulaşır; kalan 220'si açık davranışa ayarlı iki aygıt kümesinden gelir ve
16 sistemin hepsine ulaşır. Kapsamla çarpıldığında aradaki fark açılır: yol sayısı neredeyse
eşitken kritik bölütün 216'sı yalnız iki sisteme, açığın 220'si on altı sistemin hepsine ulaşır.
Konuk kablosuz noktalarının açık bırakılması makul bir
karar olabilir, ama makullüğü ayrı bir bölüte bağlı olmasına dayanır ve tabloda o bölüt
yazılmadığı sürece kararın doğruluğu ölçülemez.

Duran 271 uç da tek bir yerden gelmez: 131'i merkez anahtarlarından, 96'sı uzak erişim ucundan,
44'ü ölçüm toplama anahtarından. Uzak erişim ucunun kapalı davranışa ayarlı olması, servis
kesintisinde sahadaki 96 ucun tamamının bağlantısız kalması demektir. **Geri düşme davranışı bir
güvenlik ayarı gibi görünür; gerçekte kesinti planının parçasıdır.**

#### İkinci Servis Neyi Değiştirir

Geri düşme tablosunun tamamı tek bir varsayıma dayanır: servis erişilemez. İkinci bir doğrulama
servisi eklendiğinde bu varsayım seyrekleşir ve 436 yeni yol, 271 duran uçla birlikte ortadan
kalkar. Kazanç gerçektir, ama bedeli kökün kendisinde ödenir.

İkinci servisin aynı kararları verebilmesi için aynı paylaşılan sırları bilmesi gerekir. Yani
80 aygıtın sırrı iki yerde durur ve kökün bulunduğu yer sayısı ikiye çıkar. İlk derste
çoğaltılan şey bir kayıttı ve kopyalanması kaydın doğruluğunu değiştirmiyordu; burada çoğaltılan
şey bir **sırdır** ve bir sır her kopyalandığında ele geçme yüzeyi büyür. Yenileme faturası da
değişmez biçimde ikiye katlanır: 80 aygıt artı iki servis yapılandırması.

**Erişilebilirlik için çoğaltılan kalem bir kayıtsa maliyet yönetimdir, bir sırsa maliyet
yüzeydir.** İkinci servis kararı bu iki cümle arasında verilir ve kararın doğruluğu, sırların
aygıt başına ayrı tutulup tutulmadığına bağlıdır.

#### Paylaşılan Sır Ele Geçerse

Dördüncü tablo kökün kırılmasını sayar. Bir aygıtın sırrı ele geçerse düşen kalem birdir ve
yenileme o tek aygıta dokunmakla biter. Sorun, aynı sırrın kaç aygıtta kullanıldığıdır: bütün
aygıtlarda aynıysa düşen kalem 80'e çıkar ve yenileme 80 aygıta **elle** dokunmak demektir.
Aygıt başına ayrı sır tutulduğunda aynı olayın yenileme maliyeti birdir.

Servis sertifikası satırı bu dersin ters yönlü kalemidir. Sertifika tek bir kalemdir, ama
değiştiğinde ona güvenen 80 aygıtın yapılandırması güncellenir; sayı 1'den 80'e sertifikanın
kendisinde değil, ona başvuran kalem sayısında büyür. Bu, önceki konuda ölçülen güven zincirinin
buradaki karşılığıdır — aygıtlar sertifikayı bir zincire bağlamak yerine doğrudan tanıyorsa,
sertifika yaşam döngüsünün her adımı 80 kalemlik bir işe dönüşür.

Uç kimlik bilgileri satırı sıfır düşer. Uçların kimliği dizinde durur ve paylaşılan sırla
ilgisizdir; kök kırılması aygıtın **soru sorma hakkını** taklit etmeye yarar, ucun kimliğini
ele geçirmeye değil. İki kökün ayrı olması, kırılmanın da ayrı kalmasını sağlar.

#### Özet

- Erişim katmanındaki 80 aygıt kararı tek bir merkezî servise sorar; 1348 bağlanma noktası ve
  957 bağlı uç o yanıta bağlıdır.
- Karar zinciri aygıt başına 6 kalemdir ve dördüncü kalem servisin dizine bağlantısıdır; bu
  bağ, ilk derste ölçülen kökü buraya zincirler.
- Geri düşme davranışları uçlardadır: kapalı davranış 0 yol açar ama 957 uç durdurur, açık
  davranış 1348 yol açar ve hiçbir ucu durdurmaz.
- Aynı 1348 yol, kritik bölütte 16 sistemin 2'sine, açık davranışta 16'sına ulaşır; yol sayısı
  kapsam sütunu olmadan sıralanamaz.
- Bugünkü karışımda 436 yeni yol açık kalır ve bunların kapsamca ağır olan 220'si iki aygıt
  kümesinden gelir; tek paylaşılan sırrın yenilenmesi 80 aygıta elle dokunmak demektir.

#### Sonraki Adım

Bu ders erişim kararını **ağa girişte** ölçtü. Ağa girmiş bir kullanıcı ise gün boyunca onlarca
uygulamaya bağlanır ve her birinde ayrı ayrı doğrulanması istenmez; bir kez doğrulanır ve o
doğrulama uygulamalara bir **iddia belgesiyle** taşınır. Belgeyi üreten kimlik sağlayıcısının
imzalama anahtarı, bu kez uygulamaların tamamı için tek bir köktür. Sonraki ders federasyonu bu
eksende ölçer: kaç uygulama tek sağlayıcıya bağlı, kök kırılırsa kaç uygulama düşer, iddia
belgesinin ömrü ne kadar ve bir hesabın kapatılması hangi uygulamada ne kadar sürede etkili
oluyor.

### Çoklu Oturum Açma

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/coklu-oturum-acma

Federasyonun iddia belgesi ekseninde ölçülmesi: 18 uygulamanın 15'inin tek sağlayıcıya bağlı olması ve 1562 kullanıcı bağlantısının 90 kaleme dayanması, iptal penceresini belgenin 5 dakikalık ömrünün değil uygulamanın 72 saate çıkan yerel oturumunun belirlemesi, anahtar döndürmenin 5 uygulamada elle kalem ve kesinti üretmesi.

Önceki ders erişim kararını ağa girişte ölçtü: 80 aygıt, 1348 bağlanma noktası, tek servis. Ağa
girmiş bir kullanıcı ise gün boyunca onlarca uygulamaya bağlanır ve her birinde ayrı ayrı
doğrulanması istenmez. **Çoklu oturum açma (single sign-on)** bu isteği karşılar: kullanıcı bir
kez doğrulanır, doğrulamanın sonucu uygulamalara **iddia belgesi (assertion)** olarak taşınır ve
her uygulama belgeyi kendi başına doğrular.

Belgenin üretimi, imza ile yayıncı denetimi, hedef kitle ve süre penceresi ile öznitelikten role
çevrim **Kimlik Doğrulama ve Yetkilendirme** kursunda ölçüldü; burada tekrarlanmaz. Bu dersin
ölçtüğü şey kurum ölçeğidir: kaç uygulama tek sağlayıcıya bağlı, kök kırılırsa kaç uygulama
düşer, belgenin ömrü ne kadar ve bir hesabın kapatılması hangi uygulamada ne kadar sürede
etkili oluyor.

#### Tek Kök, On Beş Uygulama

**KK11:** çoklu oturum açmada uygulama kullanıcıyı kendisi doğrulamaz; kimlik sağlayıcısının
imzaladığı bir belgeyi kabul eder. Sağlayıcının imzalama anahtarı, ona bağlı bütün uygulamaların
**ortak** güven köküdür. **KK12:** iddia belgesinin ömrü ile uygulamanın kendi oturumunun ömrü
ayrı sayılardır; iptalin ne kadar sürede etkili olduğunu belirleyen ikincisidir. **KK13:** kök
anahtarın döndürülmesi, anahtarı kendisi çeken uygulamada bedavadır; elle yüklenen ya da
yapılandırmaya sabitlenen uygulamada bir elle kalem ve bir kesintidir.

KK11 kurumsal kimliğin en büyük tek kazancıdır. Kullanıcı tek bir parola tutar, hesap kapatma
tek yerde yapılır ve çok etmenli doğrulama tek noktada uygulanır. Aynı tasarım, kursun ölçüsünü
en keskin biçimde gösterir: kazancın kaynağı ile kırılganlığın kaynağı **aynı kalemdir**.

#### On Sekiz Uygulama

Aşağıdaki envanter bir **modeldir**: kurgu bölgesel ölçüm ağı kurumunun uygulamaları. Gerçek
bir kurum, gerçek bir sağlayıcı ya da gerçek bir anahtar yoktur.

```js
// coklu/uygulama.mjs — kurgu bolgesel olcum agi kurumunun uygulamalari ve merkezi kimlik
// saglayicisina baglanma bicimi (model): gercek bir kurum, gercek bir saglayici ya da gercek
// bir anahtar yok. Rastgelelik yok.

// KK11: coklu oturum acmada uygulama kullaniciyi kendisi dogrulamaz; kimlik saglayicisinin
// imzaladigi bir iddia belgesini kabul eder. Saglayicinin imzalama anahtari, ona bagli
// butun uygulamalarin ortak guven kokudur.
// Sutunlar: kip = federe (yalniz saglayiciyla girilir), karma (federe ve yerel hesap birlikte),
// yerel (saglayiciya bagli degil); belgeDk = iddia belgesinin gecerlilik suresi, dakika;
// oturumSaat = uygulamanin kendi oturumunu tuttugu sure; anahtar = imzalama anahtarinin
// uygulamaya nasil ulastigi (kume: anahtar kumesinden cekilir; elle: elle yuklenir;
// sabit: parmak izi yapilandirmaya sabitlenmis).
export const UYGULAMA = `
  faturalama            federe   142   5    8    kume
  is-emri               federe   118   5   12    kume
  olcum-arsivi          federe    64   5    4    kume
  rapor-portali         federe   173   5    8    kume
  saha-mobil-uc         federe   140   5   72    elle
  varlik-envanteri      federe    47   5    8    kume
  ik-portali            federe   206   2    2    kume
  gider-onayi           federe    88   5    8    sabit
  belge-arsivi          federe   151   5   24    kume
  egitim-portali        federe    96  10   24    elle
  tedarik-portali       karma     39   5    8    elle
  bakim-plani           karma     55   5   12    kume
  cagri-merkezi         karma    104   5    4    sabit
  bilet-sistemi         federe    77   5    8    kume
  veri-panosu           federe    62   5    2    kume
  bellenim-sunucusu     yerel     11   0    0    yok
  yedekleme-konsolu     yerel      7   0    0    yok
  eski-scada-konsolu    yerel      9   0    0    yok`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s+/);
    return { ad: p[0], kip: p[1], kul: +p[2], belgeDk: +p[3], oturumSaat: +p[4], anahtar: p[5] };
  });

// KK12: iddia belgesinin omru ile uygulamanin kendi oturumunun omru ayri sayilardir; iptalin
// etkili olma suresini belirleyen ikincisidir.
// KK13: kok anahtarin dondurulmesi, anahtari kendisi ceken uygulamada bedava, elle yuklenen
// ya da sabitlenen uygulamada elle kalem ve kesintidir.
export const ZINCIR = ["imzalama anahtari", "anahtar dagitim noktasi", "hedef kitle kaydi",
  "oznitelik eslemesi", "saat penceresi", "yerel oturum kaydi"];
export const federe = (u) => u.kip !== "yerel";
```

```js
// coklu/sayim.mjs — kac uygulama tek saglayiciya bagli, kok kirilirsa kac uygulama duser,
// iddia belgesinin omru ne, iptal kac saatte etkili oluyor ve anahtar dondurme ne tutar.
import { UYGULAMA, ZINCIR, federe } from "./uygulama.mjs";

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 topla = (f, s = UYGULAMA) => s.reduce((a, x) => a + f(x), 0);
const bagli = UYGULAMA.filter(federe);
const yerel = UYGULAMA.filter((u) => !federe(u));

console.log(`${UYGULAMA.length} uygulama, ${bagli.length} tanesi tek saglayiciya bagli, ` +
  `${topla((u) => u.kul, bagli)} kullanici baglantisi, zincir ${ZINCIR.length} kalem`);
console.log(`koke bagli kalem ${bagli.length * ZINCIR.length}, ` +
  `koke bagli olmayan uygulama ${yerel.length} (${topla((u) => u.kul, yerel)} hesap)`);

const A = [-8, 10, 10, 13, 14];
console.log("\n1. baglanma kipine gore");
yaz(A, "kip", "uygulama", "kullanici", "kok kirilsa", "belge dk ort");
for (const k of ["federe", "karma", "yerel"]) {
  const s = UYGULAMA.filter((u) => u.kip === k);
  const dk = s.filter((u) => u.belgeDk > 0);
  yaz(A, k, s.length, topla((u) => u.kul, s), k === "yerel" ? 0 : s.length,
    dk.length ? (topla((u) => u.belgeDk, dk) / dk.length).toFixed(1) : "-");
}

const B = [-14, 10, 11, 15, 16];
console.log("\n2. iptal penceresi: hesap devre disi birakildiktan sonra erisim ne kadar surer");
yaz(B, "pencere", "uygulama", "kullanici", "kalan belge dk", "kalan oturum sa");
for (const [ad, alt, ust] of [["0-4 saat", 0, 4], ["5-12 saat", 5, 12],
  ["13-24 saat", 13, 24], ["25 saat ustu", 25, 999]]) {
  const s = bagli.filter((u) => u.oturumSaat >= alt && u.oturumSaat <= ust);
  yaz(B, ad, s.length, topla((u) => u.kul, s), topla((u) => u.belgeDk, s),
    topla((u) => u.oturumSaat, s));
}
const enUzun = bagli.reduce((a, u) => (u.oturumSaat > a.oturumSaat ? u : a));
console.log(`en uzun pencere ${enUzun.oturumSaat} saat (${enUzun.ad}), ` +
  `belge omru ${enUzun.belgeDk} dakika; oran ${(enUzun.oturumSaat * 60 / enUzun.belgeDk)}x`);

const C = [-8, 10, 11, 12, 12];
console.log("\n3. imzalama anahtarini dondurmek ne tutar");
yaz(C, "anahtar", "uygulama", "kullanici", "elle kalem", "kesinti uyg");
for (const a of ["kume", "elle", "sabit"]) {
  const s = bagli.filter((u) => u.anahtar === a);
  yaz(C, a, s.length, topla((u) => u.kul, s), a === "kume" ? 0 : s.length,
    a === "kume" ? 0 : s.length);
}

const D = [-24, 8, 10, 20];
console.log("\n4. kok kirilirsa dusen kalem");
yaz(D, "kalem", "sayi", "dusen", "yenileme");
const elle = bagli.filter((u) => u.anahtar !== "kume").length;
for (const s of [
  ["saglayiciya bagli uyg", bagli.length, bagli.length, "yeniden guvenilir"],
  ["kullanici baglantisi", topla((u) => u.kul, bagli), topla((u) => u.kul, bagli), "yeniden giris"],
  ["imzalama anahtari", 1, 1, "1 kalem uretilir"],
  ["elle tasinan anahtar", elle, elle, `${elle} uygulama elle`],
  ["yerel hesapli uygulama", yerel.length, 0, "etkilenmez"],
]) yaz(D, ...s);
```

```
18 uygulama, 15 tanesi tek saglayiciya bagli, 1562 kullanici baglantisi, zincir 6 kalem
koke bagli kalem 90, koke bagli olmayan uygulama 3 (27 hesap)

1. baglanma kipine gore
kip       uygulama kullanici  kok kirilsa  belge dk ort
federe          12      1364           12           5.2
karma            3       198            3           5.0
yerel            3        27            0             -

2. iptal penceresi: hesap devre disi birakildiktan sonra erisim ne kadar surer
pencere         uygulama  kullanici kalan belge dk kalan oturum sa
0-4 saat               4        436             17              12
5-12 saat              8        739             40              72
13-24 saat             2        247             15              48
25 saat ustu           1        140              5              72
en uzun pencere 72 saat (saha-mobil-uc), belge omru 5 dakika; oran 864x

3. imzalama anahtarini dondurmek ne tutar
anahtar   uygulama  kullanici  elle kalem kesinti uyg
kume            10       1095           0           0
elle             3        275           3           3
sabit            2        192           2           2

4. kok kirilirsa dusen kalem
kalem                       sayi     dusen            yenileme
saglayiciya bagli uyg         15        15   yeniden guvenilir
kullanici baglantisi        1562      1562       yeniden giris
imzalama anahtari              1         1    1 kalem uretilir
elle tasinan anahtar           5         5     5 uygulama elle
yerel hesapli uygulama         3         0          etkilenmez
```

Sayılar **ölçüm** sınıfındadır; girdileri KK11–KK13 ile uygulama envanteridir.

#### Kaç Uygulama Tek Köke Bağlı

Başlık satırları kapsamı verir: 18 uygulamanın 15'i tek sağlayıcıya bağlıdır, 1562 kullanıcı
bağlantısı o bağın üzerinden geçer ve uygulama başına altı kalem sayıldığında toplam 90 kalem
aynı anda doğru olmalıdır. Kalan üç uygulama sağlayıcıya bağlı değildir ve 27 hesabı kendi
listesinde tutar.

Birinci tablo kipleri ayırır. On iki uygulama yalnız sağlayıcıyla girilir, üçü hem sağlayıcıyı
hem kendi yerel hesabını kabul eder. Karma kip bir kesinti önlemi olarak konur — sağlayıcı
düştüğünde 198 kullanıcı yerel hesapla girebilir. Aynı kalem ters yönde de çalışır: bir kişi
sağlayıcıda kapatıldığında o üç uygulamadaki yerel hesabı kapanmaz. **Karma kip erişilebilirliği
artırır ve iptali eksiltir**; ikisi aynı satırdan çıkar.

Yerel kip aynı örüntünün ilk derste görülen biçimidir. Üç uygulama kökten bağımsızdır ve kök
kırıldığında sıfır düşer; buna karşılık 27 hesabın kapatılması merkezî hiçbir işlemle olmaz.
Kökün dışında kalmak korunmak değildir; ayrı bir kırılma noktası eklemektir. Bu üç uygulamanın
27 hesabı, kurumun kimlik envanterinde hiçbir merkezî raporda görünmez ve kapatma listesi
hazırlanırken elle hatırlanmak zorundadır; hatırlanmadıklarında geride kalan hesap sayısı 27'dir ve bu sayı hiçbir gösterge panosunda okunmaz.

#### Zincirin Altı Kalemi

Uygulama başına sayılan altı kalemin yalnız biri anahtardır; kalan beşi anahtarın çevresinde
duran ve aynı anda tutması gereken kayıtlardır. Anahtar dağıtım noktası, uygulamanın imzalama
anahtarını nereden aldığını söyler; o adres ulaşılamazsa doğrulama yapılamaz. Hedef kitle kaydı,
belgenin **hangi uygulama için** üretildiğini bağlar; yanlış yazıldığında bir uygulamaya
üretilmiş belge başka bir uygulamada kabul edilir.

Öznitelik eşlemesi, sağlayıcıdan gelen alan adlarını uygulamanın beklediği alanlara çevirir ve
yanlış eşleme kimliği doğru, yetkiyi yanlış kurar. Saat penceresi bu konuda üçüncü kez çıkar:
belgenin beş dakikalık ömrü iki tarafın saatine göre ölçülür ve saatler ayrıldığında geçerli
belge reddedilir. Altıncı kalem, uygulamanın kendi oturum kaydıdır ve bir sonraki bölümün
tamamı onun üzerinedir.

On beş uygulama için toplam 90 kalem, kurumun tek bir kişiyi tek bir uygulamaya sokabilmesi için
doğru tutması gereken bağımsız kayıt sayısıdır. Bu kalemlerin **seksen dokuzu** kriptografik
değildir; yalnız biri, listenin başındaki anahtar, hem kriptografik olan hem kırılma yüzeyini
oluşturandır. **Kök tek kalemdir, kökün
çevresi seksen dokuz kalemdir** ve işletim yükünün tamamı ikincisindedir.

#### İptal Penceresi

İkinci tablo bu dersin merkezidir. İddia belgesinin ömrü uygulamaların çoğunda beş dakikadır ve
bu sayı çoğu kez "kimlik sağlayıcısıyla bağ beş dakikada bir tazeleniyor" diye okunur. Öyle
değildir. Belge yalnız **girişi** taşır; uygulama girişi kabul ettikten sonra kendi oturumunu
açar ve sonraki her istekte belgeye değil o oturuma bakar.

Bu yüzden bir hesap devre dışı bırakıldığında erişimin bitme süresini belirleyen sayı, belgenin
ömrü değil uygulamanın oturum ömrüdür. Dört uygulamada bu süre dört saatin altındadır ve 436
kullanıcıyı kapsar; sekiz uygulamada beş ile on iki saat arasındadır. En uzun pencere saha mobil
ucundadır: **72 saat**. Aynı uygulamada belgenin ömrü beş dakikadır; iki sayı arasındaki oran
864 katıdır.

Sayının anlamı doğrudandır. Kurumdan ayrılan ya da hesabı askıya alınan bir kişi, merkezî depoda
kaydı kapatılmış olmasına rağmen o uygulamada üç gün daha çalışmaya devam eder ve hiçbir kayıt
bunu hata olarak göstermez. **Federasyonun iptal hızı, en uzun oturum ömrünü tutan uygulamanın
hızıdır**; ortalamalar bu ölçüde bir şey söylemez. Kurum ölçeğinde iptali hızlandırmanın yolu
belgeyi kısaltmak değil, uygulamaların oturum ömrünü kısaltmak ya da düzenli bir yeniden
doğrulama istemektir; ikisi de kullanıcıya günde birkaç ek adım olarak yazılır.

#### Anahtarı Döndürmenin Bedeli

Üçüncü tablo KK13'ü sayar. On uygulama imzalama anahtarını sağlayıcının yayımladığı anahtar
kümesinden kendisi çeker; sağlayıcı yeni bir anahtar eklediğinde bu uygulamalarda hiçbir işlem
yapılmaz ve elle kalem sıfırdır. Kalan beş uygulamada anahtar ya elle yüklenmiştir ya da parmak
izi yapılandırmaya sabitlenmiştir; döndürme bu beşinde birer elle kalem ve birer kesinti üretir.

Beş sayısı 1562 kullanıcının 467'sini kapsar. Döndürmenin planı bu beş uygulamanın etrafında
kurulur: yeni anahtar yayımlanır, beş uygulamada yapılandırma güncellenir, sonra eski anahtar
kaldırılır. Bu üç adımın ortasında bir pencere vardır ve pencere kapanmadan eski anahtar
düşürülürse beş uygulamada giriş durur.

Sayı, kurumun kökü ne sıklıkta yenilediğini belirler. Sıfır elle kalemli bir portföyde anahtar
döndürme rutin bir işlemdir; beş elle kalemli bir portföyde planlanmış bir bakım penceresi
gerektirir ve ertelenir. **Kök yenileme sıklığı, kökün özelliği değil, ona bağlı kalemlerin
otomasyon oranının özelliğidir.**

#### Kök Kırılırsa

Dördüncü tablo kırılmayı sayar. İmzalama anahtarı ele geçtiğinde sağlayıcıya bağlı 15
uygulamanın 15'i ve 1562 kullanıcı bağlantısının tamamı düşer. Belge, hangi kullanıcı için
üretildiğini kendisi söyler; anahtarı bilen taraf istediği kullanıcı için geçerli belge
üretebilir ve bunu yapmak için **hiçbir parolaya, hiçbir ikinci etmene ihtiyaç duymaz**. Bu,
ikinci derste bilet veren servisin anahtarında görülen örüntünün uygulama katmanındaki
karşılığıdır.

Yenileme faturası şaşırtıcı biçimde küçüktür: üretilen anahtar bir kalemdir. Faturanın gerçek
kalemi, yeni anahtarın 15 uygulamaya ulaştırılmasıdır — onunda otomatik, beşinde elle. Kırılma
anında beş elle kalem, bakım penceresi beklenerek değil hemen yapılır ve o beş uygulamada
kesinti kaçınılmazdır.

Üç yerel uygulama yine sıfır düşer. Kök kırılmasında bu bir avantaj gibi görünür, ama aynı
kırılmada kurumun yapması gereken ilk iş 1562 bağlantıyı yeniden doğrulamaktır ve o üç
uygulamanın 27 hesabı bu işlemin dışında kalır: ne düşerler ne de yenilenirler. Merkezî
denetimin dışında olmak, olayın dışında olmak değildir. Kırılma sonrası yapılan envanterde bu üç
uygulama listeye hiç girmez ve girmediği için de yeniden gözden geçirilmez; kökün kapsamı
dışında kalan kalem, kök kırılmasının **soruşturmasının** da dışında kalır.

#### Özet

- 18 uygulamanın 15'i tek kimlik sağlayıcısına bağlıdır; 1562 kullanıcı bağlantısı 90 kalemlik
  bir zincire dayanır.
- Karma kip erişilebilirliği artırır ve iptali eksiltir: sağlayıcı düştüğünde 198 kullanıcı
  girebilir, sağlayıcıda kapatılan hesap ise o uygulamalarda açık kalır.
- İptalin etkili olma süresini belgenin 5 dakikalık ömrü değil uygulamanın oturum ömrü belirler;
  en uzun pencere 72 saattir ve iki sayının oranı 864 katıdır.
- İmzalama anahtarını döndürmek 10 uygulamada sıfır, 5 uygulamada birer elle kalem ve birer
  kesinti tutar; kök yenileme sıklığını bu oran belirler.
- Kök kırıldığında 15 uygulama ve 1562 bağlantı düşer; üretilen yeni anahtar 1 kalemdir ama 5
  uygulamaya elle taşınır.

#### Sonraki Adım

Bu ders tek bir doğrulamanın 15 uygulamaya taşındığını saydı; o tek doğrulamanın kendisi ise hâlâ
bir parolaya dayanıyor. Parola bilinirse 1562 bağlantının tamamı tek adımda açılır. Bu yüzden
kurumsal girişe ikinci bir etmen eklenir ve eklenen etmenin **hangi yolu kapattığı** ayrı bir
sorudur: her etmen türü aynı yolları kapatmaz ve hiçbiri hepsini kapatmaz. Sonraki ders etmen
türlerini kapattıkları yol cinsinden ölçer ve atlatma yollarının kaçının açık kaldığını sayar.

### Çok Etmenli Doğrulama

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/cok-etmenli-dogrulama

Etmen türlerinin kapattığı yol cinsinden ölçülmesi: 10 yollu bir kümede hiçbir etmen türünün 6'dan fazlasını kapatmaması, 4 yolun altı türün hiçbiriyle kapanmaması, aynı yolu kapatan iki etmeni birlikte kullanmanın kapanan yolu artırmaması ve kapatmanın 214 kişi için 428 ile 856 arasında kayıt kalemi, 9 ile 31 arası kurtarma başvurusu ve 41'e kadar dışarıda kalan uç tutması.

Önceki ders tek bir doğrulamanın 15 uygulamaya taşındığını ve o tek doğrulamanın 1562 bağlantıyı
açtığını saydı. Doğrulamanın kendisi hâlâ bir parolaya dayanıyordu: parola bilinirse bağlantıların
tamamı tek adımda açılır. **Çok etmenli doğrulama (multi-factor authentication)** bu tek adımı
ikiye böler ve girişi ikinci bir kanıta bağlar.

Etmen sınıflarının bağımsızlığı, zaman tabanlı kodun türetilmesi ve kurtarma kodlarının
saklanması **Kimlik Doğrulama ve Yetkilendirme** kursunda ölçüldü; burada tekrarlanmaz. Bu ders
tek bir soruyu sorar: hangi etmen türü **hangi yolu** kapatıyor ve kaç yol açık kalıyor. Ölçülen
şey bir yolun nasıl yürüneceği değil, hangi türün onu kapatıp kapatmadığıdır; bu dersin hiçbir
yerinde işleyen bir adım dizisi yoktur. Böyle bir denemenin yazılı yetki ve tanımlı kapsam
olmadan yapılması hem yasadışı hem meslek dışıdır.

#### Etmen Bir Yol Kümesini Daraltır

**KK14:** bir etmen türü, hesap ele geçirme yollarının bir **alt kümesini** kapatır; kapattığı
küme türünün özelliğidir, gücünün değil. **KK15:** hiçbir etmen türü bütün yolları kapatmaz;
kapanmayan yollar etmenin değil, kayıt ve kurtarma süreçlerinin üzerindedir. **KK16:** aynı yolu
kapatan iki etmeni birlikte kullanmak kapanan yol sayısını artırmaz, yalnız bedeli artırır.

Ölçüm üç sütunla yapılır. Birincisi kapanan yol sayısı, ikincisi açık kalan yol sayısı,
üçüncüsü bedeldir. Bedel üç kalemde okunur: kişi başına kayıt adımı, yılda açılan kayıp etmen
başvurusu ve etmeni taşıyamadığı için dışarıda kalan uç sayısı. **Bedeli yazılmayan savunma
ölçülmemiş sayılır**; bu kural M24 boyunca sürer ve burada da geçerlidir.

#### On Yol, Altı Etmen Türü

Aşağıdaki yol kümesi bir **modeldir**: kurgu bölgesel ölçüm ağı kurumunda 214 kişilik bir hesap
kümesi varsayılır. Gerçek bir kurum, gerçek bir hesap ve işleyen hiçbir adım dizisi yoktur.

```js
// etmen/yol.mjs — hesap ele gecirme yollari ile etmen turlerinin kapattigi yol (model):
// gercek bir kurum, gercek bir hesap ya da isleyen bir adim dizisi yok; yalnizca hangi etmen
// turunun hangi yolu kapatip kapatmadigi sayilir. Rastgelelik yok.

// KK14: bir etmen turu bir yol kumesinin bir alt kumesini kapatir; kapattigi yol turunun
// ozelligidir, gucunun degil. KK15: hicbir etmen turu butun yollari kapatmaz; kapanmayan
// yollar etmenin degil, kayit ve kurtarma sureclerinin ustundedir.
// Sinif sutunu, yolun hangi asamada isledigini soyler.
export const YOL = `
  parola-yeniden-kullanim      kimlik-bilgisi
  parola-tahmini               kimlik-bilgisi
  parola-toplayan-sayfa        kimlik-bilgisi
  gercek-zamanli-araci-sayfa   dogrulama-ani
  onay-yorgunlugu              dogrulama-ani
  kanal-ele-gecirme            etmen-kanali
  yedek-kurtarma-kanali        kurtarma
  dogrulama-sonrasi-oturum     dogrulama-sonrasi
  kayit-aninin-ele-gecmesi     kayit
  surec-uzerinden-sifirlama    surec`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    return { ad: p[0], sinif: p[1] };
  });

// kapatir = o etmen turunun kapattigi yol indeksleri; kayit = kisi basina kayit adimi;
// kurtarma = yilda 214 kisi icin acilan kayip etmen basvurusu; disarida = etmeni
// tasiyamayan uc sayisi.
export const ETMEN = {
  "parola":          { kapatir: [], kayit: 1, kurtarma: 0, disarida: 0 },
  "sms-kodu":        { kapatir: [0, 1, 2, 4], kayit: 2, kurtarma: 18, disarida: 6 },
  "zaman-kodu":      { kapatir: [0, 1, 2, 4, 5], kayit: 3, kurtarma: 31, disarida: 12 },
  "onay-bildirimi":  { kapatir: [0, 1, 2, 5], kayit: 3, kurtarma: 27, disarida: 24 },
  "eslesmeli-onay":  { kapatir: [0, 1, 2, 4, 5], kayit: 3, kurtarma: 27, disarida: 24 },
  "donanim-etmeni":  { kapatir: [0, 1, 2, 3, 4, 5], kayit: 4, kurtarma: 9, disarida: 41 },
};

export const KISI = 214;
export const kapanan = (...t) => new Set(t.flatMap((x) => ETMEN[x].kapatir));
```

```js
// etmen/sayim.mjs — her etmen turu kac yol kapatiyor, kaci acik kaliyor, hangi yollar
// hicbir etmenle kapanmiyor ve kapatmanin bedeli kayit, kurtarma ve disarida kalan uc
// cinsinden ne tutuyor.
import { YOL, ETMEN, KISI, kapanan } from "./yol.mjs";

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 tur = Object.keys(ETMEN);

console.log(`${YOL.length} yol, ${tur.length} etmen turu, ${KISI} kisi`);

const A = [-18, 9, 8, 10, 11, 10];
console.log("\n1. etmen turu basina kapanan ve acik kalan yol");
yaz(A, "etmen", "kapanan", "acik", "kayit kal", "kurtarma", "disarida");
for (const t of tur) {
  const e = ETMEN[t];
  yaz(A, t, e.kapatir.length, YOL.length - e.kapatir.length,
    KISI * e.kayit, e.kurtarma, e.disarida);
}

const B = [-28, -18, 10, 12];
console.log("\n2. yol basina: kac etmen turu kapatiyor");
yaz(B, "yol", "sinif", "kapatan", "acik kalan");
for (let i = 0; i < YOL.length; i++) {
  const k = tur.filter((t) => ETMEN[t].kapatir.includes(i));
  yaz(B, YOL[i].ad, YOL[i].sinif, k.length, tur.length - k.length);
}
const hic = YOL.filter((_, i) => tur.every((t) => !ETMEN[t].kapatir.includes(i)));
console.log(`hicbir etmenin kapatmadigi yol ${hic.length}/${YOL.length}: ` +
  hic.map((y) => y.sinif).join(", "));

const C = [-34, 9, 8, 11];
console.log("\n3. iki etmen birlikte kullanilirsa");
yaz(C, "birlesim", "kapanan", "acik", "kayit kal");
for (const [a, b] of [["sms-kodu", "zaman-kodu"], ["zaman-kodu", "eslesmeli-onay"],
  ["onay-bildirimi", "zaman-kodu"], ["eslesmeli-onay", "donanim-etmeni"]]) {
  const k = kapanan(a, b);
  yaz(C, `${a} + ${b}`, k.size, YOL.length - k.size,
    KISI * (ETMEN[a].kayit + ETMEN[b].kayit));
}

const D = [-18, 9, 11, 14, 14];
console.log("\n4. kapatilan yol basina bedel");
yaz(D, "etmen", "kapanan", "kayit/yol", "kurtarma/yol", "disarida/yol");
for (const t of tur.filter((x) => ETMEN[x].kapatir.length > 0)) {
  const e = ETMEN[t], n = e.kapatir.length;
  yaz(D, t, n, (KISI * e.kayit / n).toFixed(1), (e.kurtarma / n).toFixed(1),
    (e.disarida / n).toFixed(1));
}
```

```
10 yol, 6 etmen turu, 214 kisi

1. etmen turu basina kapanan ve acik kalan yol
etmen               kapanan    acik kayit kal   kurtarma  disarida
parola                    0      10       214          0         0
sms-kodu                  4       6       428         18         6
zaman-kodu                5       5       642         31        12
onay-bildirimi            4       6       642         27        24
eslesmeli-onay            5       5       642         27        24
donanim-etmeni            6       4       856          9        41

2. yol basina: kac etmen turu kapatiyor
yol                         sinif                kapatan  acik kalan
parola-yeniden-kullanim     kimlik-bilgisi             5           1
parola-tahmini              kimlik-bilgisi             5           1
parola-toplayan-sayfa       kimlik-bilgisi             5           1
gercek-zamanli-araci-sayfa  dogrulama-ani              1           5
onay-yorgunlugu             dogrulama-ani              4           2
kanal-ele-gecirme           etmen-kanali               4           2
yedek-kurtarma-kanali       kurtarma                   0           6
dogrulama-sonrasi-oturum    dogrulama-sonrasi          0           6
kayit-aninin-ele-gecmesi    kayit                      0           6
surec-uzerinden-sifirlama   surec                      0           6
hicbir etmenin kapatmadigi yol 4/10: kurtarma, dogrulama-sonrasi, kayit, surec

3. iki etmen birlikte kullanilirsa
birlesim                            kapanan    acik  kayit kal
sms-kodu + zaman-kodu                     5       5       1070
zaman-kodu + eslesmeli-onay               5       5       1284
onay-bildirimi + zaman-kodu               5       5       1284
eslesmeli-onay + donanim-etmeni           6       4       1498

4. kapatilan yol basina bedel
etmen               kapanan  kayit/yol  kurtarma/yol  disarida/yol
sms-kodu                  4      107.0           4.5           1.5
zaman-kodu                5      128.4           6.2           2.4
onay-bildirimi            4      160.5           6.8           6.0
eslesmeli-onay            5      128.4           5.4           4.8
donanim-etmeni            6      142.7           1.5           6.8
```

Sayılar **ölçüm** sınıfındadır; girdileri KK14–KK16 ile yol kümesidir.

#### Kapanan Yol, Açık Kalan Yol

Birinci tablo altı türü aynı yol kümesi üzerinde koşturur. Parola tek başına sıfır yol kapatır;
on yolun onu da açıktır. İkinci etmen eklendiğinde kapanan yol sayısı dörde ya da beşe çıkar ve
**hiçbir türde altıyı geçmez**. En kapsamlı tür olan kaynağa bağlı donanım etmeni altı yol
kapatır ve dördünü açık bırakır.

Kapanan yolların ilk üçü her türde aynıdır: parolanın başka bir yerden bilinmesi, tahmin
edilmesi ya da yalnız parola toplayan bir sayfaya yazılması. İkinci etmen bu üçünü kapatır,
çünkü üçünde de eksik olan şey ikinci kanıttır. Kurumsal girişte çok etmenli doğrulamanın
sağladığı asıl kazanç bu üç satırdır ve tür seçimi bu üçü için fark etmez.

Fark, dördüncü satırdan sonra başlar. Gerçek zamanlı aracı sayfayı — kullanıcının girdiği kodu
aynı anda gerçek girişe ileten bir aracı — yalnız **bir** tür kapatır: kaynağa bağlı donanım
etmeni. Bunun nedeni türün daha güçlü olması değil, ürettiği kanıtın **bağlandığı adrese** bağlı
olmasıdır; başka bir adrese sunulduğunda kanıt geçerli değildir. Bir kodu okuyup yazan her tür,
kodu kimin istediğini sınayamaz.

Beşinci ve altıncı satırlar iki türü tek tek düşürür. Onay yorgunluğu — istenmeden gelen art
arda onay istemleri — yalnız anında onay bildiriminde açıktır; kod isteyen türlerde böyle bir
istem hiç oluşmaz. Kanal ele geçirme ise yalnız kısa ileti kodunda açıktır, çünkü kanalın
kendisi etmenin taşıyıcısıdır. **Her tür kendi mekaniğinden doğan bir yol açar** ve bu yol, o
türün kapattığı yollar kadar tür özelliğidir.

Dördüncü satırın ağırlığı önceki dersten gelir. Kurumda 15 uygulama tek kimlik sağlayıcısına
bağlıdır; ikinci etmen o sağlayıcının giriş sayfasında bir kez uygulanır ve orada kapanan yol 15
uygulamanın hepsi için kapanır. Aynı biçimde, orada **açık kalan** yol da 15 uygulamanın hepsi
için açık kalır. Merkezîleşmenin bu dersteki karşılığı budur: tür seçimi tek bir noktada
yapılır ve sonucu 1562 bağlantıya çarpılır. Dört ile altı arasındaki iki yolluk fark, tek bir
hesapta iki yol değil, kurumun tamamında iki yoldur.

#### Hiçbir Etmenin Kapatmadığı Dört Yol

İkinci tablo bu dersin en önemli sonucudur. On yolun dördünü altı türün **hiçbiri** kapatmaz:
yedek kurtarma kanalı, doğrulama sonrası oturumun kullanılması, kayıt anının ele geçmesi ve
süreç üzerinden sıfırlama. Dördü de etmenin dışındadır.

Sınıf sütunu nedeni verir. Kurtarma yolu, etmen kaybedildiğinde devreye giren yedek kanaldır ve
o kanal ikinci etmenden zayıfsa hesabın gücü yedek kanalın gücüne iner. Doğrulama sonrası
oturum, giriş tamamlandıktan sonra üretilen nesnedir; etmen o noktada işini bitirmiştir ve
önceki dersteki 72 saatlik oturum penceresi tam olarak bu satırın büyüklüğüdür. Kayıt anı, ikinci
etmenin hesaba **ilk kez bağlandığı** andır: o an yanlış kişiye bağlanmışsa, etmen sonraki her
girişte yanlış kişiyi doğru sayar. Süreç üzerinden sıfırlama ise teknik bir kalem değildir;
etmeni sıfırlayabilen bir insanın var olmasıdır.

**Çok etmenli doğrulamanın gücü, en zayıf kurtarma yolunun gücüdür.** Etmen türü seçimi ilk altı
satırı belirler; son dört satırı belirleyen şey kayıt ve kurtarma süreçlerinin nasıl yazıldığıdır
ve bu, satın alınabilecek bir kalem değildir.

Dört satırın ortak bir özelliği daha vardır: hiçbiri giriş ekranında görünmez. Kapanan altı yol
bir denetim listesinde işaretlenebilir ve raporlanabilir; kapanmayan dördü ancak süreç
belgelerinde aranarak bulunur. Bir kurumun çok etmenli doğrulama kapsamını yüzde yüz olarak
raporlaması, bu dört satırın hiç sorulmadığı anlamına gelir. Kapsam raporu en iyi durumda altı yolu ölçer, on yolu değil; aradaki dört satırlık fark rapora hiç yazılmaz ve ölçülmediği için de kimseye ait değildir.

#### Bu Mekanizmanın Güven Kökü

Kursun birinci sütunu burada beklenmedik bir yerdedir. Çok etmenli doğrulamanın güven kökü
etmenin kendisi değil, **etmenin kişiye bağlandığı kayıt anıdır**. Kayıt sırasında kurumun
elinde, kaydı yapanın gerçekten o kişi olduğuna dair bir kanıt bulunmalıdır; bu kanıt yoksa
sonraki her giriş kusursuz çalışır ve yanlış kişiyi doğru sayar.

Kökten kullanıma uzanan zincir dört kalemdir: kayıt anındaki kimlik kanıtı, etmenin hesaba
bağlanma kaydı, o bağın değiştirilmesini yöneten yetki ve kurtarma kaydı. Dördü de dizinde
durur; yani bu dersin kökü, ilk derste ölçülen deponun bütünlüğüne dayanır. Depo bütünlüğü
kırıldığında yenilenmesi gereken 646 kalemin arasında bu dört kalem de vardır ve yenilemeleri
en pahalısıdır — bir etmen bağını yenilemek, kişinin fiziksel olarak yeniden tanınmasını
gerektirir.

İkinci tablodaki kayıt satırının hiçbir etmenle kapanmamasının nedeni budur. **Bir mekanizma
kendi kökünü doğrulayamaz**; etmen, kendisinin doğru kişiye bağlandığını sınayacak bir kalem
taşımaz. Kaydın doğruluğu, mekanizmanın dışındaki bir sürecin çıktısıdır ve o süreç bu kursun
ölçtüğü hiçbir anahtara dayanmaz.

#### İki Etmen Bir Etmenden İyi Değildir

Üçüncü tablo KK16'yı sayar. Kısa ileti kodu ile zaman tabanlı kodun birlikte kullanılması beş
yol kapatır; zaman tabanlı kod tek başına da beş yol kapatır. Kapanan yol aynıdır, kayıt kalemi
642'den 1070'e çıkar. Eşleşmeli onay ile zaman tabanlı kodun birleşimi de beşte kalır.

Neden basittir: iki tür aynı alt kümeyi kapatıyorsa birleşimleri o alt kümedir. Tablodaki hiçbir
birleşim, içerdiği en geniş türün tek başına kapattığından fazlasını kapatmaz: eşleşmeli onay ile
donanım etmeni altı kapatır, donanım etmeni tek başına da altı kapatır. **Etmen çoğaltmak yol
kapatmaz; kapattığı küme farklı olan bir tür eklemek kapatır.**

Bu, iki etmenin hiçbir işe yaramadığı anlamına gelmez. İkinci bir tür, birincinin kullanılamadığı
durumda erişimi sürdürür ve kurtarma başvurusu sayısını düşürür — yani birinci tablodaki
kurtarma sütununa yazılır, kapanan yol sütununa değil. İki sütunu ayırmayan bir karar, bedeli
iki katına çıkarıp kapanan yolu sabit bırakır.

#### Kapatmanın Bedeli

Dördüncü tablo bedeli kapatılan yol başına böler. Kısa ileti kodu kapattığı yol başına 107 kayıt
kalemi ve 1,5 dışarıda kalan uç tutar; donanım etmeni 142,7 kayıt kalemi ve 6,8 uç tutar.
Dışarıda kalan uç sayısı donanım etmeninde 41'e çıkar ve bu, ilk derste sayılan eski konsollarla
saha aygıtlarının bir bölümüdür.

Tablonun kapsamadığı bir kalem daha vardır ve bedelden çok kapsama yazılır. Sayılan 214 hesap
kişilerin hesaplarıdır; ikinci derste sayılan 21 servis hesabı bu ölçümün dışındadır. Bir hizmet
hesabının önüne ikinci etmen konamaz, çünkü karşısında onay verecek kimse yoktur. Kurumun
kimlik yüzeyinde çok etmenli doğrulama **etkileşimli girişleri** kapsar ve etkileşimli olmayan
her hesap, on yolun ilk üçüne açık kalır. Kapsama oranı 214/235'tir ve dışarıda kalan 21 hesabın
her biri, ikinci derste ölçüldüğü gibi bir servisin tamamını temsil eder.

Kurtarma sütunu ters yönde okunur. Donanım etmeninde yılda dokuz başvuru açılır; zaman tabanlı
kodda otuz bir. Aradaki fark, aygıt değiştirmenin sıklığından gelir ve her başvuru ikinci
tablodaki kurtarma yolunu bir kez daha açar. **Kurtarma başvurusu sayısı, kapatılamayan dördüncü
yolun yılda kaç kez kullanıldığının ölçüsüdür**; bu yüzden düşük kurtarma sayısı, kapanan yol
sayısı kadar önemlidir.

#### Özet

- Bir etmen türü on yollu kümenin bir alt kümesini kapatır; hiçbir tür 6'dan fazlasını
  kapatmaz ve parola tek başına 0 kapatır.
- İlk üç yol her türde kapanır; dördüncü yolu yalnız kaynağa bağlı donanım etmeni kapatır,
  çünkü ürettiği kanıt sunulduğu adrese bağlıdır.
- Her tür kendi mekaniğinden bir yol açar: onay yorgunluğu bildirim türünde, kanal ele geçirme
  kısa ileti türünde açık kalır.
- On yolun 4'ü altı türün hiçbiriyle kapanmaz; dördü de kayıt, kurtarma, doğrulama sonrası
  oturum ve süreç sınıfındadır.
- Aynı kümeyi kapatan iki etmeni birlikte kullanmak kapanan yolu artırmaz, kayıt kalemini
  642'den 1284'e çıkarır; kazanç yalnız kurtarma sütununa yazılır.

#### Sonraki Adım

Bu ders girişin kendisini ölçtü. Girişten sonra kullanıcının **ne yapabildiği** ise başka bir
mekanizmayla belirlenir: kurum, binlerce makinede hangi ayarın geçerli olacağını tek bir yerden
yazar ve makineler bu yazılanı düzenli aralıklarla çeker. Yazılan ile uygulanan arasındaki fark,
bu dersin yol kümesindeki kalemlerin bir bölümünü doğrudan etkiler. Sonraki ders merkezî
dayatmayı yayılma cinsinden ölçer: politika kaç makineye kaç turda ulaşıyor, ulaşmayan kalem kaç
ve yerel geçersiz kılma kaç yol açıyor.

### Grup Politikaları ve Yetki Yönetimi

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/grup-politikalari-ve-yetki-yonetimi

Merkezî dayatmanın yayılma cinsinden ölçülmesi: 325 makinenin 319'unun politika çekmeye ayarlı olması ama 24 saatlik pencerede yalnız 295'ine ulaşması, ilk turda kapsamanın %51,4'te kalması, 30 makinenin politikayı hiç almaması ve 67 makinede yerel geçersiz kılmanın 12 ayarın 5'ini düşürerek 335 yol açması.

Önceki ders girişin kendisini ölçtü ve kapanmayan dört yolun etmenin dışında olduğunu saydı.
Giriş tamamlandıktan sonra kullanıcının ne yapabildiği ise ayrı bir mekanizmayla belirlenir:
kurum, binlerce makinede hangi ayarın geçerli olacağını tek bir yerden yazar ve makineler bunu
düzenli aralıklarla çeker. Bu mekanizmaya **grup politikası (group policy)** denir.

Yetkilendirme modellerinin karşılaştırılması — rol temelli, öznitelik temelli, kaynak temelli —
**Kimlik Doğrulama ve Yetkilendirme** ile **Bulut Yönetişimi, Güvenlik ve Maliyet** kurslarında
ölçüldü; burada tekrarlanmaz. Bu dersin ölçtüğü şey tek bir sorudur: yazılan ile uygulanan
arasındaki fark. Politika kaç makineye kaç turda ulaşıyor, ulaşmayan kalem kaç ve yerel
geçersiz kılma kaç yol açıyor. Bu üç sayı, merkezî yönetimin gerçekte ne kadarını yönettiğini
verir ve üçü de merkezî konsolun gösterdiği sayıdan küçüktür.

#### Yazmak ile Uygulanmak

**KK17:** merkezî politika bir yazma işlemi değil, bir **yayılma sürecidir**; yazıldığı an değil,
makinenin bir sonraki turda çektiği an etkili olur. **KK18:** yayılmanın dışında kalan makine
politikayı hiç almaz ve bunu hiçbir hata kaydı bildirmez — merkezde politika "uygulandı" görünür.
**KK19:** bir ayarın yerel olarak geçersiz kılınabilmesi, o ayarın kapattığı yolu makine başına
yeniden açar; merkezî dayatmanın kapsamı, geçersiz kılınamayan ayar sayısıyla ölçülür.

Bu üç varsayım, kursun üç sütununu bu mekanizmaya çevirir. Güven kökü politika deposunun
bütünlüğü ile dağıtım kanalıdır; zincir, politikanın makineye ulaşmasından uygulanmasına kadarki
kalemlerdir; kırılma, kökün değişmesi durumunda kaç makinenin yanlış ayarı **sessizce** almasıdır.

#### Üç Yüz Yirmi Beş Makine

Aşağıdaki envanter ve yayılma bir **modeldir**: kurgu bölgesel ölçüm ağı kurumunun makineleri.
Gerçek bir kurum, gerçek bir makine ya da gerçek bir politika yoktur. Rastgelelik kendi
üretecimizle üretilir ve tohum görünürdür; çıktı koşumdan koşuma aynıdır.

```js
// politika/dagitim.mjs — merkezi politikanin makinelere yayilmasi (model): kurgu bolgesel
// olcum agi kurumunun makine envanteri, yenileme turu ve cevrimici olma orani. Gercek bir
// kurum, gercek bir makine ya da gercek bir politika yok.

// KK17: merkezi politika bir yazma islemi degil, bir yayilma surecidir; yazildigi an degil,
// makinenin bir sonraki turda cektigi an etkili olur. KK18: yayilmanin disinda kalan makine
// politikayi hic almaz ve bunu hicbir hata kaydi bildirmez.
// Sutunlar: adet = makine sayisi; yonetilen = politikayi cekmeye ayarli mi; p = bir turda
// cevrimici olma orani (yuzde); kapali = pencerede hic acilmayan makine; yerelYonetici =
// uzerinde yerel yonetici hesabi bulunan makine sayisi.
export const SINIF = `
  sube-is-istasyonu     96   evet   82    3   11
  saha-dizustu         140   evet   24   17   38
  depo-terminali        18   evet   61    1    4
  sunucu                21   evet   95    0    6
  olcum-toplayici       44   evet   88    2    2
  eski-konsol            6   hayir   0    6    6`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s+/);
    return { ad: p[0], adet: +p[1], yonetilen: p[2] === "evet", p: +p[3],
      kapali: +p[4], yerelYonetici: +p[5] };
  });

// KK19: bir ayarin yerel olarak gecersiz kilinabilmesi, o ayarin kapattigi yolu makine basina
// yeniden acar; merkezi dayatmanin kapsami, gecersiz kilinamayan ayar sayisiyla olculur.
// Politika 12 ayar tasir; her ayar bir yol kapatir. "yerel" sutunu, ayarin makinede yerel
// yonetici tarafindan gecersiz kilinip kilinamadigidir.
export const AYAR = `
  ekran-kilidi-suresi        yerel
  yerel-yonetici-uyeligi     merkezi
  imzasiz-betik-engeli       yerel
  eski-protokol-kapatma      merkezi
  gunluk-yonlendirme         yerel
  disk-sifreleme-zorunlu     merkezi
  yazilim-kaynagi-kisiti     merkezi
  uzak-masaustu-kapali       yerel
  parola-uzunlugu            merkezi
  otomatik-baglama-kapali    yerel
  guvenlik-duvari-acik       merkezi
  onbellekli-giris-suresi    merkezi`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    return { ad: p[0], yerel: p[1] === "yerel" };
  });

export const TUR = 16;      // 24 saatlik pencerede 90 dakikalik yenileme turu sayisi
export const TOHUM = 20250131;
```

```js
// politika/sayim.mjs — politika kac makineye kac turda ulasiyor, ulasmayan kalem kac ve
// yerel gecersiz kilma kac yol aciyor.
import { SINIF, AYAR, TUR, TOHUM } from "./dagitim.mjs";

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 topla = (f, s = SINIF) => s.reduce((a, x) => a + f(x), 0);
// Kendi uretecimiz; tohum gorunur, kosumdan kosuma ayni diziyi verir.
const uret = (tohum) => { let s = tohum >>> 0;
  return () => (s = (s * 1103515245 + 12345) >>> 0) / 4294967296; };

const makine = topla((s) => s.adet);
const yonetilen = topla((s) => (s.yonetilen ? s.adet : 0));
console.log(`${makine} makine, ${yonetilen} yonetilen, ${makine - yonetilen} yonetim disi; ` +
  `${AYAR.length} ayar, ${TUR} tur, tohum ${TOHUM}`);

// Her makine icin politikayi ilk aldigi tur; kapali makineler hic almaz.
const rnd = uret(TOHUM);
const alindi = [];
for (const s of SINIF) {
  for (let i = 0; i < s.adet; i++) {
    let tur = 0;
    if (s.yonetilen && i >= s.kapali) {
      for (let t = 1; t <= TUR; t++) {
        if (rnd() * 100 < s.p) { tur = t; break; }
      }
    } else { for (let t = 1; t <= TUR; t++) rnd(); }
    alindi.push({ sinif: s.ad, tur });
  }
}

const A = [-20, 8, 10, 10, 10, 9];
console.log("\n1. sinif basina kapsama (24 saatlik pencere sonunda)");
yaz(A, "sinif", "adet", "yonetilen", "ulasan", "ulasmayan", "ort tur");
for (const s of SINIF) {
  const g = alindi.filter((a) => a.sinif === s.ad);
  const u = g.filter((a) => a.tur > 0);
  yaz(A, s.ad, s.adet, s.yonetilen ? s.adet : 0, u.length, g.length - u.length,
    u.length ? (u.reduce((a, x) => a + x.tur, 0) / u.length).toFixed(1) : "-");
}
const ulasan = alindi.filter((a) => a.tur > 0).length;
yaz(A, "toplam", makine, yonetilen, ulasan, makine - ulasan, "-");

const B = [-6, 10, 10, 10, 12];
console.log("\n2. tur tur birikimli kapsama");
yaz(B, "tur", "ulasan", "yuzde", "kalan", "yeni ulasan");
let onceki = 0;
for (const t of [1, 2, 3, 4, 6, 8, 12, 16]) {
  const u = alindi.filter((a) => a.tur > 0 && a.tur <= t).length;
  yaz(B, t, u, `%${(100 * u / makine).toFixed(1)}`, makine - u, u - onceki);
  onceki = u;
}

const C = [-20, 6, 11, 12, 14];
console.log("\n3. yerel gecersiz kilma kac yol aciyor");
const yerelAyar = AYAR.filter((a) => a.yerel).length;
yaz(C, "sinif", "ayar", "yerel yon", "acilan yol", "kapali kalan");
for (const s of SINIF) {
  const y = s.yonetilen ? s.yerelYonetici : s.adet;
  yaz(C, s.ad, AYAR.length, y, y * yerelAyar, s.adet * AYAR.length - y * yerelAyar);
}
const yy = topla((s) => (s.yonetilen ? s.yerelYonetici : s.adet));
console.log(`${yerelAyar} ayar yerel olarak gecersiz kilinabiliyor, ` +
  `${AYAR.length - yerelAyar} kilinamiyor; toplam acilan yol ${yy * yerelAyar}`);

const D = [-26, 8, 8, 24];
console.log("\n4. dayatmanin ucuncu sutunu");
const oran = (n) => `%${(100 * n / makine).toFixed(1)}`;
yaz(D, "kalem", "sayi", "oran", "kaynak");
for (const s of [
  ["hic ulasmayan makine", makine - ulasan, oran(makine - ulasan), "kapali ve yonetim disi"],
  ["16 turda ulasan", ulasan, oran(ulasan), "cevrimici olan"],
  ["yerel yoneticili makine", yy, oran(yy), "envanter"],
  ["acilan yol", yy * yerelAyar, "-", `${yerelAyar} yerel ayar`],
  ["gecersiz kilinamayan ayar", AYAR.length - yerelAyar, "-", "merkezi"],
]) yaz(D, ...s);
```

```
325 makine, 319 yonetilen, 6 yonetim disi; 12 ayar, 16 tur, tohum 20250131

1. sinif basina kapsama (24 saatlik pencere sonunda)
sinif                   adet yonetilen    ulasan ulasmayan  ort tur
sube-is-istasyonu         96        96        93         3      1.3
saha-dizustu             140       140       122        18      3.9
depo-terminali            18        18        17         1      2.0
sunucu                    21        21        21         0      1.0
olcum-toplayici           44        44        42         2      1.1
eski-konsol                6         0         0         6        -
toplam                   325       319       295        30        -

2. tur tur birikimli kapsama
tur       ulasan     yuzde     kalan yeni ulasan
1            167     %51.4       158         167
2            221     %68.0       104          54
3            241     %74.2        84          20
4            258     %79.4        67          17
6            270     %83.1        55          12
8            282     %86.8        43          12
12           291     %89.5        34           9
16           295     %90.8        30           4

3. yerel gecersiz kilma kac yol aciyor
sinif                 ayar  yerel yon  acilan yol  kapali kalan
sube-is-istasyonu       12         11          55          1097
saha-dizustu            12         38         190          1490
depo-terminali          12          4          20           196
sunucu                  12          6          30           222
olcum-toplayici         12          2          10           518
eski-konsol             12          6          30            42
5 ayar yerel olarak gecersiz kilinabiliyor, 7 kilinamiyor; toplam acilan yol 335

4. dayatmanin ucuncu sutunu
kalem                         sayi    oran                  kaynak
hic ulasmayan makine            30    %9.2  kapali ve yonetim disi
16 turda ulasan                295   %90.8          cevrimici olan
yerel yoneticili makine         67   %20.6                envanter
acilan yol                     335       -            5 yerel ayar
gecersiz kilinamayan ayar        7       -                 merkezi
```

Sayılar **ölçüm** sınıfındadır; girdileri KK17–KK19 ile makine envanteridir.

#### Kapsama Bir Anda Oluşmaz

İkinci tablo KK17'yi sayıya çevirir. Politika yazıldıktan sonraki ilk turda 325 makinenin
167'sine ulaşır; kapsama **%51,4**'tür. İkinci turda 221'e, dördüncü turda 258'e çıkar. On altı
tur sonunda 295 makine politikayı almıştır ve 30 makine hâlâ almamıştır.

Eğrinin biçimi kararı belirler. İlk iki tur toplam kapsamanın 221'ini, yani ulaşılabilen 295'in
dörtte üçüne yakınını üretir; kalan on dört tur yalnız 74 makine ekler. Bir güvenlik ayarını
yayımlayan ekip için bu iki sayı ayrı anlamlar taşır: acil bir kapatma kararında ilk üç saat
kapsamanın çoğunu getirir, ama **son yüzde onu getirmek bir günden uzun sürer** ve o yüzde on
tam olarak riskli olan kalemi barındırır.

Birinci tablo dağılımı verir. Sunucular ilk turda tamamlanır, ortalama tur sayısı 1,0'dır. Şube
iş istasyonlarında ortalama 1,3, ölçüm toplayıcılarda 1,1'dir. Saha dizüstüleri ise ayrı bir
sınıftır: ortalama 3,9 tur ve 18 makine hiç almaz. Yayılmanın hızını belirleyen şey politika
deposu ya da ağ değil, makinenin **açık olma oranıdır**; merkezde yapılan hiçbir iyileştirme bu
sayıyı değiştirmez.

#### Hiç Ulaşmayan Otuz Makine

Dördüncü tablo KK18'i sayar. Otuz makine — envanterin %9,2'si — politikayı hiç almaz ve bu sayı
iki ayrı kaynaktan gelir. Yirmi dördü pencerede hiç açılmayan makinelerdir: kapalı duran saha
dizüstüleri, depoda bekleyen terminaller. Altısı yönetim dışı eski konsollardır ve politika
çekmeye hiç ayarlı değildir.

İki kaynak arasındaki fark, düzeltmenin biçimini belirler. Kapalı makineler açıldıklarında
politikayı alır; onların sorunu zamanlamadır ve pencere uzatıldığında düzelir. Yönetim dışı altı
konsol ise hiçbir pencerede almaz; onların sorunu envanterdedir ve yalnız elle kapatılır. Merkezî
konsolda ikisi de aynı görünür — "politika uygulandı" satırı 319 yönetilen makineyi sayar,
ulaşan 295'i değil.

**Kapsama oranı, uygulanmış politika sayısı değil, doğrulanmış makine sayısıdır.** Bu ayrımı
yapmayan bir rapor, ilk turdan sonra %100 yazar; ölçülen sayı %51,4'tür. Eksik olan 30 makine,
politikanın kapattığını varsaydığı on iki yolun on ikisini de açık tutar.

#### Yerel Geçersiz Kılma

Üçüncü tablo KK19'u sayar. Politikanın taşıdığı on iki ayarın beşi makinede yerel olarak geçersiz
kılınabilir, yedisi kılınamaz. Envanterde yerel yönetici hesabı bulunan makine sayısı 67'dir ve
her biri beş ayarı düşürebilir: toplam **335 yol** yeniden açılır.

Dağılım eşit değildir. Saha dizüstülerinde 38 makinede yerel yönetici vardır ve tek başına 190
yol açar; şube iş istasyonlarında 11 makine 55 yol açar. Ölçüm toplayıcılarda yalnız iki makine
vardır ve 10 yol açılır. Aynı politika, aynı on iki ayarla, sınıftan sınıfa on dokuz kat değişen bir
sonuç üretir.

İki tablo birbirini çarpar. Saha dizüstüleri hem en yavaş ulaşılan sınıftır — ortalama 3,9 tur,
18 makine hiç almaz — hem de en çok yerel geçersiz kılmaya açık sınıftır. Merkezî dayatmanın en
zayıf olduğu yer, envanterin en kalabalık ve en hareketli parçasıdır. **Yayılma oranı ile
geçersiz kılma oranı bağımsız değildir; ikisi de aynı özellikten, makinenin merkezden uzak
olmasından çıkar.**

Yedi merkezî ayar bu tablonun karşı tarafıdır. Yerel yönetici olan bir makinede bile bu yedi
ayar düşmez; kapalı kalan yol sayısı 1490 ile 42 arasında değişen sütunda toplanır. Merkezî
dayatmanın gerçek kapsamı, dağıtılan ayar sayısı değil, **yerelde geçersiz kılınamayan ayar
sayısıdır** ve bu modelde on ikinin yedisidir.

#### Kökün Kendisi: Politika Deposu

İki tablo boyunca ölçülen şey politikanın **ulaşması** oldu. Kursun birinci sütunu ise farklı bir
soru sorar: ulaşan şeyin doğru olduğunu ne kanıtlıyor. Makine, çektiği ayar kümesini olduğu gibi
uygular; içeriğin merkezde kim tarafından yazıldığını sınamaz. Güven kökü politika deposunun
bütünlüğü ile dağıtım kanalının doğrulanmasıdır ve ikisi de bu mekanizmanın dışındadır — birincisi
ilk derste ölçülen dizinin, ikincisi ikinci derste ölçülen bilet akışının üzerinde durur.

Kök kırıldığında olan şey diğer derslerdekinden sessizdir. Bir ayar merkezde değiştirilirse, 295
makine onu on altı tur içinde alır ve **doğru çalışarak** yanlış ayarı uygular. Hiçbir makinede
hata oluşmaz, hiçbir kullanıcı fark etmez ve merkezî konsol yeşil kalır. Bu, ikinci derste
görülen sahte bilet örüntüsünün yapılandırma tarafındaki karşılığıdır: mekanizma kusursuz
işlediği için sonuç geçerli sayılır.

Yenileme faturası da buna göre okunur. Değiştirilmiş bir ayarı geri almak yeni bir yayılma turu
demektir; 295 makine yeniden on altı tura, 30 makine ise elle işleme yayılır. Yanlış ayarın kaç
saat açık kaldığı, ilk yayılma eğrisinin aynısıyla hesaplanır ve **geri almanın hızı, dayatmanın
hızından farklı değildir**. Merkezî dayatmanın gücü ile kök kırıldığında ödenen bedel aynı
eğriden okunur; eğriyi hızlandırmak iki sonucu birden hızlandırır ve yavaşlatmak ikisini birden
yavaşlatır.

#### Özet

- Merkezî politika bir yazma işlemi değil yayılma sürecidir: 325 makinenin ilk turda 167'sine
  ulaşır, kapsama %51,4'te başlar.
- Kapsamanın büyük bölümü ilk iki turda oluşur; kalan on dört tur yalnız 74 makine ekler ve son
  yüzde onu getirmek bir günden uzun sürer.
- 30 makine politikayı hiç almaz: 24'ü pencerede hiç açılmadığı için, 6'sı yönetim dışı olduğu
  için; merkezî konsolda ikisi de aynı görünür.
- Yayılma hızını belirleyen kalem ağ ya da depo değil, makinenin açık olma oranıdır; saha
  dizüstülerinde ortalama 3,9 tur, sunucularda 1,0 turdur.
- 12 ayarın 5'i yerelde geçersiz kılınabilir ve yerel yöneticili 67 makine 335 yol açar;
  dayatmanın gerçek kapsamı geçersiz kılınamayan 7 ayardır.

#### Sonraki Adım

Bu ders bir ayarın 67 makinede yerel olarak düşürülebildiğini saydı. Düşürebilmek için o
makinede yerel yönetici olmak gerekir; asıl soru, sıradan bir hesabın o yetkiyi **nasıl elde
ettiğidir**. Kurumsal bir ağda bu tek bir olay değil, bir yollar kümesidir: bir hesabın kendi
düzeyindeki başka bir hesabın verisine ulaşması ya da kendi düzeyinin üstüne çıkması. Sonraki
ders yatay ve dikey yetki yükseltmeyi yol sayımı olarak ele alır: kaç ayrı yükselme yolu var,
hangi denetim kaçını kapatıyor ve hangileri hiçbir denetimle kapanmıyor.

### Yetki Yükseltme

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/yetki-yukseltme

Yatay ve dikey yükselmenin yol sayımı olarak ölçülmesi: 9 düğüm ve 20 kenar üzerinde sınırlı kullanıcıdan alan yöneticisine 37 ayrı yolun bulunması, 32 yolun en az bir yatay kenardan geçmesi, tek bir denetimin en çok 24 yol kapatması, üç denetimin 37'sini birden kapatması ve bir denetimin hiçbir yolu kapatmaması.

Önceki ders bir ayarın 67 makinede yerel olarak düşürülebildiğini saydı. Düşürebilmek için o
makinede yerel yönetici olmak gerekir ve asıl soru, sıradan bir hesabın o yetkiyi nasıl elde
ettiğidir. Bu geçişe **yetki yükseltme (privilege escalation)** denir ve kurumsal bir ağda tek
bir olay değil, bir yollar kümesidir.

İki tür ayrılır. **Yatay yükselme**, aynı düzeydeki başka bir öznenin verisine ya da hesabına
geçmektir; **dikey yükselme**, üst düzeye çıkmaktır. Bu ders ikisini de yol sayımı olarak ele
alır: kaç ayrı yol var, hangi denetim kaçını kapatıyor ve hepsini kapatmak için kaç denetim
gerekiyor. **Bilgi Teknolojileri ve Sistem Temelleri** kursunda yükseltme, yapıldığı varsayılınca
açılan istek sayısı olarak ölçülmüştü; burada ölçülen, yükseltmenin **kaç ayrı yoldan** mümkün
olduğudur. Adım dizisi, komut ve araç bu derste yazılmaz; böyle bir denemenin yazılı yetki ve
tanımlı kapsam olmadan yapılması hem yasadışı hem meslek dışıdır.

#### Kenar, Yol ve Denetim

**KK20:** yetki yükseltme tek bir olay değil, bir **kenar kümesidir**; her kenar bir yapılandırma
kaleminden doğar ve o kalem kaldırıldığında kenar da kalkar. **KK21:** yatay ve dikey yükselme
ayrı sayılır, çünkü ayrı denetimlerle kapanır. **KK22:** bir denetim kenar kapatır, yol kapatmaz;
kaç yol kapandığı o kenarın kaç yolda geçtiğine bağlıdır.

KK20 bu dersin ölçme biçimini belirler. Yükseltme bir yetenek değil, envanterin bir özelliğidir:
grafikteki her kenarın arkasında yazılmış bir üyelik, verilmiş bir izin ya da unutulmuş bir hesap
vardır. Bu yüzden ölçülen şey saldırganın becerisi değil, kurumun kendi yapılandırma kalemleridir. Kenar listesi değişmedikçe sayı değişmez; liste her
değiştiğinde sayı yeniden hesaplanır ve bu hesap bir denetim işi değil, bir envanter işidir; envanter tutulmadığında yol sayısı bilinmez ve çoğu kurumda sıfır sanılır.

#### Dokuz Düğüm, Yirmi Kenar

Aşağıdaki graf bir **modeldir**: kurgu bölgesel ölçüm ağı kurumunda hesap düzeyleri ve aralarında
geçişi mümkün kılan yapılandırma kalemleri. Gerçek bir kurum, gerçek bir hesap ve işleyen hiçbir
adım dizisi yoktur.

```js
// yukselme/graf.mjs — yetki yukseltme yollarinin grafi (model): dugumler hesap duzeyleri,
// kenarlar bir duzeyden digerine gecisi mumkun kilan yapilandirma kalemleridir. Gercek bir
// kurum, gercek bir hesap ve isleyen hicbir adim dizisi yok. Rastgelelik yok.

// KK20: yetki yukseltme tek bir olay degil, bir kenar kumesidir; her kenar bir yapilandirma
// kaleminden dogar ve o kalem kaldirildiginda kenar da kalkar. KK21: yatay yukselme ayni
// duzeydeki baska bir ozneye, dikey yukselme ust duzeye gecistir; ikisi ayri sayilir cunku
// ayri denetimlerle kapanir. KK22: bir denetim kenar kapatir, yol kapatmaz; kac yol kapandigi
// o kenarin kac yolda gectigine baglidir.
// Sutunlar: kaynak, hedef, tur, kenari acan kalem, kenari kapatan denetim.
export const KENAR = `
  sinirli-kullanici    baska-kullanici      yatay  paylasilan-yerel-parola  makine-basi-parola
  sinirli-kullanici    baska-kullanici      yatay  ortak-dizin-izni         dosya-izni-daraltma
  sinirli-kullanici    yerel-yonetici       dikey  yerel-yonetici-uyeligi   grup-uyeligi-dayatma
  sinirli-kullanici    yerel-yonetici       dikey  imzasiz-betik            imzasiz-betik-engeli
  sinirli-kullanici    yedekleme-operator   dikey  eski-grup-uyeligi        grup-uyeligi-denetimi
  baska-kullanici      yerel-yonetici       dikey  ikinci-hesap-uyeligi     grup-uyeligi-dayatma
  baska-kullanici      yardim-masasi        yatay  yardim-masasi-uyeligi    grup-uyeligi-denetimi
  yerel-yonetici       hizmet-hesabi        yatay  makinede-calisan-hizmet  hizmet-hesabi-kisiti
  yerel-yonetici       yardim-masasi        yatay  ayricalikli-oturum-izi   oturum-yalitimi
  yerel-yonetici       sunucu-yoneticisi    dikey  ortak-yerel-parola       makine-basi-parola
  yerel-yonetici       yedekleme-operator   yatay  yedek-ajani-hesabi       yedek-erisim-ayrimi
  hizmet-hesabi        sunucu-yoneticisi    dikey  asiri-yetkili-hizmet     en-az-yetki
  hizmet-hesabi        politika-yoneticisi  dikey  hizmet-politika-yetkisi  politika-yazma-ayrimi
  yardim-masasi        baska-kullanici      yatay  parola-sifirlama         sifirlama-onayi
  yardim-masasi        alan-yoneticisi      dikey  devredilebilir-yonetim   devir-kisitlama
  yardim-masasi        yedekleme-operator   yatay  grup-yonetim-yetkisi     devir-kisitlama
  yedekleme-operator   alan-yoneticisi      dikey  yedek-geri-yukleme       yedek-erisim-ayrimi
  sunucu-yoneticisi    politika-yoneticisi  dikey  politika-duzenleme       politika-yazma-ayrimi
  sunucu-yoneticisi    alan-yoneticisi      dikey  sunucuda-yonetici-izi    oturum-yalitimi
  politika-yoneticisi  alan-yoneticisi      dikey  politika-dayatma         politika-imzasi`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    return { kaynak: p[0], hedef: p[1], tur: p[2], kalem: p[3], denetim: p[4] };
  });

export const BASLANGIC = "sinirli-kullanici";
export const HEDEF = "alan-yoneticisi";

// Yol sayimi: dongusuz, her dugum bir yolda en fazla bir kez gecilir.
export const yollar = (kapali = []) => {
  const acik = KENAR.filter((k) => !kapali.includes(k.denetim));
  const sonuc = [];
  const gez = (dugum, gecilen, yol) => {
    if (dugum === HEDEF) { sonuc.push(yol); return; }
    for (const k of acik.filter((x) => x.kaynak === dugum && !gecilen.includes(x.hedef)))
      gez(k.hedef, [...gecilen, k.hedef], [...yol, k]);
  };
  gez(BASLANGIC, [BASLANGIC], []);
  return sonuc;
};
```

```js
// yukselme/sayim.mjs — kac ayri yukselme yolu var, yollarin kaci yatay kenar gecirir, hangi
// denetim kacini kapatiyor ve butun yollari kapatmak icin kac denetim gerekiyor.
import { KENAR, BASLANGIC, HEDEF, yollar } from "./graf.mjs";

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 denetimler = [...new Set(KENAR.map((k) => k.denetim))];
const dugum = [...new Set(KENAR.flatMap((k) => [k.kaynak, k.hedef]))];
const hepsi = yollar();

console.log(`${dugum.length} dugum, ${KENAR.length} kenar (` +
  `${KENAR.filter((k) => k.tur === "dikey").length} dikey, ` +
  `${KENAR.filter((k) => k.tur === "yatay").length} yatay), ` +
  `${denetimler.length} denetim`);
console.log(`${BASLANGIC} dugumunden ${HEDEF} dugumune ${hepsi.length} ayri yol var`);

const A = [-10, 8, 12, 12, 11];
console.log("\n1. yol uzunluguna gore dagilim");
yaz(A, "uzunluk", "yol", "yalniz dik", "yatay var", "ort kenar");
for (const u of [2, 3, 4, 5]) {
  const s = hepsi.filter((y) => y.length === u);
  if (s.length === 0) continue;
  yaz(A, u, s.length, s.filter((y) => y.every((k) => k.tur === "dikey")).length,
    s.filter((y) => y.some((k) => k.tur === "yatay")).length, u);
}
const yatayli = hepsi.filter((y) => y.some((k) => k.tur === "yatay")).length;
console.log(`en az bir yatay kenar geciren yol ${yatayli}/${hepsi.length}, ` +
  `yalniz dikey kenarla giden yol ${hepsi.length - yatayli}`);

const B = [-22, 8, 10, 10, 11];
console.log("\n2. denetim basina: kac kenar, kac yol kapaniyor");
yaz(B, "denetim", "kenar", "kapanan", "kalan", "kapanan %");
const sirali = denetimler.map((d) => ({ d, kalan: yollar([d]).length }))
  .sort((a, b) => a.kalan - b.kalan);
for (const { d, kalan } of sirali) {
  yaz(B, d, KENAR.filter((k) => k.denetim === d).length, hepsi.length - kalan, kalan,
    `%${(100 * (hepsi.length - kalan) / hepsi.length).toFixed(0)}`);
}

const C = [-22, 9, 9, 11];
console.log("\n3. denetimler en etkiliden eklenirse (birikimli)");
yaz(C, "eklenen", "denetim", "kalan", "kapanan");
const secili = [];
yaz(C, "hicbiri", 0, hepsi.length, 0);
let kalanY = hepsi.length;
while (kalanY > 0) {
  let enIyi = null, enAz = kalanY;
  for (const d of denetimler.filter((x) => !secili.includes(x))) {
    const k = yollar([...secili, d]).length;
    if (k < enAz) { enAz = k; enIyi = d; }
  }
  if (enIyi === null) break;
  secili.push(enIyi); kalanY = enAz;
  yaz(C, enIyi, secili.length, kalanY, hepsi.length - kalanY);
}

const D = [-22, 8, 10, 12, 12];
console.log("\n4. dugum basina: kac yol o dugumden geciyor");
yaz(D, "dugum", "yolda", "yuzde", "giren kenar", "cikan kenar");
const gecen = (d) => hepsi.filter((y) =>
  y.some((k) => k.kaynak === d || k.hedef === d)).length;
for (const d of dugum.sort((a, b) => gecen(b) - gecen(a))) {
  yaz(D, d, gecen(d), `%${(100 * gecen(d) / hepsi.length).toFixed(0)}`,
    KENAR.filter((k) => k.hedef === d).length,
    KENAR.filter((k) => k.kaynak === d).length);
}
```

```
9 dugum, 20 kenar (12 dikey, 8 yatay), 13 denetim
sinirli-kullanici dugumunden alan-yoneticisi dugumune 37 ayri yol var

1. yol uzunluguna gore dagilim
uzunluk        yol  yalniz dik   yatay var  ort kenar
2                1           1           0          2
3                8           2           6          3
4               16           2          14          4
5               10           0          10          5
en az bir yatay kenar geciren yol 32/37, yalniz dikey kenarla giden yol 5

2. denetim basina: kac kenar, kac yol kapaniyor
denetim                  kenar   kapanan     kalan  kapanan %
grup-uyeligi-dayatma         2        24        13        %65
makine-basi-parola           2        16        21        %43
oturum-yalitimi              2        16        21        %43
hizmet-hesabi-kisiti         1        12        25        %32
politika-yazma-ayrimi        2        12        25        %32
devir-kisitlama              2        12        25        %32
politika-imzasi              1        12        25        %32
yedek-erisim-ayrimi          2        11        26        %30
dosya-izni-daraltma          1        10        27        %27
imzasiz-betik-engeli         1         8        29        %22
en-az-yetki                  1         8        29        %22
grup-uyeligi-denetimi        2         5        32        %14
sifirlama-onayi              1         0        37         %0

3. denetimler en etkiliden eklenirse (birikimli)
eklenen                 denetim    kalan    kapanan
hicbiri                       0       37          0
grup-uyeligi-dayatma          1       13         24
imzasiz-betik-engeli          2        5         32
grup-uyeligi-denetimi         3        0         37

4. dugum basina: kac yol o dugumden geciyor
dugum                    yolda     yuzde giren kenar cikan kenar
sinirli-kullanici           37      %100           0           5
alan-yoneticisi             37      %100           4           0
yerel-yonetici              32       %86           3           4
baska-kullanici             20       %54           3           2
sunucu-yoneticisi           16       %43           2           2
yardim-masasi               12       %32           2           3
hizmet-hesabi               12       %32           1           2
politika-yoneticisi         12       %32           2           1
yedekleme-operator          11       %30           3           1
```

Sayılar **ölçüm** sınıfındadır; girdileri KK20–KK22 ile kenar listesidir.

#### Yirmi Kenar, Otuz Yedi Yol

Başlık satırı bu dersin ilk sonucunu verir: yirmi kenarlı bir grafta sınırlı bir kullanıcıdan
alan yöneticisine **37 ayrı yol** vardır. Yirmi kalem yazılmıştır, otuz yedi sonuç doğmuştur.
Yolların kenar sayısına göre değil, kenarların **birleşim biçimine** göre çoğalması bu ölçümün
temel özelliğidir; yeni bir kenar eklemek yol sayısını bir artırmaz, çarpar.

Birinci tablo dağılımı verir. En kısa yol iki kenardır ve tek örneği vardır. Üç kenarlı yol
sekiz, dört kenarlı yol on altı, beş kenarlı yol on tanedir. Yolların çoğunluğu ortada
toplanır; en kısa ve en uzun uçlar seyrektir. Bu, bir envanterin "kaç adımda ele geçirilir"
sorusuna verilebilecek tek anlamlı yanıtın **dağılım** olduğunu gösterir — tek bir sayı yoktur.

Yatay kenarların payı belirleyicidir. Otuz yedi yolun **32'si** en az bir yatay kenardan geçer;
yalnız beş yol baştan sona dikey kenarlarla ilerler. Yatay kenarlar sekiz tanedir, yani kenarların
%40'ı; ama yolların %86'sında geçerler. Yatay geçişler yükseltmenin kendisi değildir — düzey
değiştirmezler — ama dikey kenarlara **erişim** sağlarlar ve bu yüzden yolların çoğunda bulunurlar.
Yalnız dikey yükselmeyi ölçen bir değerlendirme, otuz yedi yolun otuz ikisini görmez.

#### Bir Denetim Kaç Yol Kapatıyor

İkinci tablo KK22'yi sayar. Grup üyeliği dayatması iki kenarı kapatır ve 24 yol düşürür — toplamın
%65'i. Makine başına benzersiz parola ile ayrıcalıklı oturum yalıtımı da ikişer kenar kapatır ama
16'şar yol düşürür. Aynı sayıda kenar, farklı sayıda yol: bir kenarın değeri kendi sayısında
değil, kaç yolda geçtiğindedir.

Tablonun son satırı bunun uç örneğidir. Parola sıfırlama onayı bir kenar kapatır ve **sıfır yol**
düşürür. Kapattığı kenar — yardım masasından başka bir kullanıcıya geçiş — hiçbir yolun üzerinde
değildir, çünkü o kenardan sonra gidilebilecek her yere zaten daha kısa yollardan gidilmektedir.
Denetim gereksiz değildir; başka bir şeye karşı işe yarayabilir. Ama **bu grafta yol kapatma
ölçüsüne göre değeri sıfırdır** ve bir güvenlik bütçesi bu satırı görmeden dağıtılmamalıdır.

Dördüncü tablo aynı bilgiyi düğüm tarafından verir. Yerel yönetici düğümü yolların %86'sında
geçer; üç giren, dört çıkan kenarı vardır. Ondan sonraki en yüklü düğüm başka kullanıcıdır ve
yolların %54'ünde bulunur. Bir düğümün yük taşıması, giren kenar sayısıyla çıkan kenar sayısının
çarpımına yakın davranır: yerel yöneticide üç ile dördün çarpımı, tabloda en yüksek satırı verir.

#### Grafın Kendisi Nerede Duruyor

Yirmi kenarın hangi kalemden doğduğu listede yazılıdır ve bu kalemlerin çoğu bir yerde tutulur:
merkezî dizinde. Grup üyelikleri, devredilmiş yönetim yetkileri ve hizmet hesaplarının kapsamı
ilk derste ölçülen deponun kayıtlarıdır. **Bu dersin güven kökü, o kayıtların gerçeği yansıtması
varsayımıdır**; deponun bütünlüğü kırıldığında graf, hiç kimsenin görmediği yeni kenarlar kazanır
ve sayım eskimiş olur.

İki kenar bunu doğrudan gösterir. Yerel yönetici üyeliğinden doğan kenar, önceki derste merkezî
politikayla dayatılan on iki ayardan birinin karşılığıdır; o ayarın ulaşmadığı 30 makinede kenar
açık kalır. Aynı biçimde yerel geçersiz kılmaya açık 67 makinede, imzasız betik engelinin
kapattığı kenar makine başına yeniden doğar. Yayılma tablosundaki eksik kapsama, bu grafta
doğrudan kenar sayısına yazılır.

Bu, iki dersin sayılarını birbirine bağlar. Üçüncü tablo üç denetimin otuz yedi yolu kapattığını
söyler; altıncı ders o denetimlerin makinelerin %90,8'ine ulaştığını ve %9,2'sine hiç
ulaşmadığını söyler. **Kapatılan yol sayısı ile kapatmanın ulaştığı makine oranı ayrı iki
ölçüdür** ve gerçek kapsama ikisinin çarpımıdır. Grafta sıfıra inen yol sayısı, envanterin
tamamında sıfır değildir; ulaşılamayan her makine, kapatıldığı sanılan kenarları kendi üzerinde
açık tutar ve bu kenarlar merkezî raporda kapalı görünür.

#### Üç Denetim Otuz Yedi Yolu Kapatıyor

Üçüncü tablo en etkili denetimi tekrar tekrar seçerek birikimli sonucu çıkarır. Grup üyeliği
dayatması 37 yolu 13'e indirir; imzasız betik engeli 13'ü 5'e; grup üyeliği denetimi 5'i sıfıra.
**Üç denetim otuz yedi yolun tamamını kapatır.**

Sonucun biçimi şaşırtıcıdır ve nedeni grafın yapısındadır. Üç denetim, sınırlı kullanıcı
düğümünden **çıkan** beş kenarın üçünü kapatır; kalan iki kenar `baska-kullanici` düğümüne gider
ve o düğümün kendi iki çıkan kenarı da aynı üç denetimle kapanır. Başlangıçtan çıkan her yol ya
kesilir ya bir çıkmaz sokağa varır; grafın geri kalanı ne kadar zengin olursa olsun ulaşılamaz
hâle gelir. İkinci tablodaki tek tek sıralama ile üçüncü tablodaki birikimli seçim bu yüzden
farklı denetimleri öne çıkarır: politika imzası tek başına 12 yol kapatır ama seçilmez, çünkü
kapattığı yollar başkalarınca zaten kapatılmıştır.

Bu, **yol sayımının en pratik sonucudur**: savunma bütçesi tek tek etkiye göre değil, birikimli
etkiye göre dağıtılır. On üç denetimin on üçünü de uygulamak gerekmiyor olabilir; ama hangi üçünün
yeteceğini söyleyen şey ne deneyim ne de sezgidir — kenar listesi üzerinde yapılan sayımdır.

Modelin sınırı da burada yazılır. Üç denetim bu **kenar listesindeki** yolları kapatır; listede
olmayan bir kenar — kaydedilmemiş bir grup üyeliği, unutulmuş bir hizmet hesabı — sayıma girmez
ve kapanmaz. Yol sayımı envanterin doğruluğu kadar doğrudur ve envanterin eksikliği, sayının
küçüklüğü olarak görünür.

#### Özet

- Yetki yükseltme bir kenar kümesidir: 9 düğüm ve 20 kenarlı bir grafta sınırlı kullanıcıdan
  alan yöneticisine 37 ayrı yol vardır.
- Yolların uzunluğu 2 ile 5 kenar arasında dağılır; çoğunluk 4 kenarlı yollardadır ve tek bir
  "kaç adım" sayısı yoktur.
- Yatay kenarlar kenarların %40'ıdır ama yolların 32'sinde geçer; yalnız dikey yükselmeyi ölçen
  bir değerlendirme 37 yolun 32'sini görmez.
- Aynı sayıda kenar kapatan iki denetim farklı sayıda yol kapatır; bir denetim 1 kenar kapatıp
  0 yol düşürür.
- Üç denetim 37 yolun tamamını kapatır: başlangıç düğümünden çıkan 5 kenarın 3'ünü keser, kalan
  2'sinin vardığı düğümü çıkmaz sokağa çevirir; birikimli etki tek tek etkiden farklı bir sıralama
  üretir.

#### Sonraki Adım

Bu ders yükselmeyi yapılandırma kalemleri üzerinden saydı: bir üyelik, bir izin, bir hesap. Kenar
listesinin arkasında sessiz kalan bir kalem daha vardır. Bir hesaptan diğerine geçmek çoğu zaman
o hesabın parolasını bilmeyi değil, o hesabın **doğrulanmasında kullanılan değeri** ele geçirmeyi
gerektirir; makinelerin belleğinde, oturum açmış her kullanıcı için böyle bir değer durur.
Sonraki ders bunu savunma ekseninde ölçer: hangi kalem bellekte ne kadar kalıyor, karma aktarmanın
neden parola bilmeden çalıştığı ve hangi denetimin kaç yolu kapattığı. O ders aynı zamanda kursu
kapatır.

### Kimlik Bilgisi Hırsızlığı

Source: https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/kimlik-bilgisi-hirsizligi

Doğrulama kalemlerinin bellekte kalış süresi ve denetimlerin kapattığı yol: 8 kalem türünün 6'sının parola bilinmeden doğrudan sunulabilmesi, 22 yol ve 298.958 makine-saatlik maruziyet, altı denetimin 17 yolu kapatıp maruziyeti %1'e indirmesi ve kalan 5 yolun hiçbir denetimle kapanmaması.

Önceki ders yükselmeyi yapılandırma kalemleri üzerinden saydı: bir üyelik, bir izin, bir hesap.
Kenar listesinin arkasında sessiz kalan bir kalem daha vardır. Bir hesaptan diğerine geçmek çoğu
zaman o hesabın parolasını bilmeyi değil, **doğrulanmasında kullanılan değeri** eline geçirmeyi
gerektirir; oturum açmış her kullanıcı için makinelerin belleğinde böyle bir değer durur.

Bu ders o değerleri savunma ekseninde ölçer: hangi kalem nerede ne kadar kalıyor, kaç kalem parola
bilinmeden doğrudan sunulabiliyor ve hangi denetim kaç yolu kapatıyor. İşleyen bir adım dizisi,
araç adı ya da komut bu derste yazılmaz; ölçülen şey kalemin nasıl alındığı değil, alındığı
varsayıldığında ne açtığıdır. Böyle bir denemenin yazılı yetki ve tanımlı kapsam olmadan yapılması
hem yasadışı hem meslek dışıdır.

#### Sunulan Şey Parola Değildir

**KK23:** doğrulama girdisi çoğu mekanizmada parolanın kendisi değil, ondan türetilen ya da onunla
üretilmiş bir değerdir; doğrulayan taraf o değeri bekler. **KK24:** bu yüzden değeri eline
geçirenin parolayı bilmesi **gerekmez** — sunulan şey zaten parola değildir. **KK25:** bir kalemin
makinede kalış süresi ile kapsamı çarpılır; savunma kalemi kaldırmak, süresini kısaltmak ya da
kapsamını daraltmak yollarından biriyle ölçülür.

KK24 bu dersin kavramsal çekirdeğidir ve **karma aktarma (pass-the-hash)** adı verilen sınıfın
tamamını açıklar. Parola hiçbir yerde saklanmaz; saklanan ve ağdan geçen şey ondan türetilmiş bir
değerdir. Doğrulayan taraf, kendisine sunulan değeri kendi kaydındaki değerle karşılaştırır ve
eşleşiyorsa kabul eder. Bu, bir kusur değil tasarımdır — parolayı ağdan geçirmemek için yapılmıştır.
Ama aynı tasarım şunu da söyler: **türetilmiş değeri sunabilen, parolayı bilenle aynı sonucu alır**.
Parola değiştirmek bu yüzden kalemi yenilerken, kalemi çalınmış bir hesap için yapılacak tek işlem
de odur.

#### Sekiz Kalem, Yirmi İki Yol

Aşağıdaki envanter bir **modeldir**: kurgu bölgesel ölçüm ağı kurumunda oturum açıldıktan sonra
makinelerde duran doğrulama kalemleri. Gerçek bir kurum, gerçek bir makine ve işleyen hiçbir adım
dizisi yoktur.

```js
// hirsizlik/kalem.mjs — bir oturum acildiktan sonra makinede duran dogrulama kalemleri
// (model): gercek bir kurum, gercek bir makine, gercek bir kalem ve isleyen hicbir adim
// dizisi yok. Rastgelelik yok.

// KK23: dogrulama girdisi cogu mekanizmada parolanin kendisi degil, ondan turetilen ya da
// onunla uretilmis bir degerdir; dogrulayan taraf o degeri bekler. KK24: bu yuzden degeri
// eline gecirenin parolayi bilmesi gerekmez — sunulan sey zaten parola degildir.
// KK25: bir kalemin makinede kalis suresi ile kapsami carpilir; savunma kalemi kaldirmak,
// suresini kisaltmak ya da kapsamini daraltmak yollarindan biriyle olculur.
// Sutunlar: omur = kalemin makinede kalis suresi (saat), kapsam = kalemin acabildigi sistem
// sayisi, sunulabilir = parola bilinmeden dogrudan sunuldugunda kabul edilir mi.
export const KALEM = `
  parola-turevi-dogrulayici    720   13   evet
  bilet-veren-bilet             10   21   evet
  servis-bileti                 10    1   evet
  oturum-anahtari               10    1   hayir
  uygulama-oturum-cerezi        72    1   evet
  onbellekli-dogrulayici         8    1   hayir
  yenileme-bileti              168   21   evet
  hizmet-hesabi-sirri          720    1   evet`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s+/);
    return { ad: p[0], omur: +p[1], kapsam: +p[2], sunulabilir: p[3] === "evet" };
  });

export const SINIF = [
  { ad: "sube-is-istasyonu", adet: 96 },
  { ad: "sunucu", adet: 21 },
  { ad: "saha-dizustu", adet: 140 },
  { ad: "olcum-toplayici", adet: 44 },
];

// Hangi kalem hangi sinifta bulunuyor: her cift bir yoldur.
export const BULUNUR = {
  "parola-turevi-dogrulayici": ["sube-is-istasyonu", "sunucu", "saha-dizustu"],
  "bilet-veren-bilet": ["sube-is-istasyonu", "sunucu", "saha-dizustu"],
  "servis-bileti": ["sube-is-istasyonu", "sunucu", "saha-dizustu", "olcum-toplayici"],
  "oturum-anahtari": ["sube-is-istasyonu", "sunucu", "saha-dizustu", "olcum-toplayici"],
  "uygulama-oturum-cerezi": ["sube-is-istasyonu", "saha-dizustu"],
  "onbellekli-dogrulayici": ["sube-is-istasyonu", "saha-dizustu"],
  "yenileme-bileti": ["sube-is-istasyonu", "saha-dizustu"],
  "hizmet-hesabi-sirri": ["sunucu", "olcum-toplayici"],
};

// Her denetim, hangi (kalem, sinif) ciftini ortadan kaldirdigini kendi olcutuyle soyler.
export const DENETIM = {
  "ayricalikli-oturum-yalitimi": (k, s) => k.kapsam > 1 && s.ad !== "sunucu",
  "korumali-hesap-grubu": (k) => k.ad === "onbellekli-dogrulayici" ||
    k.ad === "parola-turevi-dogrulayici",
  "yerel-yonetici-kisiti": (k, s) => s.ad === "sube-is-istasyonu" || s.ad === "olcum-toplayici",
  "cikis-zorunlulugu": (k) => k.omur > 24,
  "hizmet-hesabi-yalitimi": (k) => k.ad === "hizmet-hesabi-sirri",
  "kaynaga-bagli-etmen": (k) => k.ad === "uygulama-oturum-cerezi" || k.ad === "yenileme-bileti",
};
```

```js
// hirsizlik/sayim.mjs — hangi kalem nerede ne kadar kaliyor, kac kalem parola bilinmeden
// sunulabiliyor, her denetim kac yol kapatiyor ve kalan maruziyet ne.
import { KALEM, SINIF, BULUNUR, DENETIM } from "./kalem.mjs";

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 sinif = (ad) => SINIF.find((s) => s.ad === ad);
const YOL = KALEM.flatMap((k) => BULUNUR[k.ad].map((s) => ({ k, s: sinif(s) })));
const maruz = (y) => y.reduce((a, x) => a + x.s.adet * x.k.omur, 0);
const acik = (kapali = []) =>
  YOL.filter((y) => !kapali.some((d) => DENETIM[d](y.k, y.s)));

console.log(`${KALEM.length} kalem turu, ${SINIF.length} makine sinifi, ` +
  `${YOL.length} yol, ${SINIF.reduce((a, s) => a + s.adet, 0)} makine`);
console.log(`parola bilinmeden dogrudan sunulabilen kalem ` +
  `${KALEM.filter((k) => k.sunulabilir).length}/${KALEM.length}; ` +
  `toplam maruziyet ${maruz(YOL)} makine-saat`);

const A = [-26, 7, 8, 8, 8, 12];
console.log("\n1. kalem basina: nerede, ne kadar, ne kadar genis");
yaz(A, "kalem", "omur", "kapsam", "sinif", "makine", "makine-saat");
for (const k of KALEM) {
  const y = YOL.filter((x) => x.k === k);
  yaz(A, k.ad, k.omur, k.kapsam, y.length, y.reduce((a, x) => a + x.s.adet, 0), maruz(y));
}

const B = [-28, 8, 10, 12, 10];
console.log("\n2. denetim basina kapanan yol ve maruziyet");
yaz(B, "denetim", "kapanan", "kalan yol", "kalan mar", "kalan %");
for (const d of Object.keys(DENETIM)) {
  const kalan = acik([d]);
  yaz(B, d, YOL.length - kalan.length, kalan.length, maruz(kalan),
    `%${(100 * maruz(kalan) / maruz(YOL)).toFixed(0)}`);
}

const C = [-28, 8, 9, 12, 10];
console.log("\n3. denetimler birikimli eklenirse");
yaz(C, "eklenen", "yol", "kapanan", "maruziyet", "kalan %");
const secili = [];
yaz(C, "hicbiri", YOL.length, 0, maruz(YOL), "%100");
for (const d of Object.keys(DENETIM)) {
  secili.push(d);
  const kalan = acik(secili);
  yaz(C, d, kalan.length, YOL.length - kalan.length, maruz(kalan),
    `%${(100 * maruz(kalan) / maruz(YOL)).toFixed(0)}`);
}

const D = [-26, -18, 8, 13];
console.log("\n4. butun denetimler acikken kalan yollar");
const kalan = acik(Object.keys(DENETIM));
yaz(D, "kalem", "sinif", "makine", "makine-saat");
for (const y of kalan) yaz(D, y.k.ad, y.s.ad, y.s.adet, y.s.adet * y.k.omur);
console.log(`kalan yol ${kalan.length}/${YOL.length}, ` +
  `kalan maruziyet ${maruz(kalan)}/${maruz(YOL)} makine-saat`);
```

```
8 kalem turu, 4 makine sinifi, 22 yol, 301 makine
parola bilinmeden dogrudan sunulabilen kalem 6/8; toplam maruziyet 298958 makine-saat

1. kalem basina: nerede, ne kadar, ne kadar genis
kalem                        omur  kapsam   sinif  makine makine-saat
parola-turevi-dogrulayici     720      13       3     257      185040
bilet-veren-bilet              10      21       3     257        2570
servis-bileti                  10       1       4     301        3010
oturum-anahtari                10       1       4     301        3010
uygulama-oturum-cerezi         72       1       2     236       16992
onbellekli-dogrulayici          8       1       2     236        1888
yenileme-bileti               168      21       2     236       39648
hizmet-hesabi-sirri           720       1       2      65       46800

2. denetim basina kapanan yol ve maruziyet
denetim                      kapanan kalan yol   kalan mar   kalan %
ayricalikli-oturum-yalitimi        6        16       87030       %29
korumali-hesap-grubu               5        17      112030       %37
yerel-yonetici-kisiti             10        12      170590       %57
cikis-zorunlulugu                  9        13       10478        %4
hizmet-hesabi-yalitimi             2        20      252158       %84
kaynaga-bagli-etmen                4        18      242318       %81

3. denetimler birikimli eklenirse
eklenen                          yol  kapanan   maruziyet   kalan %
hicbiri                           22        0      298958      %100
ayricalikli-oturum-yalitimi       16        6       87030       %29
korumali-hesap-grubu              13        9       70022       %23
yerel-yonetici-kisiti              7       15       28630       %10
cikis-zorunlulugu                  5       17        3430        %1
hizmet-hesabi-yalitimi             5       17        3430        %1
kaynaga-bagli-etmen                5       17        3430        %1

4. butun denetimler acikken kalan yollar
kalem                     sinif               makine  makine-saat
bilet-veren-bilet         sunucu                  21          210
servis-bileti             sunucu                  21          210
servis-bileti             saha-dizustu           140         1400
oturum-anahtari           sunucu                  21          210
oturum-anahtari           saha-dizustu           140         1400
kalan yol 5/22, kalan maruziyet 3430/298958 makine-saat
```

Sayılar **ölçüm** sınıfındadır; girdileri KK23–KK25 ile kalem envanteridir.

#### Ömür ile Kapsamın Çarpımı

Birinci tablo sekiz kalemi yan yana koyar. Parola türevi doğrulayıcı 720 saat kalır, 13 sistem
açar ve üç sınıfta 257 makinede bulunur: tek başına 185.040 makine-saatlik maruziyet üretir,
toplamın %62'si. Bilet veren bilet 21 sistem açar ama yalnız 10 saat kalır; maruziyeti 2.570'tir.
**Kapsam tek başına sıralama vermez, ömürle çarpılınca verir.**

Yenileme bileti ikinci sıradadır: 168 saat, 21 sistem, 39.648 makine-saat. Dördüncü derste ölçülen
72 saatlik oturum penceresi ile burada görülen 168 saatlik yenileme bileti aynı ayarın iki
görünümüdür — biri iptal gecikmesi olarak, öteki bellekte kalış süresi olarak yazılır. Aynı sayı
iki ayrı sütunda maliyet üretir.

Hizmet hesabı sırrı yalnız 65 makinede bulunur ama 720 saat kalır ve 46.800 makine-saat verir.
İkinci derste 21 servis hesabı anahtarının kırılmasının 214 aslı düşürdüğü ölçülmüştü; buradaki
46.800, o kalemin makinelerde ne kadar süre açıkta durduğunun karşılığıdır.

#### Altı Denetim, On Yedi Yol

İkinci tablo denetimleri tek tek koşturur. Yerel yönetici kısıtı en çok yolu kapatır — 22'nin
10'unu — ama kalan maruziyet %57'dir, çünkü kapattığı yollar kısa ömürlü kalemleri barındıran
sınıflardadır. Çıkış zorunluluğu yalnız 9 yol kapatır ama maruziyeti **%4'e** indirir; kaldırdığı
kalemler uzun ömürlü olanlardır.

Bu iki satır kursun bir kuralını tekrarlar: sayı, ölçü birimi seçilmeden okunamaz. Yol sayısına
göre sıralandığında yerel yönetici kısıtı birincidir; maruziyete göre sıralandığında çıkış
zorunluluğu birincidir. İki sıralama farklı savunma önceliği verir ve hangisinin doğru olduğu
kurumun neyi ölçtüğüne bağlıdır.

Üçüncü tablo altısını birikimli ekler. Yol sayısı 22'den 5'e, maruziyet 298.958'den 3.430'a iner;
kalan oran **%1**'dir. Son iki denetim — hizmet hesabı yalıtımı ve kaynağa bağlı etmen — hiçbir
yeni yol kapatmaz, çünkü kapattıkları kalemler önceki denetimlerce zaten kaldırılmıştır. Yedinci
derste görülen örüntünün aynısıdır: tek tek etkili olan bir denetim, birikimli listede sıfır
katkı verebilir.

#### Kapanmayan Beş Yol

Dördüncü tablo altı denetim de açıkken kalanı listeler. Beş yol kalır ve beşi de sunucular ile
saha dizüstülerindeki kısa ömürlü kalemlerdir: bilet veren bilet, servis bileti ve oturum
anahtarı. Toplam maruziyet 3.430 makine-saattir.

Bu beşi kapanmaz, çünkü **kaldırılmaları oturumun kendisini kaldırmak demektir**. Bir kullanıcı
bir sunucuda oturum açmışsa o oturumun anahtarı orada durmak zorundadır; bilet olmadan servise
erişilemez. Kursun ölçtüğü kökün yetmediği durum burada en açık hâlindedir: kalan yolları
kapatmanın yolu daha iyi bir denetim değil, oturumun süresini kısaltmaktır — ve o da meşru işi
durdurur.

#### Özet

- Doğrulama girdisi parolanın kendisi değil ondan türetilen değerdir; 8 kalem türünün 6'sı parola
  bilinmeden doğrudan sunulduğunda kabul edilir.
- Maruziyet ömür ile kapsamın çarpımıdır: parola türevi doğrulayıcı 720 saat ve 257 makineyle tek
  başına toplam 298.958 makine-saatin %62'sini üretir.
- Yol sayısına göre en etkili denetim ile maruziyete göre en etkili denetim aynı değildir: biri
  10 yol kapatıp %57 bırakır, öteki 9 yol kapatıp %4 bırakır.
- Altı denetim birlikte 17 yol kapatır ve maruziyeti %1'e indirir; son iki denetim birikimli
  listede sıfır katkı verir.
- Kalan 5 yol hiçbir denetimle kapanmaz, çünkü kaldırılmaları oturumun kendisini kaldırmak
  demektir.

#### Kurs Kapanışı

Yirmi bir ders aynı üç sütunla ölçüldü. Aşağıdaki tablo her dersin güven kökünü, kökten kullanıma
kadar aynı anda doğru olması gereken kalem sayısını ve kök kırıldığında düşen kalemi yan yana
koyar.

| Ders | Güven kökü | Kaç kalem tutmalı | Kök kırılırsa düşen |
|---|---|---|---|
| Karma, Şifreleme ve Kodlama | işlem–alan eşleşmesi | 2 gizli kalem | 24.800 kayıt |
| Karma Fonksiyonları | arama maliyeti | 25.242 kalem | 12.502 kalem |
| Tuz ve Parola Saklama | parolanın öngörülemezliği | 2 çarpan | 340 kayıt |
| Simetrik Şifreleme | paylaşılan anahtar | 4 kalem | 12.401 uç |
| Asimetrik Şifreleme | özel anahtarın gizliliği | 12.401 gizli kalem | 1 katılımcı |
| Anahtar Değişimi | gizli üs | 3 kalem | 52.560 oturum |
| Dijital İmzalar | imzalama anahtarı | 6 kalem | 2.190 imza |
| Sertifikalar | denetlenen alanlar | 8 kalem | 13 deneme |
| Sertifika Otoriteleri | kök sertifika | 14 kalem | 8.802 kalem |
| Sertifika İptali | yayın tazeliği | 29,5 saat pencere | 271.877 bağlantı |
| TLS El Sıkışması | sunucunun özel anahtarı | 11 kalem | 5 sunuş |
| Sertifika Yaşam Döngüsü | yenileme otomasyonu | 4.397 kalem | 1.458 bağlantı |
| Uçtan Uca Şifreleme | uçtaki anahtar | 4 kalem | 172.200 kayıt |
| Dizin Servisleri | merkezî deponun bütünlüğü | 119 kalem | 646 kalem |
| Bilet Tabanlı Doğrulama | bilet veren servisin anahtarı | 471 anahtar kalemi | 214 asıl |
| Ağ Erişimi Doğrulaması | paylaşılan sır | 480 kalem | 80 aygıt |
| Çoklu Oturum Açma | imzalama anahtarı | 90 kalem | 1.562 bağlantı |
| Çok Etmenli Doğrulama | kayıt anındaki bağ | 4 kalem | 10 yol |
| Grup Politikaları | politika deposu | 12 ayar | 295 makine |
| Yetki Yükseltme | envanterin doğruluğu | 20 kenar | 37 yol |
| Kimlik Bilgisi Hırsızlığı | bellekteki doğrulayıcı | 8 kalem türü | 22 yol |

Tablonun ortak yanı ikinci sütundur. Hiçbir satırda kök tek başına durmaz: en küçüğü iki, en
büyüğü on iki binden fazla kalem ister ve kalemlerin çoğu kriptografik değildir. Bir saat, bir
kayıt, bir dağıtım turu, bir envanter satırı — kökün çevresindeki bu kalemler, kırılmanın gerçekte
nereden geldiğini belirler.

Üç konu üç ayrı kök sınıfı gösterir. `kriptografi-temelleri` derslerinde kök bir **sırdır** ya da
bir maliyet varsayımıdır: gizli üs, özel anahtar, parolanın öngörülemezliği. `pki` derslerinde
kök bir **karardır**: hangi otoritenin tanınacağı, hangi alanın denetleneceği, iptalin ne sıklıkta
yayımlanacağı. `kurumsal-kimlik` derslerinde ise kök bir **işletim kalemidir**: bir depo kaydı,
bir dağıtım turu, bir envanter satırı, bir kayıt anı. Sıradan matematikten işletime doğru
ilerledikçe kökün korunması zorlaşmaz; **görülmesi** zorlaşır.

Üçüncü sütunun büyüklüğü de bu sırayı izler. Bir gizli üssün düşmesi 52.560 oturum açar ve olay
bellidir; bir dizin kaydının bozulması 646 kalem düşürür ve olayın olduğu bile bilinmez. Kursun
üç dersinde kökün kendisinin yetmediği gösterildi: imza anahtarın kime ait olduğunu kanıtlamaz,
sertifika iptalin öğrenilmesini sağlamaz, çok etmenli doğrulama kendi kayıt anını doğrulayamaz.
Üçünde de eksik olan kalem mekanizmanın içinde değil, çevresindedir.

Kursun kuralı budur: **kriptografi bir gizlilik aracı değil, güveni tek bir köke indirgeme
yöntemidir; kökün nerede durduğunu bilmeyen onu koruyamaz.** Üçüncü sütun bunun bedelini yazar —
646 kalem, 8.802 kalem, 214 asıl, 1.562 bağlantı. Bu sayılar mekanizmanın zayıflığından değil,
indirgemenin başarısından doğar: güven tek bir yerde toplandığı için orada kırılır.

Bu kursta kök her defasında adlandırıldı ve zinciri sayıldı. Ama her kökün altında yazılmamış bir
varsayım kaldı: kökün **üzerinde durduğu makinenin** bütünlüğü. Özel anahtar bir dosyada, bilet
bir bellek bölgesinde, politika deposu bir disk üzerinde durur. O makine ele geçirilirse zincirin
tamamı — doğru kurulmuş, doğru yenilenmiş, doğru denetlenmiş olsa bile — saldırganın elinde
geçerli kalmaya devam eder. **Uç Nokta ve Sistem Sertleştirme** kursu bu soruyla başlar.

