Ders 05 / 21
Asimetrik Şifreleme
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.
İçindekiler
Ö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.
// 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?
// 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 273.000 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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.