Rabu, 19 Juli 2017

Kriptografi 1. XOR

Dalam mata kuliah algoritma atau dasar pemrograman

Dalam mata kuliah algoritma atau dasar pemrograman, atau yang berkutat dibidang matematik, atau yang masih mengingat materi logika dasar di sma, tentu kita telah mengetahui beberapa operasi seperti AND, OR, NOR, NAND, XOR. Didalam dunia komputer, semua operasi tersebut disebut sebagai bitwise operation. Dengan operasi tersebut kita bisa memanipulasi biner, menjadi sesuai dengan apa yang kita inginkan.

Kali ini kita akan membahas operasi XOR dan kegunaannya pada bidang kriptografi. Mungkin bagi para mastah mohon maaf apabila tulisan ini masih banyak kekurangan. Operasi Exclusive OR (atau yang biasa disebut XOR) adalah operasi yang apabila dilakukan oleh dua biner yang sama maka hasilnya akan bernilai nol namun apabila dilakukan oleh dua biner yang berbeda akan bernilai satu. Operasi XOR, biasanya dilambangkan sebagai ^ .Hasil operasi XOR dapat dilihat pada tabel dibawah ini.

a b a^b
1 1 0
1 0 1
0 1 1
0 0 0

Operasi XOR berjenis reversible. Karena apabila hasil operasi XOR, kita operasikan lagi dengan biner awal kita akan mendapatkan biner semula.

a^b b (a^b)^b == a
0 1 1
1 0 1
0 0 0
1 1 0

Kita dapat mendapatkan nilai a kembali dengan melakukan operasi XOR hasil a^b dengan b. Karena itu operasi XOR sangat berguna untuk enkripsi linier sederhana.

Kita akan coba mengimplementasikan enkripsi dan dekripsi XOR dengan contoh sederhana. Saya mempunyai pesan "THIS IS PLAIN TEXT" dan kunci "L". Untuk mengenkripsi text tersebut kita akan melakukan operasi XOR pada setiap karakter pada pesan dengan kunci tersebut yaitu kunci "L".

Mari kita gunakan skrip python sederhana untuk mengenkripsi

import base64
plain = "THIS IS PLAIN TEXT"
key = "L"

chip = ""
for i in plain:
  chip += chr(ord(i) ^ ord(key))

print chip
base64chip = base64.b64encode(chip)
print base64chip #GAQFH2wFH2wcAA0FAmwYCRQY

Kini chip sudah terisi chipper text atau text yang telah dienkripsi. Tentu ketika hasilnya akan aneh karena hasilnya bukan printable karakter. Karena itu chipper text kita encode dengan base64.

Sekarang kita coba melakukan operasi XOR kembali chipper text dengan key untuk mendapatkan plain text.

import base64
chiperbase64 = "GAQFH2wFH2wcAA0FAmwYCRQY"
chip = base64.b64decode(chiperbase64)
key = "L"
plain = ""
for i in chip:
  plain += chr(ord(i) ^ ord(key))
print plain #THIS IS PLAIN TEXT

Kita berhasil mendapatkan Plain text.

Kelemahan dari XOR adalah key yang digunakan untuk mengenkripsi sama dengan key yang digunakan untuk mendekripsi, alias linier. Ukuran key yang kecil misal hanya satu karakter juga membuat kita dapat brute force key untuk mendapatkay chiper text

Sebagai contoh kita akan menggunakan soal agrihack 2017. Diberikan resume.pdf.encrypted (will be upload soon) yang dienkripsi menggunakan skrip berikut

#!/usr/bin/python
import os

resumeku = open('resume.pdf').read()

encrypted = ""

randomku = os.urandom(1)

for byte in resumeku:
  encrypted += chr(ord(byte) ^ ord(randomku))

encrypted_resume = open('resume.pdf.encrypted', 'w')
encrypted_resume.write(encrypted)
encrypted_resume.close()

Karena key yang digunakan hanya satu karakter maka kita akan coba bruteforce karakter tersebut

import os
enc = open('resumeku.pdf.encrypted', 'rw')

for key in range(0, 255):
    dec = ''
    for byte in enc:
      dec += chr(ord(byte) ^ key)
    files = open(str(key)+'.pdf', 'w')
    files.write(dec)
    files.close()

Kita tinggal melihat file mana yang merupakan file pdf valid dengan bash.

file *

Didapat flag dari challange tersebut adalah AGRI{do_you_3ven_bruteforce}

Sebenarnya challange ini dapat diakali dengan hanya mencari key, yaitu dengan men XOR byte awal dengan byte pdf asli, karena header pdf akan selalu sama. Hehehe :D

Oke sekian postingan kali semoga bermanfaat.

Tidak ada komentar:

Posting Komentar