Back to IF4020 Kriptografi
AES Rijndael
Questions/Cues
- Mengapa AES dibuat dan bagaimana kompetisinya berlangsung?
- Apa persyaratan AES dan siapa saja finalisnya?
- Apa beda AES-128/192/256 (kunci, blok, putaran)?
- Apa saja empat transformasi Rijndael (SubBytes, ShiftRows, MixColumns, AddRoundKey)?
- Bagaimana aritmetika GF(2⁸) dipakai pada MixColumns dan S-box?
- Bagaimana kunci putaran dibangkitkan dan bagaimana dekripsi dilakukan?
Reference Points
- IF4020 Kriptografi — Review Beberapa Block Cipher, Bagian 2: AES (Slides 1-52 dan Lampiran GF(2^m))
Latar Belakang dan Kompetisi
DES dianggap tidak aman (kunci dapat di-brute-force). NIST mengadakan kompetisi terbuka untuk standar baru, yaitu AES (Advanced Encryption Standard).
Persyaratan AES:
- Cipher blok simetri.
- Rancangan publik (tidak ada yang disembunyikan).
- Panjang kunci fleksibel: 128, 192, 256 bit.
- Ukuran blok 128 bit.
- Dapat diimplementasikan di perangkat lunak maupun keras.
Lima finalis:
- Rijndael (Vincent Rijmen dan Joan Daemen, Belgia, 86 suara),
- Serpent (Anderson, Biham, Knudsen; 59),
- Twofish (Bruce Schneier; 31),
- RC6 (RSA Labs; 23),
- MARS (IBM; 13).
Oktober 2000 NIST memilih Rijndael (dibaca “Rhine-doll”); November 2001 ditetapkan sebagai AES. Diharapkan dominan minimal 10 tahun.
Spesifikasi
Rijndael mendukung kunci 128-256 bit (kelipatan 32) dan ukuran blok independen dari kunci. AES membatasi blok 128 bit dan kunci 128/192/256 (1 word = 32 bit):
Kunci ( word) Blok ( word) Putaran () AES-128 4 4 10 AES-192 6 4 12 AES-256 8 4 14 Secara de-facto hanya AES-128 dan AES-256 yang dipakai. Ruang kunci 128-bit: . Pada satu juta kunci per detik, seluruhnya butuh tahun (rata-rata setengahnya, tahun, angka slide); AES tahan brute force.
Struktur Rijndael
Berorientasi byte (DES berorientasi bit), bukan jaringan Feistel (struktur SPN). Untuk blok dan kunci 128 bit:
Legenda warna diagram dan tabel:
■ Ungu: SubBytes / SubWord (S-box, confusion)
■ Teal: ShiftRows, MixColumns, RotWord (diffusion)
■ Oranye: AddRoundKey dan XOR lain (⊕)
■ Abu-abu putus-putus: cipher key, round key, Rcon
■ Biru: satu putaran utuh
■ Hijau: keluaran (cipherteks / hasil)
- AddRoundKey awal: XOR state dengan cipher key.
- putaran biasa: SubBytes ShiftRows MixColumns AddRoundKey.
- Putaran akhir: SubBytes ShiftRows AddRoundKey (tanpa MixColumns).
flowchart TD PT["Plainteks 128 bit"] --> A0["AddRoundKey (K0)"] A0 --> RD["Putaran 1..Nr-1:<br/>SubBytes, ShiftRows,<br/>MixColumns, AddRoundKey"] RD --> FR["Putaran akhir:<br/>SubBytes, ShiftRows,<br/>AddRoundKey"] FR --> CT["Cipherteks 128 bit"] KE["KeyExpansion<br/>K0 .. K_Nr"] -.-> A0 KE -.-> RD KE -.-> FR RD -. ulang Nr-1 kali .-> RD classDef plain fill:#ffffff,stroke:#7a8699,color:#15202e classDef key fill:#eef0f4,stroke:#7a8699,stroke-dasharray:4 3,color:#15202e classDef rnd fill:#e3e8fb,stroke:#4f6bed,stroke-width:2px,color:#15202e classDef sub fill:#efe7fb,stroke:#8a4fd6,stroke-width:2px,color:#15202e classDef perm fill:#dcf1f3,stroke:#1f8fa3,stroke-width:2px,color:#15202e classDef xor fill:#fbeadb,stroke:#d9731a,stroke-width:2px,color:#b4570f classDef out fill:#dff3e8,stroke:#2f9e63,stroke-width:2px,color:#15202e class PT plain class A0 xor class RD,FR rnd class KE key class CT outIsi satu putaran biasa:
flowchart TD S0["State"] --> SB["SubBytes"] --> SR["ShiftRows"] --> MC["MixColumns"] --> ARK(("⊕<br/>AddRoundKey")) RK["Round key Ki"] -.-> ARK ARK --> S1["State baru"] classDef plain fill:#ffffff,stroke:#7a8699,color:#15202e classDef key fill:#eef0f4,stroke:#7a8699,stroke-dasharray:4 3,color:#15202e classDef rnd fill:#e3e8fb,stroke:#4f6bed,stroke-width:2px,color:#15202e classDef sub fill:#efe7fb,stroke:#8a4fd6,stroke-width:2px,color:#15202e classDef perm fill:#dcf1f3,stroke:#1f8fa3,stroke-width:2px,color:#15202e classDef xor fill:#fbeadb,stroke:#d9731a,stroke-width:2px,color:#b4570f classDef out fill:#dff3e8,stroke:#2f9e63,stroke-width:2px,color:#15202e class S0 plain class SB sub class SR,MC perm class ARK xor class RK key class S1 outSatu ungu (confusion), dua teal (diffusion baris lalu kolom), satu oranye (kunci). Putaran akhir menghilangkan MixColumns.
Data disimpan dalam state, matriks byte (untuk blok 128 bit); 16 byte masukan diisi kolom demi kolom, dan pada akhir state disalin ke cipherteks.
Baris Kolom 0 Kolom 1 Kolom 2 Kolom 3 0 1 2 3 : byte 0-3 mengisi kolom 0, byte 4-7 kolom 1, dst.
Empat Transformasi
SubBytes memetakan tiap byte state lewat S-box (substitusi non-linier, confusion). Contoh:
23(baris 2, kolom 3)26.ShiftRows menggeser siklik ke kiri baris state (diffusion): baris 0 tidak digeser, baris 1 sejauh 1 byte, baris 2 sejauh 2, baris 3 sejauh 3.
Baris Geser Sebelum Sesudah 0 0 1 1 2 2 3 3 Teal = byte yang “memutar” dari kiri ke kanan. Setelah ShiftRows, tiap kolom berisi satu byte dari tiap kolom asal, sehingga MixColumns berikutnya mencampur keempat kolom.
MixColumns mengalikan tiap kolom state dengan matriks tetap dalam GF():
Contoh kolom : baris 1: 3F. Baris lain menghasilkan 4F, F9, 2A. Perkalian dan penjumlahan dilakukan dalam GF().
Baris matriks semua 02 03 01 0102•26 = 4C03•7B = 8DBD433F 01 02 03 012602•7B = F603•BD = DC434F 01 01 02 03267B02•BD = 6103•43 = C5F9 03 01 01 0203•26 = 6A7BBD02•43 = 862A Tiap byte keluaran bergantung pada keempat byte masukan kolom. Perkalian
02•= geser kiri 1 bit (XOR1Bbila bit teratas 1, mis.02•BD);03•x=(02•x) ⊕ x.AddRoundKey meng-XOR state dengan round key.
S-box: Dibangun, Bukan Acak
S-box terlihat acak tetapi dihitung: (1) isi tabel naik
00..FF; (2) tiap nilai diganti inversnya di GF() (00tetap00); (3) ubah ke vektor bit; (4) kalikan dengan matriks affine dan tambah konstanta63; (5) konversi ke hex. ContohS(00) = 63,S(01) = 7C.Galois Field GF()
Elemen GF() adalah string biner yang dipandang sebagai polinom . Contoh
01010111= .
- Penjumlahan = koefisien dijumlahkan mod 2 = XOR. Contoh:
0D+06=0B;57+83=D4.- Perkalian = perkalian polinom, direduksi modulo polinom irreducible derajat . Rijndael memakai
Contoh
57 . 83: hasil =C1.
- Contoh MixColumns:
4C; .Key Expansion
Kunci putaran dibangkitkan oleh KeyExpansion dari cipher key. Untuk AES-128: kunci 16 byte disalin ke (word 4 byte), lalu untuk : ; bila kelipatan 4 terapkan fungsi : RotWord (geser 1 byte kiri) SubWord (S-box) XOR Rcon[]; kemudian . Rcon:
01, 02, 04, 08, 10, 20, 40, 80, 1B, 36( di GF()).flowchart TD W1["w[i-1]"] --> RW["RotWord<br/>geser 1 byte kiri"] RW --> SW["SubWord<br/>S-box tiap byte"] SW --> XR(("⊕")) RC["Rcon[i/4]"] -.-> XR XR --> T["temp = g(w[i-1])"] T --> X2(("⊕")) W4["w[i-4]"] --> X2 X2 --> WI["w[i]"] classDef plain fill:#ffffff,stroke:#7a8699,color:#15202e classDef key fill:#eef0f4,stroke:#7a8699,stroke-dasharray:4 3,color:#15202e classDef rnd fill:#e3e8fb,stroke:#4f6bed,stroke-width:2px,color:#15202e classDef sub fill:#efe7fb,stroke:#8a4fd6,stroke-width:2px,color:#15202e classDef perm fill:#dcf1f3,stroke:#1f8fa3,stroke-width:2px,color:#15202e classDef xor fill:#fbeadb,stroke:#d9731a,stroke-width:2px,color:#b4570f classDef out fill:#dff3e8,stroke:#2f9e63,stroke-width:2px,color:#15202e class W1,W4,T plain class RW perm class SW sub class XR,X2 xor class RC key class WI outJalur di atas hanya untuk kelipatan 4 (fungsi ). Untuk lain, langsung di-XOR dengan .
Putaran 1 2 3 4 5 6 7 8 9 10 01020408102040801B36Word yang dibentuk w4-7 w8-11 w12-15 w16-19 w20-23 w24-27 w28-31 w32-35 w36-39 w40-43 Teal: setelah
80, penggandaan meluap dan direduksi modulo sehingga menjadi1B, lalu36.AES-256 berbeda dalam: 14 putaran, kunci 256 bit, dan key expansion (bila : RotWordSubWordRcon; bila : SubWord saja).
Dekripsi
Membalik tiap langkah: InvSubBytes (S-box invers), InvShiftRows (geser ke kanan), InvMixColumns (matriks invers
0E 0B 0D 09), dan AddRoundKey (XOR, sama), dengan urutan round key terbalik.flowchart TD C["Cipherteks"] --> A0(("⊕ K_Nr")) A0 --> ISR["InvShiftRows"] --> ISB["InvSubBytes"] --> A1(("⊕ Ki")) --> IMC["InvMixColumns"] IMC -. ulang i = Nr-1 sampai 1 .-> ISR IMC --> L["InvShiftRows,<br/>InvSubBytes,<br/>⊕ K0"] --> P["Plainteks"] classDef plain fill:#ffffff,stroke:#7a8699,color:#15202e classDef key fill:#eef0f4,stroke:#7a8699,stroke-dasharray:4 3,color:#15202e classDef rnd fill:#e3e8fb,stroke:#4f6bed,stroke-width:2px,color:#15202e classDef sub fill:#efe7fb,stroke:#8a4fd6,stroke-width:2px,color:#15202e classDef perm fill:#dcf1f3,stroke:#1f8fa3,stroke-width:2px,color:#15202e classDef xor fill:#fbeadb,stroke:#d9731a,stroke-width:2px,color:#b4570f classDef out fill:#dff3e8,stroke:#2f9e63,stroke-width:2px,color:#15202e class C plain class A0,A1 xor class ISR,IMC perm class ISB sub class L rnd class P outBerbeda dengan Feistel, SPN butuh algoritma dekripsi sendiri: tiap lapisan harus dibalik (S-box invers, matriks invers), bukan sekadar membalik urutan kunci.
Contoh Program (Python, pycryptodome)
Enkripsi AES-CBC: bangkitkan IV acak 16 byte,
padplainteks ke kelipatan 16 byte,AES.new(kunci, AES.MODE_CBC, iv).encrypt(...), lalu simpan IV + cipherteks (mis. Base64). Dekripsi: ambil IV dari 16 byte awal, dekripsi, laluunpad. Kunci harus 16 karakter untuk AES-128.
AES lahir dari kompetisi terbuka NIST untuk menggantikan DES: kunci 128/192/256, blok 128 bit, rancangan publik. Dari lima finalis (Rijndael, Serpent, Twofish, RC6, MARS), Rijndael (Daemen dan Rijmen) dipilih Oktober 2000 dan distandarkan November 2001. AES-128/192/256 memakai 10/12/14 putaran. Rijndael berorientasi byte dan bukan Feistel: state byte melalui AddRoundKey awal, lalu putaran SubBytes (S-box, confusion) ShiftRows (diffusion baris) MixColumns (matriks di GF(), diffusion kolom) AddRoundKey, dengan putaran akhir tanpa MixColumns. S-box dibangun dari invers di GF() + transformasi affine, aritmetika GF memakai . KeyExpansion memakai RotWord, SubWord, dan Rcon; dekripsi memakai transformasi invers. AES-128 tahan brute force ( kunci). Cipher blok lain dibahas di GOST, RC5, RC6, dan Cipher Blok Lainnya.
Additional Information
AES dalam Praktik
Prosesor modern punya instruksi AES-NI yang menjalankan satu putaran per instruksi (puluhan GB/s), serta ARMv8 Crypto Extensions. Pemakaian standar: AES-GCM di TLS 1.2/1.3, AES-XTS di enkripsi disk (BitLocker, LUKS), AES-CCM di Wi-Fi WPA2, dan enkripsi file/basisdata (Konsep Cipher Blok dan Mode Operasi). AES-256 dipakai NSA untuk data TOP SECRET (CNSA).
Serangan pada AES
Tidak ada serangan praktis pada AES penuh. Biclique attack (2011) hanya menurunkan kerja dari menjadi (secara teori). Side-channel jauh lebih nyata: cache-timing attack (Bernstein 2005) pada implementasi berbasis tabel, karena itu dipakai AES-NI atau implementasi bitsliced konstan waktu (Serangan Pasif, Aktif, dan Side-Channel). Ancaman kuantum: algoritma Grover menurunkan keamanan AES-128 menjadi , jadi AES-256 lebih disarankan untuk jangka panjang.
Catatan pada Slide
Slide menulis waktu brute force AES pada kunci per milidetik sebagai tahun; hitung ulang: tahun. Kesimpulan tetap sama: praktis mustahil.
Proyek Eksplorasi Mandiri
- Implementasikan AES-128 dari nol (SubBytes, ShiftRows, MixColumns di GF(), KeyExpansion) dan validasi dengan vektor uji FIPS-197 Appendix B.
- Hitung tabel S-box sendiri dari invers GF() + matriks affine dan cocokkan dengan tabel standar; lalu tunjukkan bahwa
S(23) = 26.Bacaan Lanjutan
- FIPS PUB 197, Advanced Encryption Standard, 2001.
- J. Daemen & V. Rijmen, The Design of Rijndael, Springer, 2002.
- Demo:
encode-decode.com/aes128-encrypt-online.