Ders 07 / 21
Dijital İmzalar
İ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.
İçindekiler
Ö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.
// 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,4 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.
// 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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.