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.

Ketika kita ingin mencari apakah sebuah string ada di array atau tidak, kita hash string tersebut, lalu kita cek apakah di elemen ke-n hasil fungsi hash tersebut ada elemennya. Dalam kasus tertentu, setiap string bisa dipetakan ke slot array yang berbeda.

Tentunya ada kemungkinan lebih dari satu string dipetakan ke satu lokasi, istilahnya terjadi collision. Jika ini terjadi, maka kita bisa menyimpan elemen di indeks n+1, jika sudah ada isinya ke n+2, dst. Sebaliknya ketika mencari elemen, jika isi array di posisi itu kosong artinya elemen tidak ada. Tapi jika di posisi itu ada isinya, kita perlu mengecek elemen berikutnya, jika tidak ada maka cek n+1, n+2 dst. Kasus ini tidak ideal, tapi masih lebih baik daripada mencari dari awal sampai akhir array.

Fungsi Hash

Bagaimana mengubah sebuah string menjadi sebuah angka yang kecil (dalam range tertentu, misalnya dalam kasus di atas 0-99)? cara termudah adalah dengan melakukan sebuah operasi, misalnya penjumlahan terhadap masing-masing huruf, lalu hasilnya di-modulo 100.

Menjumlahkan string saja sangat mudah, tapi sangat mudah juga terjadi collision: dua string yang hurufnya sama tapi posisinya beda akan dihash ke nilai yang sama. Cara yang lebih baik adalah dengan menggunakan bobot, misalnya dalam Java caranya adalah dengan menggunakan formula ini:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

Contohnya jika kita punya string ABC (panjangnya 3), maka hasilnya adalah A (65) * 31*31 + B (66)*31 + C (67) = 64578. Sekarang kebetulan 2 hash yang sama lebih kecil, tapi tetap cukup mudah jika dilakukan dengan sengaja. Contohnya string “B#C” akan memiki hash yang sama dengan “ABC”. Ini bisa dicari dengan mudah karena dengan rumus di atas, jika saya ubah A menjadi B (bergeser 1) maka nilai hash akan bertambah sebesar (1*31*31 = 961), dan ini bisa dikompensasi dengan mengurangi karakter kedua sebanyak 31 (dari B menjadi #).

Sebagai catatan: fungsi hash code Java hanya akan menghasilkan angka 32 bit (akan dilakukan modulo jika lebih). Artinya jika kita punya 2^32 + 1 string yang unik, maka pasti ada 1 yang hashnya sama.

Fungsi hash ini belum cukup aman untuk tujuan kriptografi. Saya pernah menemui aplikasi yang memakai ini untuk fungsi hash penting, dan ini merupakan hal yang salah.

Fungsi Hash Kriptografi

Fungsi hash kriptografi berbeda dari fungsi hash biasa, tapi memiliki kesamaan. Di dalam keduanya kita ingin “mengkompress” data menjadi bilangan kecil. Dalam hash kriptografi, kita ingin agar:

  • jika data diubah sedikit saja, hashnya akan berbeda
  • dari sebuah nilai hash X, kita tidak bisa membentuk sebuah input sedemikian sehingga hashnya adalah X

Jika tiap kali diberikan sebuah hash X dan kita selalu bisa menemukan sebuah string sedemikian hingga hashnya X tertentu maka fungsi hash tersebut berhasi dipecahkan (broken).

Kegunaan hash ini:

  • Untuk verifikasi data yang besar. Jika hashnya tidak berubah, berarti data tidak diutak-atik
  • Untuk penyimpanan password

Untuk penyimpanan password, prinsipnya seperti ini:

  • ketika password dibuat, password akan dihash dan hashnya yang disimpan
  • ketika login, password yang dimasukkan akan dihash, dan nilai hashnya akan dibandingkan

Fungsi hash kriptografi biasanya minimal memiliki output 128 bit. Artinya jika kita mencoba 340282366920938463463374607431768211456 + 1 data yang unik, maka akan ada 1 yang hashnya sama. Sebagai latihan, cobalah membagi bilangan itu dengan jumlah detik dalam setahun, lalu asumsikan 1 detik bisa melakukan berapa operasi hash, dan kalikan dengan 1 milyar komputer di dunia, hasilnya merupakan bilangan tahun yang sangat besar.

Saat ini ada banyak fungsi hash dan biasanya akan menghasilkan string biner antara 128-512 bit. Atau jika dijadikan karakter heksa: antara 32 – 128 karakter heksa. Beberapa fungsi hash yang umum adalah MD5, SHA1, SHA256, SHA512.

Detail fungsi hash tidak saya bahas di sini, dan biasanya tidak penting detailnya bagi seorang programmer. Berbagai bahasa sudah memiliki library untuk melakukan hashing.Pemahaman diperlukan jika ingin mempelajari keamanannya atau ingin mengetahui bagaimana cara kerja berbagai serangan (seperti hash length extension attack).

