---
title: 'Simetrik Şifreleme'
source: 'https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/simetrik-sifreleme'
course: 'Kimlik, Erişim ve Kriptografi'
language: tr
updated: '2026-08-17T18:08:37+00:00'
license: 'CC BY-SA 4.0'
---

# Simetrik Şifreleme

Paylaşılan anahtarın güven kökü ve dağıtım aritmetiği: çözmenin anahtar, nonce, etiket ve gövde olmak üzere dört kalemin aynı anda doğru olmasına bağlı olması, çift başına anahtar düzeninde 12.401 uçta 7,69×10^7 anahtar kalemi gerekmesi, yıldız düzeninin bu sayıyı 12.400'e indirirken merkezi tek köke çevirmesi ve tek ortak anahtar düzeninde bir kalemin düşmesinin bütün bağlantıları düşürmesi.

Ö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, yalnızca çıktılar eşitlenmeye başlar.

## Bir Anahtar Kaç Mesaj Taşır

Nonce koşulunun sayılabilir bir sınırı vardır ve o sınır bu kipte 96 bitliktir. Nonce her mesaj
için rastgele seçiliyorsa, iki mesajın aynı nonce'a düşmesi ikinci dersteki doğum günü sınırına
tabidir: 96 bitlik uzayda beklenen çakışma yaklaşık 2^48 mesajda, yani 2,8×10^14 mesajda doğar.

Kurgu ağda bu sayı bir kısıt oluşturmuyor. 12.400 uç günde yirmi dörder okuma gönderirse günlük
mesaj sayısı 297.600'dür; sınıra ulaşmak 9,5×10^8 gün, yani iki buçuk milyon yıldan fazla
sürer. Yine de sayının varlığı bir tasarım kararına dönüşür, çünkü mesaj hacmi büyüyen bir
kurulumda aynı hesap farklı bir sonuç verir.

İkinci seçenek nonce'u rastgele seçmek yerine bir sayaçla üretmektir. O durumda çakışma
olasılığı sıfırlanır ve sınır 2^96 mesaja çıkar; ama zincire yeni bir kalem eklenir — sayacın
yeniden başlatmalar boyunca **kalıcı olması**. Rastgele nonce durum tutmaz ve sayılabilir bir
sınır taşır; sayaçlı nonce sınırı kaldırır ve bir kalıcı durum kalemi getirir. İkisi arasındaki
seçim, kurulumun uçlarında kalıcı durum tutulup tutulamayacağına bakar.

Anahtar uzunluğu ise ayrı bir sütundur ve tükenmesi beklenen bir kalem değildir. AES'in blok
boyutu 128 bit, anahtar uzunluğu 128, 192 ya da 256 bittir; 256 bitlik anahtarın arama uzayı
2^256'dır ve bu sayı ikinci derste yazılan ön görüntü sınırıyla aynı mertebededir. Zincirdeki
kırılgan kalem anahtarın uzunluğu değil, anahtarın nerede durduğu ve oraya nasıl gittiğidir.

## Anahtar Dağıtım Aritmetiği

Dört kalemden biri — anahtar — ötekilerden ayrılır: paketle taşınamaz. Her iki tarafta da
önceden bulunması gerekir ve bu, sayılabilir bir yük getirir.

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