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:

  1. Cipher blok simetri.
  2. Rancangan publik (tidak ada yang disembunyikan).
  3. Panjang kunci fleksibel: 128, 192, 256 bit.
  4. Ukuran blok 128 bit.
  5. Dapat diimplementasikan di perangkat lunak maupun keras.

Lima finalis:

  1. Rijndael (Vincent Rijmen dan Joan Daemen, Belgia, 86 suara),
  2. Serpent (Anderson, Biham, Knudsen; 59),
  3. Twofish (Bruce Schneier; 31),
  4. RC6 (RSA Labs; 23),
  5. 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-1284410
AES-1926412
AES-2568414

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)

  1. AddRoundKey awal: XOR state dengan cipher key.
  2. putaran biasa: SubBytes ShiftRows MixColumns AddRoundKey.
  3. 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 out

Isi 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 out

Satu 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.

BarisKolom 0Kolom 1Kolom 2Kolom 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.

BarisGeserSebelumSesudah
00
11
22
33

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 (XOR 1B bila 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() (00 tetap 00); (3) ubah ke vektor bit; (4) kalikan dengan matriks affine dan tambah konstanta 63; (5) konversi ke hex. Contoh S(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 out

Jalur di atas hanya untuk kelipatan 4 (fungsi ). Untuk lain, langsung di-XOR dengan .

Putaran 12345678910
01020408102040801B36
Word yang dibentukw4-7w8-11w12-15w16-19w20-23w24-27w28-31w32-35w36-39w40-43

Teal: setelah 80, penggandaan meluap dan direduksi modulo sehingga menjadi 1B, lalu 36.

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 out

Berbeda 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, pad plainteks 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, lalu unpad. Kunci harus 16 karakter untuk AES-128.

Summary

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.