Mari kita lakukan hal praktis saja, berikut ini contoh berbagai string yang dihash dan outputnya, perhatikan bahwa Perbedaan sedikit saja akan menghasilkan nilai hash yang sangat berbeda.

Cracking Hash

Cara cracking sebuah hash agar kembali menjadi passsword pada dasarnya ada dua:

  • Dictionary attack
  • Bruteforce attack

Jadi diberikan sebuah kamus kata, kita hash masing-masing kata dan cek apakah hashnya sama dengan yang kita cari. Dalam brute force, kita akan mencoba semua kemungkinan karakter seperti AAAA, AAAB, dst sampai semua simbol dicoba.

Beberapa situs sudah menyimpan hash dari database password yang umum, sehingga jika kita cari hashnya, maka kita akan mendapatkan passwordnya.
Tentunya menyimpan kombinasi hash dan password butuh penyimpanan yang besar, untuk mengatasi ini bisa digunakan Rainbow table.

Penutup

Topik hashing ini belum lengkap, dan masih akan diteruskan di bagian berikutnya. Topik yang belum dibahas antara lain:

  • salting
  • kesalahan pemakaian hash
  • HMAC

Homeschool atau Kirim Anak ke Sekolah?

Kami pernah mengirim Jonathan ke sekolah selama 3 tahun sebelum akhirnya memutuskan menghomeschool Jonathan selama 1,5 tahun terakhir ini. Saya ingat, hari pertama kami mulai mantap menghomeschool ketika kami mulai menggunakan kurikulum dari CLE. Akhir Agustus 2017, Jonathan sering sakit, susah tidur cepat dan berakibat masih ngantuk waktu bangun dan di sekolah sering ketiduran. Di sekolah, Jonathan akhirnya lebih sering tidak bisa mengikuti pelajaran dengan baik.

Awal memutuskan homeschool, saya sangat khawatir kalau kami jadi terlena dan tidak mengajarkan apapun ke Jonathan, apalagi saya masih belum menemukan kurikulum yang akan kami pakai. Saya khawatir terlalu santai, dan tahu-tahu waktu berlalu tanpa Jona belajar apapun. Saya sempat sedikit khawatir masalah apakah saya akan kuat secara mental untuk tidak marah-marah kalau Jonathan tidak mengerjakan tugasnya. saya nggak kuatir masalah tidak bisa mengajarkannya atau Jonathan tidak mengerti, saya lebih khawatir Jonathan tidak mau mendengar saya atau menolak mengerjakan pekerjaan sekolahnya. Setelah membaca dan bertanya banyak hal soal homeschool, saya bersyukur kami menemukan kurikulum yang sesuai buat kami. Karena kurikulum yang kami pakai kami pesan dari Amerika, butuh waktu untuk menunggu kurikulum tiba. Kurikulum yang kami gunakan mempunyai scope dan sequence yang jelas. Ada tes di awal yang dapat digunakan untuk mengetahui anak sebaiknya di kelas berapa. Tiap unit pelajaran dikenalkan sedikit demi sedikit dan diberi soal latihan dan review dari pelajaran sebelumnya. kurikulum ini dilengkapi dengan buku manual untuk guru yang cukup lengkap dan juga kuis dan tes secara berkala. Sejauh ini saya tidak perlu terlalu banyak menjelaskan kepada Jonathan. semua penjelasan yang ada di buku cukup dia mengerti untuk mengerjakan soal latihan yang diberikan. Hasil tesnya selalu rata-rata di atas 90%.

Dalam masa transisi dari sekolah tiap hari menjadi mengerjakan pekerjaan sekolah di rumah tiap hari, Jonathan kami berikan bahan-bahan mulai dari Brain Quest ataupun buku kumon yang kami peroleh di toko buku lokal. di awal tidak lebih dari 30 menit Jonathan sudah selesai pekerjaan sekolahnya. Jonathan langsung suka dengan rutinnya yang baru, karena dia tidak harus bangun pagi, dan kalau tidur agak larut (jam 10 – an), mama ga stress karena tau dia bisa bangun agak siang.

Waktu buku pelajarannya dari CLE sampai, Jonathan langsung senang sekali dan ga sabar untuk memulai, padahal saya berencana untuk membuat jadwal dulu. Tapi akhirnya kami pun langsung mulai dan saya merevisi jadwal secara bertahap. Karena tahun pertama homeschool saya merasa agak terlambat memulai, ada beban harus menyelesaikan semua dengan cepat. Beberapa bulan pertama kadang-kadang dalam 1 hari, Jonathan mengerjakan 2 unit pelajaran, tentunya kalau Jonathan masih semangat mengerjakannya. Hasilnya dalam waktu 8 bulan, kami menyelesaikan semua pelajaran untuk kelas 2 (yang biasanya dilakukan dalam 10 bulan). Hal ini bisa dilakukan karena hari libur kami tidak sebanyak hari libur sekolah, dan setelah semua selesai, kami libur panjang selama sebulan.

