Block Cipher

Seperti namanya, sebuah block cipher mengenkrip 1 blok data setiap waktu. Ukuran blok ini biasanya kecil, misalnya AES memakai ukuran blok 128 bit (16 byte). Karena enkripsi dilakukan per blok, maka jika ukuran data kurang dari ukuran blok maka perlu ditambahkan padding (yang sudah dibahas sebelumnya). Jadi tidak seperti stream cipher, ukuran data hasil bisa sedikit lebih besar karena padding.

Ada banyak contoh block cipher, misalnya AES (yang jadi standar saat ini), DES (standar sebelumnya), TEA (block cipher yang sangat sederhana), Blowfish, dsb. Salah satu alasan enkripsi dilakukan per blok adalah: ada operasi permutasi yang bisa dilakukan dalam tiap blok. Contohnya jika ukuran blok hanya 4 byte dan kita memiliki data dengan urutan 1 2 3 4, maka bisa dilakukan permutas sehingga urutannya (misalnya) menjadi 2 3 1 4.

Tentunya tidak hanya permutasi saja yang dilakukan, biasanya ada banyak langkah yang diulang beberapa kali (iterated block cipher). Setiap langkah bisa berupa substitusi (menggunakan yang namanya S-BOX), permutasi, pemecahan blok menjadi beberapa bagian, dan penggabungan kembali bagian tersebut.

Mode Of Operation

Untuk tiap block cipher, kita bisa menggunakannya dalam berbagai mode. Mode paling sederhana adalah Electronic Codebook (ECB): ambil satu blok, enkrip blok itu saja, lupakan semua, jika ada blok baru maka enkrip blok itu saja, dst. Ini jadi mirip dengan stream cipher hanya saja ukurannya per blok. Di dalam mode ini tidak ada IV (initialization vector).


Mode ECB tidak aman karena blok yang sama akan dienkrip jadi ciphertext yang sama. Agar lebih aman kita ingin agar sebuah blok tergantung pada hasil enkripsi sebelumnya. Salah satu caranya adalah cipher block chaining (CBC): hasil enkripsi di block pertama akan dixorkan dengan block plaintext berikutnya. Khusus untuk blok pertama, ini akan di-xor-kan dengan IV.

CBC encryption.svg

Metode ini memiliki kelemahan: jika sebuah bit diubah di hasil enkripsi dan kita berusaha mendekrip bloknya, maka satu blok itu bisa corrupt tapi blok-blok berikutnya akan bisa didekrip dengan baik. Tergantung jenis data dan metode yang dipakai untuk memproses hasil dekripsi, maka akibatnya bisa fatal. Contohnya jika data yang dienkripsi adalah parameter URL seperti ini:

price=10000000&count=10

Dalam kasus tertentu Jika kita secara random mengubah satu bit demi satu bit, ada kemungkinan hasil decrypt menjadi corrupt tepat di bagian harga, misalnya jadi:

price=1000AZdasX&count=10

Jika ini diproses dengan PHP (atau bahasa lain yang terlalu menerima) angka 10 juta bisa dianggap menjadi 1000 saja.

Alternatif berikutnya yang lebih aman (jika satu blok corrupt, maka berikutnya juga corrupt) adalah PCBC. Enkripsi blok berikutnya digabung dengan plaintext DAN ciphertext blok sebelumnya.

PCBC encryption.svg

Ada mode yang prinsip kerjanya adalah membuat block cipher menjadi stream cipher. Intinya kita mengenkrip key dan IV lalu hasilnya di XOR kan dengan plain text. Contoh pertama yang bekerja dengan prinsip ini adalah Cipher Feedback (CFB).

CFB encryption.svg

Mode berikutnya yang sangat mirip adalah OFB. Bedanya di sini proses menghasilkan stream bisa dilakukan lebih dulu, karena input untuk blok berikutnya tidak tergantung pada plaintext saat ini.

Mode yang terakhir adalah Counter (CTR). Di sini kita mengenkrip counter. Hasil blok enkripsi baru di-XOR-kan dengan plaintext. Supaya aman, counter ini digabungkan dengan sebuah Nonce (angka yang hanya dipakai sekali).

CTR encryption 2.svg

Penutup

Pengetahuan mengenai block cipher ini membantu saya memahami dan melakukan reverse engineering terhadap Pokemon Go Plus. Di Pokemon Go Plus, AES digunakan sebagai dasar untuk hashing. Segala macam konsep CTR, mode of operation dan sebagainya sangat terpakai.

Saat ini tulisan ini tidak akan membahas implementasi detail satu algoritma tertentu. Mungkin di lain waktu ini akan saya lakukan, tapi fokus saya adalah memberikan pengetahuan praktis saja.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.