Jumat, 05 April 2013

Cipher based MAC (CMAC) C code

Hari ini mau tulis tentang CMAC dan sekalian share codenya jg :senyum. CMAC digunakan untuk menjamin data yang masuk itu tidak ada yang berubah, dalam artian tidak ada orang yang mengubah paket data dalam trafik jaringan.

Algoritma CMAC pada prinsipnya merupakan variasi dari CBC-MAC, bisa dilihat di wiki atau di e-book SP_800-38B.pdf. Dan kali ini saya hanya akan memberikan CMAC menggunakan enkripsi TDEA(Triple Data Encryption Algorithm)

Untuk membuat checksum menggunakan CMAC metode TDEA, terlebih dahulu kita harus tahu variabel apa saja yang diperlukan
- Key (K), yakni master key yang diperlukan untuk mengenerate subkey K1 dan K2.
- K1 & K2, yakni subkey yang dibutuhkan untuk XOR message (M) di 8 byte terakhir.
- Message (M), yakni data yang digunakan untuk menghasilkan checksum
- Initial Value (IV), digunakan untuk pada enkripsi CBC-TDEA.
Dan hal pertama yang kita lakukan adalah generate subkey (K1 & K2) dari K. Step - step untuk generate subkey;
1. L = CIPHK(0b) ; dengan b = 8 byte, sehingga 08 = 00000000, CIPHK() menggunakan algoritma TDEA enkripsi. (a*)
2. If MSB1(L) = 0, then K1 = L << 1 Else K1 = (L << 1) ⊕ Rb; Jika MSB (Most Significant Bit) 1 paling kiri dari L adalah 0, maka geser 1 bit ke kiri pada array L. Jika tidak maka geser 1 bit pada array L , lalu xor dengan Rb .
3. If MSB1(K1) = 0, then K2 = L << 1 Else K2 = (K1 << 1) ⊕ Rb; Jika MSB (Most Significant Bit) 1 paling kiri dari L adalah 0, maka geser 1 bit ke kiri pada array L. Jika tidak maka geser 1 bit pada array L , lalu xor dengan Rb .


Setelah generate subkey, kita baru bisa membuat MAC. Langkah-langkahnya 
1 .  If Mlen = 0, then n = 1, Else n = ⎡Mlen/b⎤;  Jika Mlen (Message length) sama dengan 0 maka n ialah 1, lainnya n = Mlen / b hasilnya tidak bulat maka dibulatkan ke atas, contoh jika hasil bagi Mlen dan b menghasilkan angka 2.3 maka n = 3.
2.  M = M1||M2||M3||...||Mn-1||Mn*; Bagi message itu per 8 byte, jadi M1 itu besarnya 8 byte sampai  Mn-1.
3. Mn* adalah block 8 byte terakhir. Mn = K1 ⊕ Mn*; else, let Mn = K2 ⊕ (Mn*||10j), where j = nb-Mlen-1; Untuk Mn yang format blocknya kelipatan 8 byte maka 8 byte terkahir di xor menggunakan K1. Sedangkan untuk format block yang kelipatan tidak 8, dalam arti block terkahir tidak berjumlah 8 byte, maka concate (disambung) dengang biner 10j, dimana perhitungan untuk j bisa dilihat pada rumus diatas.
4. C0 = 0b; Initial value (iv)
5. For i = 1 to n, Let Ci = CIPHK(Ci-1⊕ Mi); Perhitungan disamping ini adalah algoritma CBC-TDES, yang dalam hal ini menggunakan iv yang di xor per 8 byte.
6 Let T = MSBTlen(Cn); T adalah hasil CMAC, biasanya untuk TDES diambil 8 byte terakhir sedangkan untuk AES diambil 16 byte terakhir.

Ini gw kasih link code yang uda gw buat. Hanya yang gw heran disini, perhitungan untuk message yang tidak multiple 8 byte itu salah. Bisa diliat di e-book SP_800-38B.pdf bagian example, tp kalau gw coba dengan latihan di ebook lain, kode gw bener. Jadi bingung mana yg bener dan yang salah. Itu hanya terjadi pada yang tidak multiple 8 byte aja lho.

(a*) : n = 8 jika memakai TDEA; n = 16 jika memakai AES

0 komentar:

Posting Komentar