Stream cipher

Dalam stream cipher plaintext dienkrip satu byte tiap waktu. Ini berbeda dengan block cipher (akan dibahas di posting berikutnya) yang harus mengenkrip satu blok byte dengan ukuran tertentu. Prinsip stream cipher adalah: dari sebuah key dihasilkan sebuah urutan byte-byte yang acak. Byte-byte ini kemudian di XOR-kan dengan plaintext. Karena sifat stream cipher yang menghasilkan byte acak, kadang ada yang menggunakan ini sebagai RNG (Random Number Generator)

Dengan stream cipher, panjang hasil enkripsi bisa sama dengan teks yang dienkripsi. Karena enkripsi bisa dilakukan per byte, maka begitu ada 1 byte data tersedia, data tersebut langsung bisa dienkripsi (tidak perlu menunggu satu blok data).

Beberapa contoh stream cipher adalah: RC4 (dipakai di banyak hal misalnya WIFI WEP dan juga oleh banyak malware) serta A5/1 dan A5/2 (dipakai di GSM versi lama). Secara umum block cipher bisa diubah menjadi stream cipher dengan mode OFB (Output Feedback) dan CTR (Counter), jadi sekarang ini tidak banyak stream cipher yang populer.

Baik block cipher maupun stream cipher perlu diberi IV (initialization vector). Tujuan IV ini mirip dengan salt pada waktu hashing. Jika ada dua message yang dienkrip dengan key yang sama, dengan menggunakan IV yang berbeda maka hasil enkripsinya akan berbeda. Dalam stream cipher, jika tidak ada IV dan kita mengenkrip dua pesan yang berbeda (A dan B), maka akibatnya kita bisa mendapatkan (A XOR B) meskipun tidak tahu keynya. Ini bisa terjadi karena

E1 = (A XOR C) # dengan C adalah sebuah stream dari key K
E2 = (B XOR C) # dengan C adalah sebuah stream dari key K yang sama
X = (E1 XOR E2) = (A XOR C) XOR (B XOR C) = A XOR B

Contohnya seperti ini jika data yang dienkrip adalah gambar dengan teks “Yohanes”

Hasilnya bagus tidak terbaca

Lanjutkan membaca “Stream cipher”

Tanda tangan digital (kriptografi)

Sebagian orang menyangka tanda tangan digital adalah tanda tangan manusia hasil scan/foto/ditulis dengan stylus, tapi dalam kriptografi, maksudnya bukan itu. Tandatangan digital bertujuan untuk membuktikan bahwa:

  • seseorang tidak bisa menyangkal bahwa pernah menandatangani sebuah dokumen/file (non repudiation)
  • semua orang lain bisa memverifikasi bahwa tanda tangan tersebut valid

Ada banyak skema tanda tangan digital. Prinsipnya sama: ada key private yang dimiliki oleh penandatangan (signer) dan ada key publik yang disebarkan publik. Contoh algoritma yang bisa dipakai adalah RSA. Saya memilih satu algoritma saja untuk menjelaskan karena saya sudah membahas RSA di posting lain.

Lanjutkan membaca “Tanda tangan digital (kriptografi)”

Padding dalam kriptografi

Padding merupakan salah satu konsep dasar dalam kriptografi. Konsep padding ini sederhana: sebuah pesan sebelum dienkrip atau dihash diberi tambahan sesuatu, bisa di awal, di tengah atau di akhir. Padding ini konsep sederhana, tapi perlu diketahui misalnya jika ingin memahami hash length extension attack.

Dalam kriptografi klasik, cryptanalysis bisa dilakukan terhadap pesan karena biasanya sebuah pesan bisa diprediksi awalannya (“Selamat siang”), atau akhirannya (“Dengan Hormat, XXX”). Dari teks parsial yang diketahui/ditebak itu bisa dilakukan berbagai analisis untuk mengetahui apa isi pesannya (known plaintext attack).

Lanjutkan membaca “Padding dalam kriptografi”

Fungsi Hash Kriptografi (Bagian 2)

Salt

Penggunaan hash untuk menyimpan password merupakan cara yang standar di berbagai aplikasi. Cara ini sederhana, tapi hash saja memiliki kelemahan:

  • jika ada dua atau lebih orang passwordnya sama, maka akan terlihat bahwa hashnya sama.
  • bisa dilakukan dictionary attack. Artinya: hash semua kata di kamus sekali, lalu cocokkan hashnya