Kegiatan sekolah kami setiap harinya saya alokasikan pagi hari sampai sebelum makan siang. Jadi selesai sarapan dan mandi, langsung deh kerjakan pekerjaan sekolah. Setiap harinya kami belajar 3 atau 4 subjek dan rata-rata setiap subjek 30 -45 menit. Ada hari-hari di mana Jonathan agak bengong dan akhirnya 1 pelajaran memakan waktu lebih dari yang dialokasikan, kadang saya suruh dia berhenti di subjek itu dan ganti subjek. Subjek yang tidak selesai dikerjakan sore hari setelah bangun tidur siang (ya, Jonathan masih tidur siang kadang-kadang). Selesai makan siang, hari-hari tertentu Jonathan ada kegiatan di luar. Biasanya keluar rumah untuk pelajaran seni dan taekwondo atau main ketemu teman. Sekarang ini bisa dibilang setiap hari Jonathan keluar rumah. Secara berkala kami tanyakan apakah Jonathan ingin kembali ke sekolah biasa saja daripada sekolah di rumah? sejauh ini jawabannya selalu dia lebih suka homeschool. Sejak join dengan co-op, dia semakin senang dengan kegiatan homeschool, karena 1 kali seminggu, dia bertemu dengan teman-teman seumurannya sesama anak homeschool dan belajar hal yang berbeda dari yang ada di woworkbookny

Grade sebelumnya, kegiatan belajar di rumah saya jadwalkan 5 hari seminggu (Senin sampai Jumat), sabtu dan minggu libur karena papanya juga libur kerja. Semester lalu, karena ada kegiatan co-op di hari Senin, saya menjadwalkan 4 hari seminggu mengerjakan workbooknya di rumah. Grade 3 ini kami mulai di bulan Juli 2018, dan sekarang Februari 2019 kami sudah pertengahan buku ke-7. Desember lalu, kami kutin jadwal sekolah biasa, setelah buku ke-5, kami bisa ambil liburan semester, pulang ke Indonesia dan tidak mengerjakan buku sampai pertengahan Januari. Di pertengahan semester atau di saat papanya libur kantor, kami juga akan mengambil jatah libur.

Setelah ada pengalaman di tahun pertama, saya semakin bisa merasakan manfaat dan fleksibilitas dari homeschool. Saya juga udah ga terlalu banyak khawatir seperti di tahun pertama. Mungkin saya belum tau semua hal soal homeschool, tapi dari yang saya baca, tidak ada patokan yang kaku dalam menghomeschool. Homeschool itu upaya mendidik anak di rumah. Saya bisa bilang homeschool itu bukan cuma alternatif, tapi pilihan untuk setiap keluarga. Tidak semua orang harus memilih homeschool, tapi kalau memang bisa melakukannya, homeschool jauh lebih efektif dibandingkan kirim ke sekolah.

Untuk Jonathan homeschool itu sangat terasa manfaatnya dibandingkan belajar di sekolah. Dia tidak harus menghabiskan waktu terlalu lama di sekolah. Dia tidak harus bangun pagi-pagi, dan kalau ada hari di mana dia ga bisa tidur awal, dia selalu bisa bangun agak siang. Selama setahun ini Jonathan ga pernah sakit sampai menyebabkan dia ga bisa mengerjakan pekerjaan sekolahnya. Setahun ini berat badan Jonathan bertambah cukup signifikan karena dulu di sekolah kalau dia gak suka, dia ga makan siang dan gurunya ga ada yang memperhatikan sebanyak apa dia makan, sedangkan kalau di rumah saya pasti tau asupan makanannya cukup. Sejak gak ikutan co-op, saya menggantikan mengirim Jonathan ke group homeschool partime, di mana dia bertemu dengan anak homeschool lainnya 1 kali seminggu dan dia mendapatkan teman bermain dan belajar.

Buat saya sendiri, terasa lebih ringan sejak ga harus bangun pagi-pagi untuk antar jemput. Karena Jonathan juga sudah bisa membaca dan cepat mengerti sebuah konsep, saya ga harus susah payah mengajarkan sesuatu ke dia. Ada hari-hari di mana saya hanya perlu mengecek pekerjaanya saja. Kalau ada konsep yang dia belum mengerti saya akan beri penjelasan lebih banyak, dan Joe juga bisa bantu untuk memenjelaskan. Kadang-kadang kami berikan video penjelasan dan memberi kesempatan buat dia bertanya, atau belikan buku yang menarik minatnya saat ini.

Jadi kembali ke judul, homeschool atau kirim ke sekolah? sekarang ini saya akan pilih homeschool. Andai kami pulang ke Indonesiapun, saya akan tetap memilh homeschool. Semoga nantinya Joshua juga bisa dihomeschool seperti Jonathan. Semakin dijalani, walau ada hari-hari di mana Jonathan kurang bisa fokus, homeschooling ini lebih menjamin dia belajar sesuatu. Saya bersyukur, Jonathan cukup pintar dan bisa mengerti penjelasan yang diberikan. Masih ada hari-hari di mana saya kurang sabar mengajarkan sesuatu atau Jonathan yang bengong aja atau banyak bicara, tapi secara keseluruhan dia lebih banyak belajar daripada di sekolah.

