19  AES (Advanced Encryption Standard) ve SPN Yapısı

DES bölümünde gördüğümüz tablo açıktı: 56 bitlik efektif anahtar, 1990’ların sonunda kaba kuvvet saldırılarına günler hatta saatler içinde yenik düşüyordu. Geçici çare olan 3DES ise güvenliği kurtarsa da üç kat şifreleme yükü nedeniyle yavaştı. Dijital çağın yeni bir standarda ihtiyacı vardı.

19.1 DES’ten AES’e: Açık Bir Yarışma

1997’de NIST (Amerikan Ulusal Standartlar ve Teknoloji Enstitüsü) tarihinin en önemli kararlarından birini verdi: yeni standardı kapalı kapılar ardında değil, herkese açık bir yarışmayla seçecekti. Dünyanın dört bir yanından gelen 15 aday algoritma 1998’de duyuruldu; üç yıl boyunca uluslararası kriptografi topluluğu bu adayları kırmak için yarıştı. Ekim 2000’de kazanan ilan edildi: Belçikalı kriptograflar Joan Daemen ve Vincent Rijmen’in tasarladığı Rijndael algoritması. Algoritma, Kasım 2001’de FIPS-197 belgesiyle resmî standart hâline geldi ve o günden beri AES (Advanced Encryption Standard) adıyla anılıyor.

NotAçıklık bir zayıflık değil, güçtür

Bu yarışma, Kerckhoffs prensibinin eylemdeki hâlidir: algoritmanın her satırı yıllarca dünyanın en iyi kriptanalistlerinin saldırısına açık tutulmuş, güvenlik yalnızca anahtarın gizliliğine emanet edilmiştir. DES’in S-kutularının gizemli tasarım kriterlerinin yarattığı “arka kapı mı var?” kuşkusunun tam tersi bir yaklaşımdır bu.

Mimari açıdan AES, DES’ten köklü biçimde ayrılır. DES bir Feistel ağıydı: her döngüde bloğun yalnızca yarısı işlenir, bu sayede çekirdek fonksiyon tersinir olmasa bile şifre çözülebilirdi. AES ise Shannon bölümünde tanıttığımız SPN (Substitution-Permutation Network — yerine koyma–permütasyon ağı) mimarisini kullanır: her döngüde bloğun tamamı dönüştürülür. Bunun bedeli, şifre çözmenin çalışabilmesi için her adımın kendi başına tersinir olmak zorunda olmasıdır — birazdan her adımın bu koşulu nasıl sağladığını tek tek göreceğiz.

19.2 Durum Matrisi (State)

AES, veriyi her zaman 128 bitlik bloklar hâlinde işler. Algoritmanın zarif taraflarından biri, bu 128 biti uzun bir bit dizisi olarak değil, kompakt bir tablo olarak ele almasıdır.

Tanım 19.1 (Durum Matrisi (State)) 128 bitlik blok 16 bayta bölünür ve baytlar sütun sütun \(4 \times 4\)’lük bir matrise yerleştirilir. Bu matrise durum (state) denir. Giriş dizisinin baytlarını \(\text{in}_0, \text{in}_1, \dots, \text{in}_{15}\) ile gösterirsek yerleştirme kuralı şudur:

\[s_{r,c} = \text{in}_{r + 4c}, \qquad 0 \le r, c \le 3\]

Yani ilk dört bayt birinci sütunu, sonraki dört bayt ikinci sütunu doldurur. Örneğin \(s_{1,2} = \text{in}_9\) olur.

16 baytlık giriş dizisi in₀, in₁, …, in₁₅ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 r = 0 r = 1 r = 2 r = 3 0 1 2 3 sütun c yerleştirme kuralı: sr,c = inr + 4c örnek: s1,2 = in9
128 bitlik blok, 16 bayt olarak sütun sütun 4×4 durum matrisine yerleştirilir: ilk dört bayt birinci sütunu, sonraki dört bayt ikinci sütunu doldurur. Hücredeki sayı baytın giriş dizisindeki sırasıdır; kural sr,c = inr+4c.