Cara yang lebih baik adalah dengan menambahkan salt, berupa beberapa karakter random yang berbeda untuk tiap entry. Jadi misalnya jika password untuk user1 adalah 123, kita bisa menghasilkan salt random misalnya “xcd”, lalu salt ini dihash bersama password hash(“xcd”+”123”). Jika hash yang dipakai adalah MD5, maka hasilnya:

4c88e409f0d1938d4f0adf7bdc896fbe

Di dalam database atau file, kita perlu menyimpan salt yang dipakai: “xcd”, misalnya seperti ini: xcd$4c88e409f0d1938d4f0adf7bdc896fbe

Lanjutkan membaca “Fungsi Hash Kriptografi (Bagian 2)”

Fungsi Hash Kriptografi (Bagian 1)

Fungsi hash adalah fungsi yang memetakan dari suatu data (bisa string atau apapun) ke sebuah data lain yang ukurannya biasanya lebih kecil. Ada fungsi hash untuk dipakai di struktur data hash table (outputnya adalah integer) dan ada fungsi hash untuk kriptografi outputnya berupa string alfanumerik dengan panjang tertentu.

Hash Table

Sebelum menjelaskan fungsi hash kriptografi, saya jelaskan dulu contoh fungsi hash biasa karena lebih sederhana. Penggunaan fungsi hash dalam kasus ini adalah untuk menyimpan data ke hash table, supaya gampang diakses lagi.

Misalnya kita punya array yang bisa menyimpan 100 elemen. Kita ingin menyimpan sebuah string, lalu ingin bisa menemukan kembali string itu dengan cepat nantinya, tidak memulai membandingkan satu per satu dari elemen pertama. Untuk melakukan ini kita bisa memakan fungsi hash. Sebuah string akan dimasukkan ke sebuah fungsi hash, hasilnya adalah sebuah angka n dari 0-99, lalu kita masukkan string ke array di indeks itu.

Lanjutkan membaca “Fungsi Hash Kriptografi (Bagian 1)”

Kriptografi RSA Praktis

Topik kriptografi RSA sudah dibahas di banyak artikel dan video oleh orang lain, jadi di sini saya hanya ingin memberikan mengenai topik RSA secara praktis. Praktis di sini artinya saya akan memakai tool openssl dan kode Python untuk melakukan enkripsi.

Prinsip RSA adalah: bahwa kita bisa mencari 3 bilangan: n, e, dan d sedemikian hingga relasi ini terpenuhi.

{\displaystyle (m^{e})^{d}\equiv m{\pmod {n}}}

Jika diketahui e dan n, kita tidak bisa dengan mudah mencari tahu nilai d. Dalam RSA: public key adalah n dan e, sedangkan private key adalah d dan n.

Saya tidak akan menjelaskan secara matematis bagaimana menghasilkan key RSA ini. Penjelasannya bisa dibaca di Wikipedia, tapi ada beberapa hal dasar yang perlu diketahui:

  • n adalah perkalian dari dua buah bilangan prima p dan q.
  • Jika kita bisa memfaktorkan n, maka kita bisa mencari nilai private key.
  • Saat ini tidak ada algoritma efisien untuk memfaktorkan n
Lanjutkan membaca “Kriptografi RSA Praktis”

Security dari level bit (Bagian 2: Encoding Teks)

Saat ini masih banyak user dan juga programmer yang masih bingung dengan masalah “encoding” teks (misalnya ASCII, ISO8859-1, UTF-8, UTF-16, UTF32, dsb). Ini merupakan hal dasar yang penting, baik untuk keperluan sehari-hari maupun dalam bidang security. Ada beberapa attack yang berhubungan dengan encoding teks ini.

Encoding teks dan security

Sekilas topik encoding sepertinya hal yang membosankan dari sudut pandang security, tapi ada ada banyak masalah security yang berhubungan dengan encoding teks. Beberapa contohnya:

  • phishing attack memanfaatkan Unicode character yang mirip (character ambiguity)
  • phishing menggunakan karakter khusus untuk marker RTL (right to left) dan LTR (left to right)
  • Encoding alternatif untuk membypass filter
  • Overlong UTF-8 encoding attack
  • Membuat shell code yang bisa lolos encoding tertentu
  • Buffer overflow karena kesalahan penanganan encoding

Berbagai hal di atas sulit dijelaskan jika tidak memiliki pemahaman yang baik mengenai encoding, jadi di tulisan kali ini saya akan membahas mengenai text encoding.

Lanjutkan membaca “Security dari level bit (Bagian 2: Encoding Teks)”