Waktu kami ikutan co-op dan ngobrol dengan sesama orangtua yang menghomeschool anaknya, saya bisa melihat kalau anak homescholer juga cara belajarnya beda-beda. Ada anak yang belajar itu harus visual, misalnya untuk belajar math harus ada alat bantu fisiknya. Ada anak yang bisa mengerti dengan membuat craft terlebih dahulu. Saya juga jadi mengerti kenapa ada banyak sekali metode dan kurikulum homeschooling yang terbentuk.

Yang terpenting adalah anak punya kemampuan untuk belajar mandiri dan menerapkan apa yang dia pelajari dalam kehidupan sehari-hari untuk menjadi bekal di kemudian hari. Untuk saat ini kami tetap tidak kuatir dengan maslaah ijasah, karena jaman sekarang bukan ijasah yang dibutuhkan untuk jaminan masa depan, tapi yang diutamakan skill dan keuletan. Mau gigih berusaha dan tidak gampang menyerah.

Super Full Moon 2019

Dari beberapa hari lalu, sudah dapat link mengenai super full moon yang akan terjadi hari ini 19 Februari 2019. Tapi karena banyak kesibukan hari ini jadi terlewat informasi kalau badan astronomi Thailand yang ada di Chiang Mai ternyata mengadakan acara mengintip super moon pakai teleskop mereka. Untungnya sekarang ini semua ada di facebook ya, jadi walau ga bisa datang ke sana, bisa juga melihat hasil jepretan yang datang ke sana.

Foto super full moon dari FB page: อุทยานดาราศาสตร์สิรินธร Princess Sirindhorn Astropark

Tadi akhirnya cuma liat keluar dengan mata biasa, sekaligus memberi tahu Jonathan beberapa informasi mengenai super full moon ini. Seperti biasa, cara termudah mengajarkannya setelah melihat langsung adalah memberikan video mengenai apa itu super full moon. Fakta-fakta mengenai super full moon bisa di baca lengkap di sini.

Apa sih super full moon itu? bedanya apa dengan full moon yang bisa dilihat setiap bulannya? Jadi istilah super full moon ini sebenarnya karena bulannya lebih terang dan lebih besar dari biasanya. Super full moon ini belum tentu terjadi setiap tahun, super full moon ini kelihatan di bumi ketika jarak antara bulan dan bumi di titik terdekatnya. Tapi tahun ini cukup spesial, setelah bulan januari ada super blood full moon, bulan ini ada super full moon, dan kedua peristiwa ini bisa dilihat dari kota tempat kami berada.

Waduh apalagi itu blood moon. Ya bulannya kelihatan merah karena ada gerhana bulan total dan refleksi cahaya mataharinya kelihatan merah. Sayangnya, event ini juga saya terlewat tanggal 20 Januari 2019 lalu. Penjelasan yang lengkap mengenai super full blood moon ada di sini. Super blood moon juga tidak selalu terjadi setiap tahun.

Entah kenapa setiap lihat full moon, saya ingat dengan sailor moon. Saya bukan penggemar sailor moon, saya tidak ingat nama tokohnya dan kenapa dia pakai pakaian sekolah. Yang saya ingat hanya bagian: dengan kekuatan bulan, akan menghukummu. Setiap kali dengar bagian itu, saya bertanya-tanya emang kekuatan bulan apaan? bahkan bulan tidak punya sumber cahayanya sendiri. Aduh jadi kemana-mana deh ceritanya.

Lukisan sailor moon buatan Joe dulu

Coba lihat keluar, kira-kira hari ini bulannya lebih terang dari biasanya gak di tempat Anda. Kalau iya, ajak anak melihatnya sekalian kesempatan mengenalkan astronomi ke anak.

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

Mari kita coba hasilkan key RSA yang kecil . openssl minimum bisa menghasilkan key sangat kecil, sampai 16 bit, tapi tidak bisa melakukan enkripsi dengan key 16 bit karena adanya pengecekan security ekstra (nilai e > n). Jadi untuk contoh ini saya gunakan ukuran key 32 bit:

openssl genrsa -out private.pem 32

Nanti kita akan mendapatkan key yang sangat kecil dalam format base64 , seperti ini.

-----BEGIN RSA PRIVATE KEY----- MCwCAQACBQDLlcMZAgMBAAECBQCZk2iBAgMA7bsCAwDbOwICcwcCAjUFAgJMcw== 
-----END RSA PRIVATE KEY-----

Ini hanya contoh, ketika dijalankan ulang, perintah ini akan menghasilkan key baru. Karena hanya 32 bit, ada kemungkinan key yang dihasilkan bisa sama.