Bundan sonraki her AES işlemi bu matris üzerinde çalışır: kimi adım hücreleri tek tek, kimi satırları, kimi de sütunları dönüştürür. Kritik nokta şudur: matrisin her hücresi sıradan bir bayt değil, bir önceki bölümde inşa ettiğimiz \(\mathrm{GF}(2^8)\) cisminin bir elemanıdır. Toplama XOR’dur, çarpma \(m(x)\) modülünde polinom çarpımıdır — AES’in tüm aritmetiği bu cisimde döner.

19.3 Üç Sürüm, Tek Blok Boyutu

AES’in üç resmî sürümü vardır ve aralarındaki fark yalnızca anahtar uzunluğudur; blok her sürümde 128 bittir. Anahtar, 32 bitlik kelimeler (word) hâlinde sayılır ve kelime sayısı \(N_k\) ile gösterilir. Anahtar uzadıkça döngü sayısı \(N_r\) de artar:

Tablo 19.1: AES sürümleri — blok her zaman 128 bittir, yalnızca anahtar uzunluğu değişir
Sürüm Anahtar uzunluğu Anahtar kelime sayısı (\(N_k\)) Döngü sayısı (\(N_r\)) Tur anahtarı sayısı (\(N_r + 1\))
AES-128 128 bit 4 10 11
AES-192 192 bit 6 12 13
AES-256 256 bit 8 14 15

Daha uzun anahtar neden daha çok döngü gerektirir? Uzun anahtar daha büyük bir saldırı yüzeyi (özellikle anahtar genişletme üzerinden gelen ilişkili-anahtar teknikleri) sunar; ek döngüler bu sürümlere daha geniş bir güvenlik payı bırakır. Tur anahtarı sayısının \(N_r + 1\) olmasının nedenini de birazdan göreceğiz: döngüler başlamadan önce fazladan bir anahtar karıştırma adımı vardır.

19.4 Bir Döngünün Anatomisi

Şifreleme, durum matrisinin üzerinden defalarca geçen dört temel işlemin bestesidir. Akış şöyledir:

  1. Başlangıç: Daha ilk döngü başlamadan durum, ilk tur anahtarıyla XOR’lanır (AddRoundKey). Bu adıma beyazlatma (whitening) denir; amaç, saldırganın anahtardan bağımsız tek bir işlem bile gözlemleyememesidir.
  2. Tam döngüler: \(N_r - 1\) kez şu dörtlü sırayla uygulanır: SubBytes → ShiftRows → MixColumns → AddRoundKey.
  3. Son döngü: Aynı sıra, ama MixColumns atlanarak: SubBytes → ShiftRows → AddRoundKey.
açık metin bloğu (128 bit) AddRoundKey beyazlatma — K₀ SubBytes ShiftRows MixColumns AddRoundKey karışıklık yayılma anahtar ×(Nr − 1) döngü SubBytes ShiftRows AddRoundKey son döngü: MixColumns yok şifreli metin (128 bit)
AES şifrelemesinin akışı: önce beyazlatma amacıyla bir AddRoundKey, ardından Nr − 1 kez tekrarlanan tam döngü ve MixColumns adımı atılmış son döngü. Mavi kutular veri dönüşümlerini, yeşil kutular anahtarın karıştırıldığı adımı gösterir.

Son döngüde MixColumns’un atlanmasının nedeni basittir: MixColumns doğrusal ve anahtardan bağımsız olduğundan, sondaki bir MixColumns saldırganın şifreli metne InvMixColumns uygulayıp son tur anahtarını eşdeğer bir anahtarla değiştirmesiyle bedavaya soyulabilir — güvenliğe hiçbir katkısı yoktur. Atılması ise şifreleme ile şifre çözme yapısını birbirine simetrik hâle getirir.

Bu dört işlem, Shannon’un iki prensibinin doğrudan mühendislik karşılığıdır:

  • SubByteskarışıklık (confusion): doğrusal olmayan bayt değişimi.
  • ShiftRows + MixColumnsyayılma (diffusion): baytları önce satırlar, sonra sütunlar boyunca tüm bloğa dağıtır.
  • AddRoundKeyanahtarın karıştırılması: anahtar malzemesinin veriye işlendiği tek adım.

