17 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.
17.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.
17.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.
17.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 key schedule (anahtar zamanlaması) 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.