Catatan penting: RSA key yang disarankan saat ini adalah 2048 bit atau lebih. Penggunaan key 32 bit di sini hanya untuk penjelasan, supaya mudah diikuti dan dihitung manual.

Kita bisa mendapatkan public keynya dengan cara seperti ini:

openssl rsa -in private.pem -pubout -out public.pem

Contoh hasilnya seperti ini:

-----BEGIN PUBLIC KEY-----
MCAwDQYJKoZIhvcNAQEBBQADDwAwDAIFAMuVwxkCAwEAAQ==
-----END PUBLIC KEY-----

Di dasar teori RSA kita diberi tahu tentang bilangan p, q, N dsb. Tapi kenapa disimpan dalam bentuk teks seperti itu? Salah satu format standar penyimpanan key adalah PEM, di mana data diencode dengan menggunakan ASN.1. Mungkin lain kali saya akan membahas detail berbagai format key, certificate, dsb, tapi untuk saat ini saya akan membahas hal praktisnya saja.

Format ASN1 bisa diparse dengan asn1parse seperti ini:

$ cat private.pem | openssl asn1parse
0:d=0 hl=2 l= 44 cons: SEQUENCE
2:d=1 hl=2 l= 1 prim: INTEGER :00
5:d=1 hl=2 l= 5 prim: INTEGER :CB95C319
12:d=1 hl=2 l= 3 prim: INTEGER :010001
17:d=1 hl=2 l= 5 prim: INTEGER :99936881
24:d=1 hl=2 l= 3 prim: INTEGER :EDBB
29:d=1 hl=2 l= 3 prim: INTEGER :DB3B
34:d=1 hl=2 l= 2 prim: INTEGER :7307
38:d=1 hl=2 l= 2 prim: INTEGER :3505
42:d=1 hl=2 l= 2 prim: INTEGER :4C73

Tapi itu sulit dimengerti, kita bisa mengekstrak berbagai nilai dengan lebih jelas seperti ini:

Private-Key: (32 bit)
modulus: 3415589657 (0xcb95c319)
publicExponent: 65537 (0x10001)
privateExponent: 2576574593 (0x99936881)
prime1: 60859 (0xedbb)
prime2: 56123 (0xdb3b)
exponent1: 29447 (0x7307)
exponent2: 13573 (0x3505)
coefficient: 19571 (0x4c73)
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MCwCAQACBQDLlcMZAgMBAAECBQCZk2iBAgMA7bsCAwDbOwICcwcCAjUFAgJMcw==
-----END RSA PRIVATE KEY-----

Di sana bisa terlihat bahwa n (modulus) adalah 34155896571. Nilai e (public exponent) adalah 65537 dan nilai d (private exponent) adalah 2576574593. Dua bilangan prima p dan q ada di prime1 (p=60859) dan prime2 (q=56123). Nilai exponent1 adalah d mod (p-1) dan exponent2 adalah d mod (q-1) sedangkan coefficient adalah (inverse of q) mod p.

Berbagai nilai disimpan untuk memudahkan perhitungan walaupun redundan. Contoh: nilai exponent 1 adalah d mod (p-1) = 2576574593 mod (60859-1) = 29447, jadi sebenarnya jika exponent1 tidak disimpan, bisa dihitung dari nilai p dan q yang sudah ada. Bahkan untuk enkripsi/dekripsi saja, nilai d, e dan n sudah cukup. Nilai redundan ini kadang memudahkan atau mempercepat perhitungan tertentu dan ini merupakan hal standar yang diatur di  RFC 3447 (Section A.1.2 RSA Private Key Syntax).

Supaya lengkap, ini isinya jika kita periksa isi public key di atas:

$ cat public.pem | openssl rsa -pubin -text 
Public-Key: (32 bit)
Modulus: 3415589657 (0xcb95c319)
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MCAwDQYJKoZIhvcNAQEBBQADDwAwDAIFAMuVwxkCAwEAAQ==
-----END PUBLIC KEY-----

Sekarang kita bisa mengenkrip sebuah kata pendek. Contohnya saya buat file ini (parameter -n agar tidak ada karakter \n di file hasil):

echo -n Helo > input.txt

Atau jika dilihat representasi heksadesimalnya:

hexdump -C input.txt 
00000000 48 65 6c 6f |Helo|
00000004

Atau dalam bentuk bilangan: 0x48656c6f

Sekarang inputnya kita enkrip

cat input.txt | openssl rsautl -encrypt -pubin -raw -inkey public.pem >message.encrypted

Karena key sangat kecil (32 bit) kita hanya bisa mengenkrip data yang sangat kecil. Di sini saya memakai format “raw” (dengan adanya parameter -raw), alias tanpa padding sama sekali dan hasil datanya adalah “mentah” apa adanya tanpa header apapun. Sekarang mari kita lihat hasilnya:

$ hexdump -C message.encrypted 
00000000 1c fb ca d5 |….|
00000004

Hanya 4 byte (32 bit), atau dalam bentuk bilangan adalah: 0x1cfbcad5 atau 486263509 desimal. Rumus enkripsi RSA adalah:

 c \equiv m^e \pmod{n}

Sekarang kita bisa menghitung manual apakah benar enkripsi Helo (0x48656c6f) adalah 0x1cfbcad5. Untuk mudahnya kita gunakan Python:

>> print(hex(0x48656c6f**(65537) % (3415589657)))
0x1cfbcad5L

Hasilnya sesuai harapan, sama dengan hasil enkripsi openssl. Operasi perpangkatan lalu mod akan butuh waktu lama jika dilakukan pada bilangan yang lebih besar. Python punya fungsi built in untuk perpangkatan dengan modulus, seperti ini:

>> print(hex(pow(0x48656c6f, 65537, 3415589657)))
0x1cfbcad5L

Sekarang mari kita dekrip kembali message.encrypted

cat message.encrypted | openssl rsautl -decrypt -raw -inkey private.pem > result.txt

Bisa dicek bahwa output result.txt adalah Helo. Kita juga bisa mendekrip secara manual dengan Python

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

Atau dalam kode Python:

>> print(hex(pow(0x1cfbcad5, 2576574593, 3415589657)))
0x48656c6fL

Atau jika ingin dalam bentuk teks:

print(bytearray.fromhex("%08x" % (pow(0x1cfbcad5, 2576574593, 3415589657))))
Helo

Demikian artikel perkenalan RSA yang praktis. Dalam artikel ini belum dibahas mengenai hal yang penting yaitu: padding, proteksi password (key di atas tidak dienkrip) dan beberapa kelemahan RSA di kasus tertentu. Hal-hal tersebut rencananya akan saya bahas di tulisan lain.

Hex Editor

Saya beruntung dulu ketika kali pertama belajar komputer lebih dari 25 tahun yang lalu, saya hanya punya satu pilihan sistem operasi: DOS. Sistem operasi ini sangat sederhana dan bisa dimengerti sampai sangat detail. Waktu itu hanya ada 1 filesystem yang bisa dipakai untuk DOS: File Allocation Table (FAT).

PC Tools

Salah satu tool yang sangat membantu saya mendalami berbagai hal yang berhubungan dengan komputer adalah PC Tools. Software “ajaib” ini punya banyak fungsi, dan salah satunya adalah sebagai hex editor. Dengan hex editor ini dulu mudah sekali untuk mengubah string dalam sebuah program (misalnya iseng mengganti pesan error jadi bahasa Indonesia).

Hex editor ini juga berguna untuk memahami mengenai filesystem FAT. Misalnya jika tidak sengaja menghapus sebuah file, saya bisa mengedit sendiri FAT untuk mengembalikan huruf pertama file tersebut. Dalam FAT, jika file dihapus, hanya huruf pertamanya diganti dengan 0xE5, dan selama file belum ditimpa, maka bisa dengan mudah dikembalikan.

Sejak saat itu di berbagai sistem operasi, hex editor menjadi salah satu tool andalan. Berbagai varian tool ini telah membantu saya memahami banyak hal, dari mulai hal kecil misalnya mengecek apakah ada karakter spesial yang tidak terlihat dengan editor teks, sampai memahami format sebuah file.

Di Linux saya tidak memakai tool khusus, biasanya saya melihat representasi hexa sebuah file di command line dengan hexdump (dengan parameter -C). Jika ingin interaktif sayamenggunakan midnight commander (mc) yang merupakan tiruan dari Norton commander yang dulu saya pakai di DOS.

Hex viewer/editor di Midnight Commander

Emacs, editor favorit saya, juga memiliki fitur untuk melihat dan mengedit file dalam mode hex. Ini sangat berguna untuk mengedit file yang tidak terlalu besar (dalam orde megabyte). Jika filenya terlalu besar, emacs terasa lambat, tapi ini wajar karena emacs adalah editor teks yang tidak dirancang khusus untuk file biner berukuran besar.

hexl-mode di Emacs

Di Windows saat ini saya suka memakai HxD. Editor ini cukup lightweight, gratis dan dapat mengedit file berukuran besar dengan cepat. Software ini juga masih diupdate hingga saat ini. Fungsi-fungsi tambahannya (MD5, histogram, dsb) juga cukup berguna.

HxD di Windows

Sekarang ini tidak terlalu mudah untuk memahami sebuah sistem dengan menggunakan hex editor karena berbagai hal sudah sangat kompleks. Contohnya: filesystem EXT2/3/4 atau NTFS sudah terlalu rumit dibaca manual dengan hex editor.

Khusus untuk reverse engineering, sekarang ini sebenarnya banyak juga tool yang bisa membantu memahami format file, misalnya 010 Editor (komersial) dan Kaitai Struct (open source). Tapi tetap saja diperlukan banyak membaca sebelum bisa mulai, tidak seperti jaman dulu di mana semua masih sangat sederhana.