Şimdi her adımı yakından inceleyelim.

19.5 SubBytes — S-Kutusu

SubBytes, durumun 16 baytının her birini sabit bir tabloya — S-kutusuna (S-box) — göre değiştirir. DES’in sekiz küçük S-kutusunun aksine AES’in tek ve 256 girdili bir S-kutusu vardır; asıl fark ise tasarım felsefesindedir: AES’in S-kutusu keyfî bir tablo değildir, temiz bir matematiksel formülden üretilir.

Tanım 19.2 (AES S-Kutusu) Bir \(x\) baytının S-kutusu değeri iki adımda hesaplanır:

  1. Cisim tersi: \(x\)’in \(\mathrm{GF}(2^8)\) içindeki çarpımsal tersi \(x^{-1}\) alınır (terslerin varlığını biliyoruz); tersi olmayan tek eleman için \(\{00\} \mapsto \{00\}\) kabul edilir.
  2. Affine dönüşüm: Çıkan baytın bitlerine sabit bir doğrusal karıştırma uygulanır ve üzerine \(\{63\}\) sabiti XOR’lanır. Bit düzeyinde kural şudur (\(c = \{63\} = 01100011\) olmak üzere):

\[b'_i = b_i \oplus b_{(i+4) \bmod 8} \oplus b_{(i+5) \bmod 8} \oplus b_{(i+6) \bmod 8} \oplus b_{(i+7) \bmod 8} \oplus c_i\]

Tablonun 256 girdisini buraya dökmenin bir anlamı yok; önemli olan üretim reçetesidir. Bir girdiyi baştan sona kendimiz hesaplayalım.

Örnek 19.1 \(S(\{53\})\) değerini, yani \(\{53\}\) baytının S-kutusu karşılığını hesaplayınız.

Çözüm

Adım 1 — cisim tersi. Sonlu cisimler bölümündeki yöntemlerle (deneme ya da genişletilmiş Öklid algoritması) \(\{53\}\)’ün tersi bulunur:

\[\{53\}^{-1} = \{CA\}\]

Sağlaması: \(\{53\} \cdot \{CA\} = \{01\}\).

Adım 2 — affine dönüşüm. \(\{CA\} = 11001010\) baytının bitleri (sağdan sola) \(b_0 = 0\), \(b_1 = 1\), \(b_2 = 0\), \(b_3 = 1\), \(b_4 = 0\), \(b_5 = 0\), \(b_6 = 1\), \(b_7 = 1\)’dir. Formülü ilk iki bite uygulayalım (\(c_0 = 1\), \(c_1 = 1\)):

\[ \begin{aligned} b'_0 &= b_0 \oplus b_4 \oplus b_5 \oplus b_6 \oplus b_7 \oplus c_0 = 0 \oplus 0 \oplus 0 \oplus 1 \oplus 1 \oplus 1 = 1 \\ b'_1 &= b_1 \oplus b_5 \oplus b_6 \oplus b_7 \oplus b_0 \oplus c_1 = 1 \oplus 0 \oplus 1 \oplus 1 \oplus 0 \oplus 1 = 0 \end{aligned} \]

Aynı hesap sekiz bitin tamamı için tekrarlandığında sonuç \(11101101\) çıkar:

\[S(\{53\}) = \{ED\}\]

Bu değer FIPS-197’deki resmî S-kutusu tablosuyla birebir örtüşür.

\(\boxtimes\)

Peki neden bu kadar zahmetli bir reçete? Çünkü \(x \mapsto x^{-1}\) dönüşümü \(\mathrm{GF}(2^8)\) üzerinde bilinen en doğrusal olmayan fonksiyonlardan biridir; bu da diferansiyel ve doğrusal kriptanaliz gibi DES döneminde geliştirilen güçlü saldırı ailelerine karşı en yüksek direnci sağlar. Affine katman ise cebirsel yapıyı gizler ve \(S(x) = x\) gibi sabit noktaları engeller. Üstelik hem ters alma hem affine dönüşüm tersinir olduğundan bileşke de tersinirdir: şifre çözmede kullanılacak InvSubBytes tablosu her zaman vardır.

19.6 ShiftRows

İkinci adım göz açıp kapayıncaya kadar biter: durumun her satırı, satır numarası kadar sola dairesel kaydırılır. Sıfırıncı satır yerinde kalır; birinci satır 1, ikinci satır 2, üçüncü satır 3 bayt döner.

önce sonra a₀ a₀ a₁ a₁ a₂ a₂ a₃ a₃ b₀ b₁ b₁ b₂ b₂ b₃ b₃ b₀ c₀ c₂ c₁ c₃ c₂ c₀ c₃ c₁ d₀ d₃ d₁ d₀ d₂ d₁ d₃ d₂ değişmez 1 sola 2 sola 3 sola vurgulu sütunun dört baytı dört farklı sütuna dağılır
ShiftRows her satırı kendi numarası kadar sola döndürür: 0. satır sabit kalır, 1. satır bir, 2. satır iki, 3. satır üç bayt kayar. Solda aynı sütunda duran dört bayt (koyu hücreler) sağda dört farklı sütuna dağılmıştır.

Bu masum görünen adımın işlevi kritiktir: kaydırmadan önce aynı sütunda duran dört bayt, kaydırmadan sonra dört farklı sütuna dağılır. Böylece hemen ardından gelen MixColumns, tek bir sütunun etkisini bloğun tamamına taşıyabilir.

19.7 MixColumns

Yayılmanın ağır topu MixColumns’tur. Bu adım durumun her sütununu 4 baytlık bir vektör olarak alır ve onu \(\mathrm{GF}(2^8)\) üzerinde sabit bir matrisle çarpar:

\[ \begin{pmatrix} s'_{0,c} \\ s'_{1,c} \\ s'_{2,c} \\ s'_{3,c} \end{pmatrix} = \begin{pmatrix} \{02\} & \{03\} & \{01\} & \{01\} \\ \{01\} & \{02\} & \{03\} & \{01\} \\ \{01\} & \{01\} & \{02\} & \{03\} \\ \{03\} & \{01\} & \{01\} & \{02\} \end{pmatrix} \begin{pmatrix} s_{0,c} \\ s_{1,c} \\ s_{2,c} \\ s_{3,c} \end{pmatrix} \]

Buradaki toplama XOR, çarpma ise sonlu cisimler bölümünde öğrendiğimiz \(m(x)\) modülünde çarpmadır. Matris girdilerinin \(\{01\}\), \(\{02\}\) ve \(\{03\}\) gibi küçük değerler seçilmesi tesadüf değildir: \(\{02\}\) ile çarpmak tek bir xtime adımı, \(\{03\}\) ile çarpmak xtime artı bir XOR’dur — donanımda ve yazılımda son derece ucuzdur. Sonuçta yeni sütunun her baytı, eski sütunun dört baytının birden fonksiyonudur.

· · · · D4 BF 5D 30 · · · · · · · · durum c sütunu 02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 02 sabit matris D4 BF 5D 30 = 04 66 81 E5 yeni sütun çarpım ve toplam GF(2⁸) içinde: toplama ⊕ (XOR), çarpma mod m(x)
MixColumns durumun her sütununu ayrı ayrı ele alır: sütun, sabit döngüsel matrisle GF(2⁸) üzerinde çarpılır ve yerine yeni sütun yazılır. Örnekteki (D4, BF, 5D, 30) sütunu (04, 66, 81, E5) sütununa dönüşür.

Örnek 19.2 FIPS-197’nin örnek şifrelemesinde, birinci döngüde SubBytes ve ShiftRows adımlarından çıkıp MixColumns’a giren durumun ilk sütunu \((\{D4\}, \{BF\}, \{5D\}, \{30\})\)’dur. MixColumns’un bu sütunu \((\{04\}, \{66\}, \{81\}, \{E5\})\) sütununa dönüştürdüğünü, ilk baytı elle hesaplayarak doğrulayınız.

Çözüm

Matrisin ilk satırına göre yeni sütunun ilk baytı şudur:

\[s'_0 = \{02\} \cdot \{D4\} \oplus \{03\} \cdot \{BF\} \oplus \{5D\} \oplus \{30\}\]

Çarpımları sonlu cisimler bölümündeki xtime hilesiyle hesaplayalım.

\(\{02\} \cdot \{D4\}\): \(\{D4\} = 11010100\)’ü bir bit sola kaydırırız: \(10101000 = \{A8\}\). Taşan bit \(1\) olduğundan \(\{1B\}\) ile XOR’larız:

\[\{A8\} \oplus \{1B\} = \{B3\}\]

\(\{03\} \cdot \{BF\}\): \(\{03\} = \{02\} \oplus \{01\}\) olduğundan bu çarpım \(\operatorname{xtime}(\{BF\}) \oplus \{BF\}\)’dir. \(\{BF\} = 10111111\) kaydırılınca \(01111110 = \{7E\}\); taşma yine var, \(\{7E\} \oplus \{1B\} = \{65\}\). Son olarak:

\[\{65\} \oplus \{BF\} = \{DA\}\]

XOR zinciri: Dört terimi birleştirelim:

\[s'_0 = \{B3\} \oplus \{DA\} \oplus \{5D\} \oplus \{30\} = \{69\} \oplus \{5D\} \oplus \{30\} = \{34\} \oplus \{30\} = \{04\} \checkmark\]

Kalan üç bayt da matrisin diğer satırlarıyla aynı yöntemle hesaplanır ve sırasıyla \(\{66\}\), \(\{81\}\), \(\{E5\}\) bulunur.

\(\boxtimes\)

İpucuİki döngüde tam yayılma

ShiftRows ile MixColumns’un ortak eseri çarpıcıdır: girişteki tek bir baytın etkisi, bir döngüde kendi sütununun tamamına, iki döngüde ise 16 baytın hepsine ulaşır. Shannon bölümünde tanımladığımız çığ etkisinin AES’te bu kadar hızlı oturmasının nedeni budur.

19.8 AddRoundKey

Dördüncü adım en basitidir: durumun 128 biti, o döngünün 128 bitlik tur anahtarıyla (round key) bit bit XOR’lanır. Sadeliğine aldanmayın — bu, algoritmanın anahtara bağlı olan tek adımıdır; SubBytes, ShiftRows ve MixColumns sabit ve herkesçe bilinen dönüşümlerdir. AddRoundKey olmasaydı AES, anahtarsız ve herkesin tersine çevirebileceği süslü bir karıştırmadan ibaret olurdu.

Bu adımın tersi kendisidir: XOR bölümünden bildiğimiz \(A \oplus A = 0\) özelliği sayesinde aynı tur anahtarıyla bir kez daha XOR’lamak durumu eski hâline döndürür.

19.9 Anahtar Genişletme (Key Expansion)

Toplam \(N_r + 1\) tur anahtarı, yani \(4(N_r + 1)\) kelime gerekir — AES-128 için 44 kelime. Tek bir gizli anahtardan bu malzemeyi üreten mekanizmaya anahtar genişletme (key expansion) denir; DES’teki key schedule’ın AES karşılığıdır.

Gizli anahtar önce 32 bitlik kelimeler hâlinde okunur: \(w_0, w_1, \dots, w_{N_k - 1}\). Sonraki her kelime, \(i \ge N_k\) için şu kuralla üretilir:

\[ w_i = w_{i - N_k} \oplus \begin{cases} \operatorname{SubWord}\!\big(\operatorname{RotWord}(w_{i-1})\big) \oplus \operatorname{Rcon}_{i/N_k}, & i \equiv 0 \pmod{N_k} \\[0.4em] w_{i-1}, & \text{aksi hâlde} \end{cases} \]

Buradaki üç yardımcı işlem tek satırda özetlenebilir:

  • RotWord: kelimenin 4 baytını bir bayt sola döndürür — \((a_0, a_1, a_2, a_3) \mapsto (a_1, a_2, a_3, a_0)\).
  • SubWord: kelimenin 4 baytının her birine S-kutusunu uygular.
  • Rcon: ilk baytı \(x\)’in \(\mathrm{GF}(2^8)\) içindeki kuvvetleri (\(\{01\}, \{02\}, \{04\}, \dots, \{36\}\)), kalan üç baytı sıfır olan döngü sabitidir.

(AES-256’da bir ek incelik vardır: \(i \equiv 4 \pmod 8\) olduğunda da kelimeye yalnızca SubWord uygulanır.)

Amaç iki katmanlıdır: RotWord ile SubWord her tur anahtarının bir öncekinden bambaşka görünmesini sağlar; Rcon sabitleri ise tüm döngülerin aynı işleme tabi tutulmasından doğabilecek simetrileri kırar — aynı kelimenin farklı döngülerde aynı sonucu üretmesi engellenir.

19.10 Şifre Çözme

Feistel yapısında şifre çözme neredeyse bedavaydı: DES’te aynı devre, alt anahtarları ters sırada vermekle şifre çözüyordu. SPN’de bu lüks yoktur; bunun yerine her adım tek tek tersine çevrilir. Neyse ki tüm adımlar bu iş için tasarlanmıştır:

  • InvSubBytes: S-kutusunun ters tablosu,
  • InvShiftRows: satırları aynı miktarlarda bu kez sağa döndürme,
  • InvMixColumns: sabit matrisin \(\mathrm{GF}(2^8)\) üzerindeki ters matrisiyle çarpma,
  • AddRoundKey: zaten kendi tersi.

Şifre çözme, bu ters işlemleri şifrelemenin ters sırasında ve tur anahtarlarını sondan başa vererek uygular. Son döngüden MixColumns’un atılmış olması burada meyvesini verir: şifreleme ile şifre çözme akışları birbirinin aynadaki görüntüsü olur.

19.11 Güvenlik Durumu

Yirmi yılı aşkın acımasız bir incelemenin ardından tablo şudur: tam döngülü AES’e karşı bilinen pratik bir saldırı yoktur. Akademik cephedeki en iyi sonuç, 2011’de yayımlanan biclique saldırısıdır: AES-128’in anahtarını yaklaşık \(2^{126{,}1}\) işlemde bulur — kaba kuvvetten yalnızca dört kat kadar hızlı, yani pratikte hiçbir anlamı olmayan marjinal bir iyileştirme. AES-256’ya karşı bilinen ilişkili-anahtar (related-key) saldırıları da yalnızca saldırganın birbirine özel biçimde bağlı anahtarlarla şifreleme yaptırabildiği yapay senaryolarda çalışır; doğru kullanılan protokollerde karşılığı yoktur.

Hızın da güvenliğin bir bileşeni olduğunu unutmayalım: modern işlemcilerdeki AES-NI komut seti, her döngüyü donanımda tek komutla çalıştırır. Bu sayede AES hem telefonunuzdaki disk şifrelemesinde hem de saniyede milyonlarca bağlantı kuran sunucularda hissedilmeyecek kadar hızlıdır — güvenli olduğu için değil, güvenli ve ucuz olduğu için her yerdedir.

Kuantum ufkuna gelince: Grover algoritması kaba kuvvet aramasını karesel hızlandırır, bu da etkin anahtar uzunluğunu kabaca yarıya indirmek demektir. AES-128’in etkin gücü kuantum saldırgana karşı 64 bit düzeyine iner ve rahatsız edici bir sınıra yaklaşır; AES-256 ise 128 bitlik kuantum-sonrası güvenlik payıyla rahat koltuğunda oturmaya devam eder. Simetrik kriptografinin kuantum çağında da ayakta kalacak olması, bir sonraki bölümlerde göreceğimiz açık anahtarlı sistemler için söylenemeyecektir.