18 DES (Data Encryption Standard) ve Feistel Ağı
DES, modern kriptografinin dönüm noktasıdır. 1970’lerde IBM tarafından “Lucifer” projesi adıyla geliştirilen ve 1977’de Amerikan Ulusal Standartlar Bürosu (NBS, günümüzdeki NIST) tarafından federal standart olarak kabul edilen, simetrik anahtarlı bir blok şifreleme algoritmasıdır.
Günümüzde 56 bitlik kısa anahtar boyutu nedeniyle kaba kuvvet saldırılarına karşı yetersiz kalıp yerini AES’e bırakmış olsa da; modern şifreleme mimarilerinin (Feistel ağları, S-kutusu ve P-kutusu mantığı) temelini anlamak için DES’i öğrenmek zorunludur.
18.1 Harflerden Bitlere Geçiş
Şu ana kadar gördüğümüz klasik şifrelemelerde (Sezar, afin, Vigenère, permütasyon) hep İngiliz alfabesi (\(\mathbb{Z}_{26}\)) üzerinden karakterlerin kimliğini veya yerini değiştirdik.
DES ile birlikte bu “insan odaklı” yapı tamamen terk edilir. Algoritma harflerin ne olduğunu bilmez; doğrudan işlemcinin dilinde, yani \(0\) ve \(1\)’ler üzerinde çalışır. Açık metniniz —ister bir metin dosyası, ister fotoğraf, ister video olsun— önce makine diline çevrilir ve tamamen bit seviyesindeki işlemlerle (XOR, bit kaydırma, bit permütasyonları) şifrelenir.
18.2 Blok ve Anahtar Yapısı
DES algoritması veriyi bir bütün olarak değil, 64 bitlik bloklar hâlinde işler. Mesaj ne kadar uzun olursa olsun sistem bunu 64 bitlik parçalara böler ve her bloğu sırayla şifreler.
Algoritmanın anahtar yapısı ise kriptografi tarihinin en ilginç tasarımlarından biridir:
- Girdi anahtarı: DES’e dışarıdan verilen orijinal anahtar 64 bittir.
- Efektif anahtar boyutu: Orijinal anahtarın her 8. biti (8, 16, 24, …, 64) bir eşlik biti (parity bit) olarak hata kontrolü amacıyla kullanılır ve şifreleme işlemine dâhil edilmez. Bu yüzden DES’in gerçek kriptografik gücü 56 bit ile sınırlıdır.
18.3 DES Anahtar Üretim Algoritması (Key Schedule)
DES, her 64 bitlik veri bloğunu şifrelemek için tam 16 döngü (round) kullanır. Şifrelemenin güvenli olabilmesi için bu 16 döngünün her birine, orijinal anahtardan türetilmiş farklı ve benzersiz 48 bitlik alt anahtarlar (\(K_1, K_2, \dots, K_{16}\)) verilmesi gerekir.
64 bitlik tek bir kök anahtardan 16 farklı alt anahtar üreten bu mekanizmaya anahtar üretimi (key schedule) denir. İşlem üç temel aşamada gerçekleşir.
Adım 1 — PC-1: Eşlik Bitlerini Eleme ve İkiye Bölme
Sisteme giren orijinal kök anahtar 64 bitten oluşur:
\[K = k_1, k_2, k_3, \dots, k_{63}, k_{64}\]
Algoritma bu anahtarın her 8. bitini eşlik biti olarak görür ve şifrelemeye katmaz. Anahtar dizisi PC-1 (Permuted Choice 1) matrisinden geçirilir; bu matrisin içinde eşlik bitlerinin indeksleri bulunmadığından 8 adet eşlik biti otomatik olarak elenir.
| 57 | 49 | 41 | 33 | 25 | 17 | 9 |
| 1 | 58 | 50 | 42 | 34 | 26 | 18 |
| 10 | 2 | 59 | 51 | 43 | 35 | 27 |
| 19 | 11 | 3 | 60 | 52 | 44 | 36 |
| 63 | 55 | 47 | 39 | 31 | 23 | 15 |
| 7 | 62 | 54 | 46 | 38 | 30 | 22 |
| 14 | 6 | 61 | 53 | 45 | 37 | 29 |
| 21 | 13 | 5 | 28 | 20 | 12 | 4 |
Tablonun uygulanma mantığı. Bu işlemi, daha önce işlediğimiz ayrık permütasyon fonksiyonu mantığıyla düşünmeliyiz. Orijinal 64 bitlik anahtarın bitlerini \(k\), oluşacak yeni 56 bitlik dizinin bitlerini \(k'\) olarak tanımlayalım. PC-1 tablosu aslında bizim \(\pi\) permütasyon anahtarımızdır ve bitlerin konum indeksleri üzerinde çalışır:
\[k'_\tau = k_{\pi(\tau)}, \quad \tau \in \{1, 2, \dots, 56\}\]
Tablonun ilk elemanlarına göre:
\[\pi(1) = 57 \implies k'_1 = k_{57}, \qquad \pi(2) = 49 \implies k'_2 = k_{49}, \qquad \dots\]
Elde edilen bu 56 bit, tablonun üst yarısına karşılık gelen \(C_0\) ve alt yarısına karşılık gelen \(D_0\) olmak üzere ikiye bölünür:
\[ K_{56} = \underbrace{k_{57}, k_{49}, \dots, k_{36}}_{C_0 \;(\text{sol yarı} - 28\ \text{bit})} \;\;\; \underbrace{k_{63}, k_{55}, \dots, k_{4}}_{D_0 \;(\text{sağ yarı} - 28\ \text{bit})} \]
Adım 2 — Dairesel Sola Kaydırma (Circular Left Shift)
Algoritma 16 döngü boyunca \(C\) ve \(D\) yarılarını kendi içlerinde sola kaydırarak sürekli günceller. “Dairesel” olmasının anlamı şudur: sınırın dışına çıkan bit silinmez, bloğun en sağına geri döner.
8 bitlik bir \(X\) bloğumuz olsun: \(X = \mathbf{1}0110011\).
Bir bit sola kaydırıldığında en soldaki \(\mathbf{1}\) kopar ve en sağa kuyruk olur:
\[X' = 0110011\mathbf{1}\]
Kaydırma miktarı döngü numarasına göre sabittir:
- 1., 2., 9. ve 16. döngülerde: yalnızca 1 bit dairesel kaydırılır.
- Diğer tüm döngülerde: 2 bit dairesel kaydırılır.
Örneğin ilk iki döngü için yeni yarılar şöyle oluşur:
\[ \begin{aligned} C_1 &= \operatorname{LeftShift}(C_0, 1), \qquad D_1 = \operatorname{LeftShift}(D_0, 1) \\ C_2 &= \operatorname{LeftShift}(C_1, 1), \qquad D_2 = \operatorname{LeftShift}(D_1, 1) \end{aligned} \]
Adım 3 — PC-2: Sıkıştırma Permütasyonu
Döngüye ait kaydırılmış \(C_i\) ve \(D_i\) yarıları yan yana getirilerek birleştirilir (\(28 + 28 = 56\) bit). Ancak şifreleme çekirdeği (Feistel fonksiyonu) her döngüde 48 bitlik bir anahtara ihtiyaç duyar.
Bu noktada PC-2 (Permuted Choice 2) tablosu devreye girer. Tablo bir filtre gibi davranır: 56 bitlik diziyi karıştırır ve içinden önceden belirlenmiş 8 biti atarak (sıkıştırarak) o döngünün 48 bitlik \(K_i\) alt anahtarını üretir.
| 14 | 17 | 11 | 24 | 1 | 5 |
| 3 | 28 | 15 | 6 | 21 | 10 |
| 23 | 19 | 12 | 4 | 26 | 8 |
| 16 | 7 | 27 | 20 | 13 | 2 |
| 41 | 52 | 31 | 37 | 47 | 55 |
| 30 | 40 | 51 | 45 | 33 | 48 |
| 44 | 49 | 39 | 56 | 34 | 53 |
| 46 | 42 | 50 | 36 | 29 | 32 |
Matematiksel dönüşümün özeti şöyledir:
\[ \begin{aligned} \underbrace{C_i}_{28\text{-bit}} \;\|\; \underbrace{D_i}_{28\text{-bit}} \quad &\xrightarrow{\ \text{birleştirilir}\ } \quad CD_i \ (56\text{-bit}) \\[0.4em] CD_i \ (56\text{-bit}) \quad &\xrightarrow{\ \text{PC-2 filtresi}\ } \quad K_i \ (48\text{-bit alt anahtar}) \end{aligned} \]
Bu üç adım 16 döngünün tamamı için zincirleme olarak tekrarlanır ve şifreleme işleminde kullanılacak 16 alt anahtardan oluşan set hazır hâle getirilmiş olur. Artık elimizde \(K_1, K_2, \dots, K_{16}\) var; sıra bu anahtarlarla verinin kendisini şifrelemeye geldi.
18.4 Şifrelemenin Genel Akışı
64 bitlik bir açık metin bloğu, DES’in içinden şu duraklardan geçerek çıkar:
- Başlangıç permütasyonu (IP — Initial Permutation): Bloğun 64 biti, sabit bir tabloya göre yeniden sıralanır.
- 16 Feistel döngüsü: Blok iki yarıya bölünür ve her döngüde anahtar üretiminden gelen \(K_1, K_2, \dots, K_{16}\) alt anahtarlarından biri kullanılarak dönüştürülür.
- Son takas (swap): 16. döngünün ardından 32 bitlik iki yarı birbiriyle yer değiştirir.
- Ters permütasyon (\(IP^{-1}\)): Başlangıçtaki sıralama işleminin tam tersi uygulanır ve 64 bitlik şifreli metin bloğu elde edilir.
Akışı sembollerle özetlersek:
\[ \text{açık metin} \;\xrightarrow{\ IP\ }\; (L_0, R_0) \;\xrightarrow{\ 16\ \text{döngü}\ }\; (L_{16}, R_{16}) \;\xrightarrow{\ \text{takas}\ }\; (R_{16}, L_{16}) \;\xrightarrow{\ IP^{-1}\ }\; \text{şifreli metin} \]
Başlangıç permütasyonu \(IP\) ve tersi \(IP^{-1}\), bitleri yalnızca sabit ve herkesçe bilinen bir düzende yeniden sıralar; anahtara hiç dokunmaz. Bu yüzden kriptografik güce sıfır katkısı vardır. Varlık nedeni tamamen tarihseldir: 1970’lerin donanımlarında verinin yongaya yükleniş sırasını kolaylaştırmak için eklenmiştir. Matematiksel bir ders vermediği için bu tabloyu basmıyoruz; asıl olay birazdan geleceğimiz 16 döngünün içindedir.
18.5 Feistel Yapısı
\(IP\)’den çıkan 64 bitlik blok, tıpkı anahtarın \(C_0\) ve \(D_0\) olarak bölünmesi gibi, iki eşit yarıya ayrılır: soldaki 32 bit \(L_0\) (left), sağdaki 32 bit \(R_0\) (right). Bundan sonraki 16 döngünün her biri, IBM mühendisi Horst Feistel’in adını taşıyan tek ve çok zarif bir kurala göre işler:
\[ L_i = R_{i-1}, \qquad R_i = L_{i-1} \oplus f(R_{i-1},\, K_i) \]
Kelimelerle söylersek: sağ yarı hiç değişmeden çaprazlama sola taşınır; sol yarı ise, sağ yarının \(f\) adlı bir fonksiyondan geçirilmiş hâliyle XOR’lanarak yeni sağ yarıyı oluşturur. \(f\)’nin içini birazdan açacağız; şimdilik onu “sağ yarı ile alt anahtarı öğüten bir karıştırıcı kutu” olarak düşünmemiz yeterli.
Bu yapının neden dâhice olduğunu görmek için kendimize şu soruyu soralım: mesajı alan taraf bu işlemi nasıl geri saracak? \(f\) karmaşık bir karıştırıcıysa, geri dönmek için \(f\)’nin tersini hesaplamak gerekmez mi? İşte Feistel yapısının bütün sırrı, cevabın hayır olmasıdır.
Teorem 18.1 (Feistel Yapısının Tersinirliği) \(f\) fonksiyonu ne olursa olsun — tersinir olmasa, hatta bilgi kaybettirse bile — Feistel döngüsü her zaman tersinirdir. \((L_i, R_i)\) çiftinden bir önceki \((L_{i-1}, R_{i-1})\) çifti şu formüllerle geri kazanılır:
\[ R_{i-1} = L_i, \qquad L_{i-1} = R_i \oplus f(L_i,\, K_i) \]
İspat
Birinci eşitlik döngü kuralının doğrudan kendisidir: \(L_i = R_{i-1}\) tanımlandığına göre \(R_{i-1} = L_i\) olur; sağ yarı zaten hiç şifrelenmeden karşıya taşınmıştır.
İkinci eşitlik için \(R_i\)’nin tanımını yerine yazalım ve az önce bulduğumuz \(R_{i-1} = L_i\) eşitliğini kullanalım:
\[ R_i \oplus f(L_i, K_i) = \Bigl(L_{i-1} \oplus f(R_{i-1}, K_i)\Bigr) \oplus f(R_{i-1}, K_i) \]
XOR bölümünde gördüğümüz birleşme özelliğiyle parantezi kaydıralım ve kendi kendini yok etme özelliğini (\(A \oplus A = 0\)) uygulayalım:
\[ = L_{i-1} \oplus \underbrace{\Bigl(f(R_{i-1}, K_i) \oplus f(R_{i-1}, K_i)\Bigr)}_{=\,0} = L_{i-1} \oplus 0 = L_{i-1} \]
Dikkat edilirse bu adımların hiçbirinde \(f\)’nin tersini almadık; \(f\)’yi yalnızca ileri yönde, elimizde zaten bulunan \(L_i = R_{i-1}\) girdisiyle bir kez daha hesapladık. \(\blacksquare\)
Teorem 18.1’in pratik sonucu muazzamdır: DES’te şifre çözmek için ayrı bir algoritma yoktur. Şifreli metni aynı 16 döngülük devreye sokar, alt anahtarları yalnızca ters sırada (\(K_{16}, K_{15}, \dots, K_1\)) verirsiniz; devre her döngüyü kendiliğinden geri sarar.
Bu, 1970’lerin pahalı donanım çağında bir deha hamlesiydi: tek bir yonga hem şifreleme hem çözme yapabiliyordu. Daha da önemlisi, tasarımcılara tam bir özgürlük verdi — madem yapının tersinirliği \(f\)’ye hiç bağlı değil, o hâlde \(f\) istediğimiz kadar vahşi ve doğrusal olmayan bir karıştırıcı olabilir. Şimdi bu özgürlüğün nasıl kullanıldığına bakalım.
18.6 Kalp: f Fonksiyonu
DES’in bütün kriptografik gücü, her döngüde çalışan \(f(R_{i-1}, K_i)\) fonksiyonunda toplanmıştır. \(f\), 32 bitlik sağ yarıyı ve 48 bitlik alt anahtarı alıp 32 bitlik bir çıktı üretir; bunu dört aşamada yapar.
Aşama 1 — Genişletme E: 32 Bitten 48 Bite
İlk sorun boyut uyuşmazlığıdır: elimizdeki yarı 32 bit, alt anahtar \(K_i\) ise 48 bittir. Genişletme tablosu E (expansion), tıpkı PC-1 ve PC-2 gibi konum indeksleriyle çalışan bir seçim tablosudur; ancak bu kez bit atmak yerine bit çoğaltır:
| 32 | 1 | 2 | 3 | 4 | 5 |
| 4 | 5 | 6 | 7 | 8 | 9 |
| 8 | 9 | 10 | 11 | 12 | 13 |
| 12 | 13 | 14 | 15 | 16 | 17 |
| 16 | 17 | 18 | 19 | 20 | 21 |
| 20 | 21 | 22 | 23 | 24 | 25 |
| 24 | 25 | 26 | 27 | 28 | 29 |
| 28 | 29 | 30 | 31 | 32 | 1 |
Tabloyu dikkatle sayarsanız 48 hücrede yalnızca 32 farklı indeks görürsünüz: 16 kenar biti iki kez kullanılır (\(48 = 32 + 16\)). Bu bilinçli bir tekrardır — bir bit iki komşu gruba birden sızdığı için, tek bir girdi bitindeki değişiklik ilerleyen aşamalarda birden fazla S-kutusunu etkiler. Çığ etkisini besleyen yayılma (diffusion) çarklarından ilki burada döner.
Aşama 2 — Alt Anahtarla Karıştırma
Genişletilmiş 48 bit, o döngünün alt anahtarıyla XOR’lanır:
\[ E(R_{i-1}) \oplus K_i \]
Gösterişsiz görünen bu tek satır aslında kritik bir gerçeği saklar: anahtar, DES’in veri yoluna yalnızca burada girer. Permütasyonlar, genişletmeler, S-kutuları — hepsi sabit ve herkesçe bilinir; gizli olan tek şey bu XOR’a karışan 48 bittir.
Aşama 3 — S-Kutuları: Doğrusal Olmayan Kalp
XOR’dan çıkan 48 bit, 6’şar bitlik 8 gruba bölünür ve her grup kendi S-kutusuna (substitution box) girer: \(S_1, S_2, \dots, S_8\). Her kutu 6 bitlik girdisini 4 bitlik bir çıktıya dönüştürür; böylece \(8 \cdot 6 = 48\) bit içeri girer, \(8 \cdot 4 = 32\) bit dışarı çıkar.
Bir S-kutusu, satır ve sütunlardan oluşan sabit bir arama tablosudur. 6 bitlik \(b_1 b_2 b_3 b_4 b_5 b_6\) girdisinin adresi şöyle çözülür:
- Dış iki bit \(b_1 b_6\) birleştirilir ve satır numarasını verir: \(0\)–\(3\) arası.
- İç dört bit \(b_2 b_3 b_4 b_5\) sütun numarasını verir: \(0\)–\(15\) arası.
Kesişimdeki sayı (0–15 arası) kutunun çıktısıdır ve 4 bit olarak yazılır. İşte \(S_1\) kutusunun resmî tablosu:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 14 | 4 | 13 | 1 | 2 | 15 | 11 | 8 | 3 | 10 | 6 | 12 | 5 | 9 | 0 | 7 |
| 1 | 0 | 15 | 7 | 4 | 14 | 2 | 13 | 1 | 10 | 6 | 12 | 11 | 9 | 5 | 3 | 8 |
| 2 | 4 | 1 | 14 | 8 | 13 | 6 | 2 | 11 | 15 | 12 | 9 | 7 | 3 | 10 | 5 | 0 |
| 3 | 15 | 12 | 8 | 2 | 4 | 9 | 1 | 7 | 5 | 11 | 3 | 14 | 10 | 0 | 6 | 13 |
Örnek 18.1 \(S_1\) kutusuna 6 bitlik \(011011\) dizisi giriyor. Kutunun 4 bitlik çıktısını bulunuz.
Çözüm
Girdiyi bit bit adlandıralım: \(b_1 b_2 b_3 b_4 b_5 b_6 = 0\,1\,1\,0\,1\,1\).
Satır: dış bitler \(b_1 b_6 = 01\), yani ikilik sistemde \(01_2 = 1\). Satır \(1\).
Sütun: iç bitler \(b_2 b_3 b_4 b_5 = 1101\), yani \(1101_2 = 8 + 4 + 0 + 1 = 13\). Sütun \(13\).
Tablo 18.4’de satır \(1\) ile sütun \(13\)’ün kesişiminde \(5\) yazar. Çıktı, \(5\) sayısının 4 bitlik gösterimidir:
\[ 011011 \;\xrightarrow{\ S_1\ }\; 5 = 0101 \]
Kutuya 6 bit girdi, 4 bit çıktı; dizinin boyu kutunun içinde eridi. \(\boxtimes\)
\(S_2, S_3, \dots, S_8\) kutuları da tamamen aynı mantıkla çalışan, standartta sabitlenmiş farklı tablolardır; sekizini birden basarak sayfayı işgal etmeyeceğiz.
Asıl vurgulanması gereken şudur: permütasyonlar, genişletme ve XOR’un tamamı doğrusal işlemlerdir — girdiyle çıktı arasında denklem sistemleriyle çözülebilecek düzgün bir cebirsel ilişki korurlar. S-kutuları ise DES’in doğrusal olmayan tek bileşenidir. Shannon’un diliyle söylersek, karışıklık (confusion) prensibinin bu şifredeki tek taşıyıcısı S-kutularıdır: anahtar ile şifreli metin arasındaki ilişkiyi denklemle izlenemez hâle getiren adım budur. Tarihsel bir not olarak, 1970’lerde NSA’in bu kutuların sabitlerini kimseye gerekçe göstermeden değiştirmesi yıllarca “arka kapı mı gizlendi?” tartışması yaratmış; ancak diferansiyel kriptanaliz 1990’larda kamuya açık olarak keşfedilince, değişikliklerin kutuları tam da bu saldırıya karşı güçlendirdiği anlaşılmıştır.
Aşama 4 — P Permütasyonu
Sekiz kutudan çıkan \(8 \cdot 4 = 32\) bit son olarak P permütasyonundan geçer; bu tablo hiçbir biti atmadan 32 bitin yerlerini değiştirir:
| 16 | 7 | 20 | 21 |
| 29 | 12 | 28 | 17 |
| 1 | 15 | 23 | 26 |
| 5 | 18 | 31 | 10 |
| 2 | 8 | 24 | 14 |
| 32 | 27 | 3 | 9 |
| 19 | 13 | 30 | 6 |
| 22 | 11 | 4 | 25 |
P’nin görevi, her S-kutusunun 4 bitlik çıktısını bloğun dört bir yanına savurmaktır: aynı kutudan çıkan bitler, bir sonraki döngüde E genişletmesi tarafından farklı S-kutularına dağıtılır. Bu, Shannon’un yayılma (diffusion) prensibinin ta kendisidir — tek bir bitlik değişim, birkaç döngü içinde bloğun tamamına bulaşır ve çığ etkisi doğar.
18.7 Şifre Çözme
Şifre çözme bölümü, DES anlatımlarının en kısa bölümüdür ve bunu Teorem 18.1’e borçluyuz. Alıcı taraf, şifreli metni aynı algoritmadan geçirir; tek fark alt anahtarların sırasıdır: ilk döngüye \(K_{16}\), ikincisine \(K_{15}\), sonuncusuna \(K_1\) verilir. Her döngü, teoremdeki \(R_{i-1} = L_i\) ve \(L_{i-1} = R_i \oplus f(L_i, K_i)\) formülleri gereği bir öncekini geri sarar; \(f\)’nin, S-kutularının veya P’nin tersini hesaplamak hiçbir zaman gerekmez.
Akışın uçlarındaki yardımcı adımlar da kendiliğinden temizlenir: \(IP\) ile \(IP^{-1}\) zaten birbirinin tersidir, son takas ise iki yarıyı değiştirmekten ibaret olduğundan kendi kendisinin tersidir. Yeni bir matematik yok; şifreleme devresini kurduğumuz anda çözme devresini de bedavaya almış olduk.
18.8 DES’in Sonu: Kaba Kuvvetin Zaferi
DES’in mimarisi bugün bile saygı duyulan bir tasarımdır; onu emekliye ayıran şey yapısındaki bir çatlak değil, anahtarının kısalığıdır. Efektif anahtar 56 bit olduğuna göre anahtar uzayı
\[ 2^{56} \approx 7{,}2 \cdot 10^{16} \]
anahtardan oluşur. 1977’de bu sayı aşılamaz bir duvar gibi görünüyordu; ancak Moore yasası duvarı her 18 ayda bir inceltti ve 1990’ların sonunda üç darbe art arda geldi:
- 1997 — DESCHALL: RSA firmasının ödüllü meydan okuması, internet üzerinden anahtar uzayını paylaşan binlerce gönüllü bilgisayarın ortak çalışmasıyla yaklaşık 96 günde sonuçlandı; bir DES anahtarı ilk kez halka açık biçimde kaba kuvvetle bulundu.
- 1998 — Deep Crack: Electronic Frontier Foundation (EFF), yaklaşık 250 000 dolarlık bütçeyle Deep Crack adında özel amaçlı bir makine inşa etti. Bu makine bir DES anahtarını yaklaşık 56 saatte buldu — artık sıradan zengin bir kurumun bile DES kırabileceği kanıtlanmıştı.
- 1999 — 22 saat: Deep Crack ile distributed.net ağındaki on binlerce bilgisayar güçlerini birleştirdi ve süre 22 saat 15 dakikaya düştü.
Akademik cephede diferansiyel kriptanaliz (\(2^{47}\) seçilmiş açık metin) ve lineer kriptanaliz (\(2^{43}\) bilinen açık metin) gibi kaba kuvvetten “daha akıllı” saldırılar da bulunmuştur; ancak bu kadar veriyi toplamak pratikte imkânsıza yakındır. DES’i tarihe gömen, zarif bir matematiksel gedik değil, ham hesaplama gücü olmuştur.
18.9 Çifte DES Neden Çare Değil? Ortada Buluşma Saldırısı
Anahtar kısaysa akla ilk gelen yama bellidir: DES’i iki farklı anahtarla art arda iki kez uygulamak. Bu yapıya 2DES denir:
\[ C = E_{K_2}\!\bigl(E_{K_1}(P)\bigr) \]
Toplam \(56 + 56 = 112\) bitlik anahtar malzemesi kullanıldığına göre güvenliğin de \(2^{112}\)’lik bir aramaya denk gelmesini bekleriz. Ne yazık ki bu beklenti yanlıştır. Denklemin iki tarafına \(D_{K_2}\) uygularsak şifrelemenin tam ortasındaki değeri iki yönden de yakalayabileceğimizi görürüz:
\[ D_{K_2}(C) = E_{K_1}(P) \]
Eşitliğin sağı orta değere açık metinden ileri giderek, solu ise şifreli metinden geri gelerek ulaşır. Elinde tek bir \((P, C)\) çifti olan bir saldırgan bunu şöyle sömürür: önce \(2^{56}\) olası \(K_1\) anahtarının her biri için \(E_{K_1}(P)\) değerini hesaplayıp sonuçları bir tabloya koyar. Ardından \(2^{56}\) olası \(K_2\) anahtarının her biri için \(D_{K_2}(C)\) değerini hesaplar ve her sonucu tabloda arar. İki liste ortada buluştuğunda — yani bir \(D_{K_2}(C)\) değeri tabloda bulunduğunda — eldeki \((K_1, K_2)\) çifti güçlü bir adaydır; birkaç yedek \((P, C)\) çiftiyle doğrulanarak kesinleştirilir.
Bu saldırıya ortada buluşma (meet-in-the-middle) denir ve maliyeti iki tam aramanın toplamıdır: \(2^{56} + 2^{56} = 2^{57}\) DES işlemi (artı \(2^{56}\) girdilik tablo için devasa ama ilkesel olarak mümkün bir bellek). Yani 2DES, kâğıt üstünde 112 bitlik görünse de, kırması tek DES’in yalnızca iki katı iş gerektiren bir hedeftir.
Örnek 18.2 Ortada buluşma saldırısı, 2DES’e yönelik saf kaba kuvvet aramasını kaç kat ucuzlatır?
Çözüm
Saf kaba kuvvet, \(112\) bitlik anahtar malzemesinin tamamını tarar: \(2^{112}\) deneme. Ortada buluşma ise \(2^{57}\) işlemle sonuca ulaşır. Kazanç oranı:
\[ \frac{2^{112}}{2^{57}} = 2^{55} \approx 3{,}6 \cdot 10^{16} \]
Saldırı, işlem sayısını yaklaşık 36 katrilyon kat azaltır; “iki kat şifrele, iki kat güvenli ol” sezgisi paramparça olur. \(\boxtimes\)
18.10 Üçlü DES (3DES)
Madem iki katman yetmiyor, üç katmana çıkalım. 3DES (Triple DES), DES’i üç anahtarla art arda uygular; ancak dizilim şaşırtıcıdır — şifrele, çöz, şifrele:
\[ C = E_{K_3}\!\Bigl(D_{K_2}\bigl(E_{K_1}(P)\bigr)\Bigr) \]
Ortadaki adımın şifre çözme olması güvenlikle ilgili değildir; \(D\) de \(E\) kadar iyi bir karıştırıcıdır. Sebep tamamen mühendislik zekâsıdır:
Üç anahtar da aynı seçilirse (\(K_1 = K_2 = K_3 = K\)) ortadaki \(D_K\), ilk \(E_K\)’yi tam olarak geri alır ve zincirden geriye yalnızca son \(E_K\) kalır:
\[ E_K\!\Bigl(D_K\bigl(E_K(P)\bigr)\Bigr) = E_K(P) \]
Yani bir 3DES yongası, anahtarları eşitleyerek sıradan bir DES cihazı gibi çalıştırılabilir. Sahadaki milyonlarca eski DES donanımıyla haberleşebilmek — 1990’ların bankacılık dünyasında paha biçilmez bir özellik — E-D-E diziliminin tek ve yeterli gerekçesidir. E-E-E dizilimi bu zarif geri çekilme yolunu kapatırdı.
Anahtarların nasıl seçildiğine göre üç standart kullanım biçimi vardır:
| Seçenek | Anahtar ilişkisi | Nominal boyut | Efektif güvenlik |
|---|---|---|---|
| 3 bağımsız anahtar | \(K_1 \neq K_2 \neq K_3\) | 168 bit | Ortada buluşma nedeniyle \(\approx 112\) bit |
| 2 anahtar | \(K_1 = K_3 \neq K_2\) | 112 bit | Pratik saldırılar daha da aşağı çeker |
| Tek anahtar | \(K_1 = K_2 = K_3\) | 56 bit | Tek DES’e eşdeğer — yalnızca geriye uyumluluk |
Tabloya dikkat: üç bağımsız anahtar bile \(168\) bitlik nominal gücü vermez; bir önceki bölümdeki ortada buluşma fikri 3DES’e de uyarlanabildiğinden efektif güvenlik \(2^{112}\) mertebesinde kalır.
3DES görevini onlarca yıl onurluca yaptı, ama iki yapısal yükten hiç kurtulamadı: her blok için DES’in üç kez çalışması gerektiğinden üç kat yavaştır ve blok boyu hâlâ 64 bittir — büyük veri hacimlerinde doğum günü paradoksu yüzünden blok çakışmaları istatistiksel bilgi sızdırmaya başlar (2016’da gösterilen Sweet32 zafiyetinin özü budur). Nitekim NIST, 3DES’i 2019’da resmen “kullanımdan kaldırılıyor (deprecated)” statüsüne aldı ve 31 Aralık 2023 itibarıyla yeni uygulamalardaki kullanımını tamamen sonlandırdı.
Kısa anahtar sorununa yama üstüne yama yapmak yerine sıfırdan, modern ilkelerle tasarlanmış bir şifreye geçmek gerekiyordu. O şifre, bir sonraki bölümün konusu olan AES’tir.