Cerita Jaman Kos

Sebelum tidur, Jonathan suka meminta diceritakan mengenai suatu hal dari masa lalu. Setelah mendapatkan cerita mengenai masa kuliah papanya dan mengenal istilah rumah kos, dia sekarang pengen dengar cerita dari saya juga. Dipikir-pikir, kalau dulu orangtua saya bercerita soal masa dulu waktu mereka sekolah, saya sering ga terbayang kira-kira apa yang akan saya ceritakan ke anak cucu saya. Ternyata dari sejak jaman masih kuliah sampai sekarang, sudah banyak hal-hal yang berbeda sekali dengan yang dialami Jonathan sekarang.

Saya ingat, waktu kost pertama dan ke-4, dapurnya itu gak ada yang namanya kompor gas kayak jaman sekarang. Yang disediakan dari tempat kost hanya kompor minyak tanah pakai sumbu, yang untuk meyalakannya saja butuh waktu dan kalau gak hati-hati pancinya gampang gosong.

Waktu kost pertama, saya dibelikan mama saya kompor gas kecil yang tabungnya bisa dibeli di minimarket, tapi tergolong mahal kalau sering-sering dipakai. Kompor itu dipakai untuk masak indomie saja kalau saya pingin sarapan Indomie. Saya lupa kompor itu akhirnya saya bawa ke Jakarta ke kakak saya atau ke Medan. Kompor jenis itu masih ada sampai sekarang dan biasanya digunakan kalau orang-orang mau kemping saja.

Kompor minyak dari tempat kost disediakan minyaknya sama ibu kost dan dibersihkan sama pembantunya ibu kost. Kami menggunakannya biasanya buat masak air kalau mau mandi air hangat. Pernah suatu kali pulang ospek penuh lumpur, saya harus menunggu air agak panas dulu sebelum mandi padahal itu sudah jam 2 dinihari. Untuk langsung tidur tanpa membersihkan badan bukanlah suatu pilihan. Nah tapi saya ingat juga, besoknya saya bablas ketiduran karena udah enaklah ya badan bersih tidur berselimut hangat. Alarm jam berbentuk ayam yang berkokok tak mampu membangunkan saya walaupun terletak di sebelah saya hahaha. Saya kebangun jam 10 pagi!, dan teman-teman kost saya pada protes karena si alarm ayam berkokok selama 30 menit dan saya tak bangun juga hahaha, mereka pikir saya gak di rumah dan cuma lupa mematikan setelan alarm.

Saya pindah kost beberapa kali di Bandung, saya ingat di kost ke-2 dan ke-3 kami punya kompor gas yang isi tabung gasnya kami beli secara patungan. Tapi walau udah ada kompor gas, ya tetap aja ya, kebanyakan dipakai buat masak indomie atau buat mandi air hangat haahaha. Kost-kostan ke-3 kembali lagi pakai kompor minyak tanah. Saya tadi sampai harus mencari video di YouTube untuk menjelaskan ke Jonathan soal bagaimana menyalakan kompor minyak tanah dan bedanya dengan kompor yang digunakan sekarang.

Jadi setelah bercerita bahwa dulu mama gak semudah sekarang buat menyalakan kompor, saya juga bercerita kalau mesin pemanas air itu bukan hal yang selalu ada di Indonesia seperti di sini. Eh tau-tau dia bergeser pertanyaan ke mesin cuci. Kapan mama pertama kali punya mesin cuci?

Jadilah teringat lagi, kalau dulu itu, walaupun waktu tinggal di rumah orangtua saya ada mesin cuci, tapi di kost-kostan itu tidak ada yang namanya mesin cuci. Kalau masih ada uang saku lebih, paling bayar ekstra untuk mencari mbak yang mencucikan dan menyetrika baju. Kadang-kadang di tempat kost ada yang membatasi sehari hanya boleh mencuci 2 potong pakaian. Ada juga yang bebas berapa banyak tapi bayarnya langsung ke mbaknya. Tapi ada juga tempat kost yang gak ada mbaknya. Jadi ada masa di mana saya mencuci baju sendiri manual!. Untungnya sejak jaman kuliah saya gak punya banyak baju berbahan jeans yang berat-berat, jadi urusan mencuci tergolong enteng.

Saya tahu di banyak tempat mencuci manual itu masih merupakan preferensi banyak orang, tapi kalau sekarang ini saya harus mencuci baju 4 orang tanpa mesin, rasanya udah kebayang pengen nangis karena bakal lama selesainya dan juga kapan keringnya hehehe. Memang ya, kalau kita udah terbiasa dengan teknologi, kembali melakukan hal manual itu kerasa jadi berat, padahal kalau dilakukan mungkin aja gak seberat itu (eh tapi saya ogah ah nyuci manual hahaha).

Ceritanya jadi kemana-mana, tapi memang begitu kalau Jonathan sudah mulai bertanya, bisa gak ada habisnya. Biasanya saya yang harus menyudahi ceritanya dan suruh dia ingat menanyakan lanjutannya di kemudian hari kalau memang masih penasaran. Tapi dari bertahun-tahun hidup sebagai anak kost, ada banyak hal yang gak bisa saya lakukan seandainya saya ga pernah dilatih dari rumah. Mana mungkin tiba-tiba saya bisa menyetrika atau tahu memisahkan mencuci baju luntur dan tidak luntur kalau nggak pernah diberitahu/disuruh kerja sama mama saya. Memang ada kemungkinan beberapa lifeskill bisa dipelajari kemudian dari video yang ada di YouTube, tapi rasanya bersyukur aja dari rumah sudah diajari melakukan berbagai hal, sehingga waktu jadi anak kost bisa melakukan pekerjaan-pekerjaan seperti mencuci baju dan menyetrika.

Saya gak tau apa lagi kemajuan yang akan terjadi di masa Jonathan besar nanti, tapi sepertinya dia perlu juga diajari beberapa keahlian untuk mengurus dirinya sendiri. Siapa tahu nanti dia jadi anak kost juga kalau kuliahnya gak tinggal di kota yang sama dengan kami. Karena saya dan Joe sama-sama jadi anak kost setelah masa kuliah, kami juga mengajarkan ke anak-anak kalau mereka juga harus bisa mengurus dirinya sendiri nantinya setelah umur kuliah.

Mengembalikan Hobi Lama

Sebelum punya anak, saya sempat rajin merajut dan belajar jahit. Sejak Jonathan lahir, entah kenapa hobi merajut dan menjahit itu menguap terbang hilang. Mungkin karena saya kurang suka meninggalkan pekerjaan rajutan terlalu lama, akhirnya saya enggan untuk memulai. Beberapa kali mencoba mengembalikan mood, tapi ya akhirnya cuma browsing-browsing pola dan gak mulai juga.

Saya tahu punya anak bukan alasan untuk berhenti berhobi, tapi punya banyak rajutan yang gak kunjung selesai tidak membuat saya jadi rileks malah jadi senewen, maka akhirnya saya tinggalkan saja hal-hal yang bikin senewen. Hobi itu untuk dinikmati, bukan bikin jadi senewen toh hehehe.

Sekarang ini anak-anak sudah mulai besar. Saya merasa sudah waktunya saya punya waktu lagi untuk hobi saya. Anak-anak juga sudah mulai terbiasa bermain sendiri, asal mereka ga mainin benangnya sampai kusut, teorinya saya sudah bisa mulai merajut lagi.

Selama bertahun-tahun, benang dan jarum rajutan masih tersimpan rapi dan di bawa pindah rumah beberapa kali. Tahun ini saya mau kembali merajut lagi. Sepertinya kalau tahun ini masih gagal kembali merajut, harta karun merajutnya bisa di hibahkan saja ke orang-orang yang masih suka merajut.

Saya sudah menemukan komunitas merajut di kota ini, komunitasnya mengadakan pertemuan sekali seminggu dan kebetulan di hari yang sama dengan jadwal Jonathan les. Rencananya sesekali saya mau ikutan datang ketemu, supaya semangat berkaryanya tetap ada.

Selain mencari komunitasnya, kemarin saya memaksa diri untuk memulai mengerjakan hal yang kecil dan bisa selesai sekali duduk. Sambil nonton serial MacGyver, akhirnya selesai juga rajutan bunga rose. Rencananya nanti bunga ini akan ditempelkan di bandana, tapi bandananya belum dibikin hehehe. Sekarang lagi nyari-nyari motif bandana, dan udah dapat beberapa pattern yang bisa ditiru.

Setidaknya, hobi merajut ini bisa kelihatan hasilnya daripada hobi nonton film korea hahaha. Mending kalau nonton koreanya menghasilkan tulisan review, sejauh ini saya masih terlalu malas mereview film-film korea yang sudah saya tonton. Kalau dikombinasikan, bisa juga nonton kdrama sambil merajut hahaha.

Ngomongin kdrama dan merajut, saya ingat di salah satu kdrama yang saya tonton, si cowo merajut syal pink waktu dia sakit. Terus setelah dia sembuh dan mereka ketemu, syalnya dikasihin ke cewenya, dan diujung syalnya ada gulungan benang yang berisi cincin melamar si cewe. Ayo ada yang ingat ini kdrama yang mana? bisa jadi undian berhadiah nih. Hmm sayangnya saya jauh di Thailand, kalau nggak saya kasih hadiah benang deh hehehhe.

Kalau ada yang mau lihat tulisan lama soal hobi lama saya, bisa lihat di blog saya yang ini. Blognya udah gak pernah diupdate lagi. Mungkin nanti kalau udah banyak rajutannya baru deh diupdate lagi di sana.