Archive for January, 2008

2nd

Friday, January 11th, 2008

2 Muharram – Jum’at

entry - quote  :“
dari yang kecil kita tahu yang besar ”

entry – vocab  : 

an intriguing rump session aside conference building
commence my crypto-discovery

Enak juga bisa ngerasain tidur siang…tapi gw masih belom
bisa ngeliat dengan jelas karena lensa kacamata gw patah….hmmpp..
 

RSA (2)

Melanjutkan hal kemarin tentang blok operasi pada RSA maka
pada tulisan ini akan diberikan sedikit gambaran bagaimana sebenarnya RSA
diimplementasikan di dunia nyata.

 RSA Laboratories, sebuah perusahaan
yang didirikan oleh para penemu RSA, mengeluarkan sebuah dokumen yang disebut Public Key Cryptography Standard
(PKCS). PKCS itu seperti RFC pada dunia computer. PKCS sendiri terdiri dari
banyak seri, yang mendefinisikan masing-masing fitur kriptografi. Nah untuk RSA
itu sendiri didefinisikan pada PKCS nomor 1 (ya iyalah, masa anak emasnya
ditaruh di nomor dua).

Jadinya gampang kan kalau mau buat aplikasi RSA, liat aja PKCS 1. Paling ngga kita tidak akan
melakukan kesalahan2 bodoh yang dapat membuat aplikasi kita tampak kurang gagah apalagi sampai mengurangi
keamanan dari user. Terlepas bahwa RSA Laboratories berasal dari Amerika yang
penting kan ilmunya (klo kita berdebat masalah politik ataupun “teori konspirasi” mah ga
bakalan ada ujungnya, malah akan membuat kita berkhayal yang ngga2 en
aplikasinya malah gak jadi nantinya).

Oke lanjut ya.. 

PKCS 1 sendiri udah 3 kali terbit, edisi revisi terakhir
adalah PKCS 1 versi 2.1 yang dikeluarkan pada 14 Juni tahun 2002. Lha kok
“revisi”?

Revisi karena PKCS 1 perlu disesuaikan dengan perkembangan
jaman terutama untuk mengantisipasi serangan terhadap RSA itu sendiri. Nah setelah 5 tahun setengah diterbitkan
sepertinya belum ada versi PKCS yang baru. Oleh karena itu yang akan dibahas
adalah versi 2.1 ini.

Isu utama yang
melingkupi versi 2.1 ini adalah pada apa yang disebut “plaintext-aware encryption”. Maksudnya adalah ternyata kita perlu
mendesain plaintext yang akan
dioperasikan dengan RSA sedemikian rupa agar tidak dapat di-crack dengan mudah oleh orang yang tidak
berhak. Kenapa begitu? Bukankah cukup dengan mengoperasikan pada blok bit yang
lebih besar akan membuat frekuensi analisis jadi sia-sia.

 RSA itu kan public-key. Layanan dalam public-key kan berbeda. Protokol yang
digunakan tentunya berbeda juga. Skenario serangan juga akan berbeda. Nah
ternyata RSA dapat diserang dengan lebih mudah jika ia telah diimplementasikan
menjadi protokol. Silakan baca paper James Manger pada LNCS 2139 tahun 2001
halaman 230-238. Klo googling cari aja dengan keyword “chosen ciphertext
attack+oaep+james manger+pdf”.

Klo ketemu kata
yang disebut “oracle” maka boleh sih
dibayangin sosok Oracle di file The Matrix.
Semula gw meragukan oracle tapi ternyata oracle
itu mungkin kok.
Ntar kita bahas di lain waktu yang lebih pas.

 
PKCS 1 versi 2.1

RSAES-OAEP is parameterized by the choice of
hash function and mask generation

function. This choice should be fixed for a
given RSA key
.

 Kalimat
diatas gw kutip dari PKCS 1 versi 2.1. Jadi ada 2 kata kunci yang penting yaitu
hash function” dan “masking”.

 Tanpa mengesampingkan item
yang lain, ada 2 item utama pada PKCS
1 ini. Pertama adalah pengadopsian kunci privat yang memungkinkan proses
dekripsi dilakukan lebih cepat melalui skema Chinese Remainder dan yang kedua adalah Pengkodean pesan sebelum
dienkripsi (pengadopsian plaintext-aware).
Nah pengkodean pesan itu dilakukan
dengan bantuan fungsi hash dan masking.
Penjelasan mengenai bagaimana skema Chinese
Remainder
digunakan dapat dilihat pada sub bagian 3.2 RSA private key pada
PKCS 1 versi 2.1. Sekarang kita fokuskan pembahasan pada desain pesan yang
menerapkan plaintext-aware encryption.

 
RSAES-OAEP

Nama
keren dari pengkodean pesan itu adalah RSAES-OAEP. Jangan tertipu oleh namanya
yang nyentrik. RSAES-OAEP adalah singkatan dari RSA Encryption Scheme-Optimal
Asymmetric Encryption Padding. Jadi intinya adalah “padding”. Sebelum pesan diproses melalui formula M^e (mod N) maka M
di-padding sedemikian rupa supaya
oke-punya. Cara padding-nya tentu ga
sembarangan karena operasi RSA itu sendiri itu udah cukup membebani prosesor
dan memori komputer maka padding
haruslah efisien tapi tetap Aman
(makanya namanya Optimal). Penjelasan
yang lain mengenai skema signature/tanda-tangan
ataupun mengenai PKCS 1 versi 1.5 dapat dibaca di dokumen PKCS 1 versi 2.1.

 Klo gambarnya gak
muncul, tolong liat Figure 1:EME-OAEP encoding operation
dari PKCS 1 versi 2.1 ya (mudah2an ada di halaman 19) …en ga usah bingung
dengan apa itu EME-OAEP, itu mah cuma nama alias aja.

 

Kotak yang
bersambung-sambung tersebut melambangkan oktet-oktet heksadesimal yang saling
meyambung (concate). M adalah pesan.
Pesan yang biasanya berupa string dikonversi terlebih dahulu menjadi oktet-oktet
heksadesimal melalui skema OS2IP (lihat halaman 9 dari pkcs 1 v 2.1). PS adalah
oktet nol yang digenerate oleh kita (panjangnya menyesuaikan panjang pesan dan
modulus) dan lhash adalah hasil
fungsi hash dari label yang kita berikan terhadap pesan. Panjang dari lhash adalah panjang output dari suatu
fungsi hash, kita sebut saja hlen. Fungsi
hash dapat dipilih dari 6 algoritma hash berikut, MD2, MD5, SHA-1, SHA-256,
SHA-384, SHA-512. Panjang dari nilai modulus penerima kita lambangkan dengan k, dimana nilai modulus tersebut
direpresentasikan dalam oktet heksadesimal (oktet heksadesimal itu dua digit
nilai heksa, misal 00h itu 1 oktet).Trio kwek-kwek tersebut kita sebut aja
dengan DB. Karena panjang dari lhash adalah hlen maka panjang dari DB
adalah k-hlen-1.

Kemudian kita
perlu menggenerate sebuah seed dengan
panjang sama dengan panjang hlen. Seed tersebut dimasukkan ke fungsi
pembangkit masking (Masking Generation Function-MGF) dimana
outputnya adalah oktet pseudorandom
dengan panjang k-hlen-1. Hasil dari
MGF yang pertama kemudian di-XOR dengan DB menghasilkan apa yang kita sebut
saja maskedDB.

Kemudian maskedDB dimasukkan lagi ke MGF sehingga
dihasilkan oktet pseudorandom dengan
panjang hlen. Hasil MGF ke-2 ini
di-XOR dengan nilai seed sehingga
menghasilkan apa yang kita sebut aja maskedSeed.

Nah tinggal tambah 1 oktet 00 didepan gabungan maskedSeed dan maskedDB kita dapatkan pesan yang sudah di-encode dan siap untuk dimasukkan ke operasi RSA.

 

Dapat kita lihat bahwa Keamanan dari RSAES-OAEP bergantung
pada kerandoman output dari fungsi hash yang digunakan. Dengan tumbangnya MD5 maka kita harus berhati-hati
dalam memilih fungsi hash. Sebaiknya gunakan SHA, klo bisa mulai SHA-256.

 Note :
- MGF adalah fungsi deterministik yang sepenuhnya
bergantung pada input.
MGF didasarkan pada fungsi hash. Karakteristik
keamanan yang diberikan oleh MGF adalah “Jika diberikan sebagian dari output
maka tidak mungkin memperkirakan bagian output yang lainnya”.
- PKCS 1 versi
2.1 ini juga masih menyediakan dukungan terhadap PKCS 1 versi 1.5, tapi
penggunaan versi 1.5 tidaklah disarankan untuk aplikasi baru. Pengkodean versi 1.5 hanya untuk mengatasi isu
kompatibilitas dengan aplikasi yang sudah lama.

1-Muharram 1429

Thursday, January 10th, 2008

entry-quote
: "Belajarlah untuk melakukan banyak pekerjaan saat kau sedang
tidak ada kerjaan, agar jika tiba saat untukmu bekerja segala
sesuatunya akan jadi lebih Mudah"

 

entry-vocab :

- inevitable collide deprive the
discord juxtaposition of myriad luminous vertex.

- the envoy akin the poet, shatter retrospective proponent and
exponent into bewilder   situation in 57-th commemorate of John
parlor.

 

Hari pertama di 1429…perut gw
sakit…dah 3 hari ini gw begadang terus…lidah kerasa pahit…kayak
gejala tifus…
tapi sekarang dah mendingan..

 

Wah…Persipura menang lagi lawan
D’jak….gw salut sama semangat anak2 Mutiara Hitam ini…biar maen
di kawasan orang lain tapi tetep yahud..
gw tunggu aksi elo2 lagi di final
copa…

 

RSA(1)

Sejarahnya sih udah lama,30 tahun-an yg
lalu Rivest, Shamir dan Adleman bikin suatu algoritma enkripsi dengan
manfaatin sifat operasi modulus dan sifat bilangan prima yang
dipelopori oleh Teorema Fermat. Berbeda dengan punyanya Diffie dan
Hellman yang lebih diperuntukkan untuk pertukaran kunci maka RSA ini
bisa buat enkripsi sekaligus juga bisa buat tanda-tangan.

 

Berikut langkah-langkah dalam algoritma
RSA (gw translate bebas dari bukunya

Simon Singh : The Code Book tahun 2002)

 

  • Pertama-tama, Ivan harus memilih 2
    bilangan prima, sebut saja p dan q. Seharusnya agar lebih aman
    dipilih bilangan prima besar (bilangan prima lebih dari 1 juta
    misalnya) namun untuk contoh ini dimisalkan p =17 dan q = 11. Kedua
    bilangan prima ini harus dijaga kerahasiaannya oleh Ivan.

  • Kemudian Ivan mengalikan kedua
    bilangan prima tersebut, sebut saja hasilnya dengan N, dalam hal ini
    N = 187. Lalu Ivan memilih lagi sebuah bilangan, sebut saja e. Nilai
    e tersebut haruslah relatif prima terhadap nilai euler dari N. 

euler(N) = (p-1) * (q-1)

Untuk mudahnya
pilih saja bilangan prima yang lebih kecil dari N.

Dalam contoh ini
dimisalkan Ivan memilih e = 7

  • Kemudian Ivan mempublish nilai e
    dan N di suatu tempat penyimpanan umum, kalau di internet misalnya
    di website milik Ivan atau di friendsternya Ivan juga boleh. Hal ini
    supaya semua orang dapat melihat nilai e dan N yang berguna saat
    melakukan enkripsi nantinya. Nilai e dan N disebut kunci publik.

Catatan : Nilai e
tiap-tiap orang bisa saja sama, yang penting adalah nilai N-nya
berbeda.

  • Untuk mengenkripsi sebuah pesan
    pertama-tama pesan tersebut mesti diubah menjadi sebuah bilangan.
    Sebagai contoh, sebuah kata atau huruf dapat diubah menjadi nilai
    ASCII-nya. Kemudian nilai (bit-bit) ASCII tersebut dapat diubah
    menjadi nilai decimal.

Pesan dienkripsi
menggunakan rumus :

C = M^e (mod N)

Cat : tanda ^
adalah symbol dari operasi pangkat.

  • Misal Ruben ingin mengirimkan
    sebuah pesan sederhana, hanya sebuah huruf X misalnya. Nilai ASCII
    dari X adalah 1011000 yang sama dengan nilai decimal 88. Maka M = 88

  • Untuk mengenkripsi pesan, Ruben
    perlu melihat kunci publik Ivan. Dengan e = 7, N = 187 dan M = 88
    maka

C = 88^7 (mod 187)

  • Kalau dihitung menggunakan
    kalkulator biasa maka nilai yang dihasilkan akan tidak mencukupi
    untuk ditampilkan di layer kakulator. Oleh karena itu kita akan
    menggunakan sedikit trik. Kita tahu bahwa 7 = 4 + 2 + 1.

 

88^7 (mod 187) = [88^4 (mod 187)
* 88^2 (mod 187) * 88^1 (mod 187)] (mod 187)

 

      88^1 = 88 = 88
(mod 187)

88^2 = 7744 = 77 (mod 187)

88^1 = 59.969.536 = 132 (mod 187)

88^7 = 88 * 77 * 132 = 894.432 = 11 (mod 187)

 

Maka cipher teks
yang dikirim Ruben ke Ivan adalah 11.

 

  • Sebagaimana kita tahu, operasi
    eksponensial dalam aritmatika modular adalah salah satu fungsi satu
    arah (one-way function), sehingga sangat sulit untuk menemukan
    kembali pesan M jika diberikan C. Oleh karena itu Eko (pengganggu)
    tidak dapat mendekripsi cipher teks tersebut.

 

  • Namun, Ivan dapat mendekripsi
    cipher teks karena Ivan memiliki informasi tambahan yaitu mengetahui
    nilai p dan q. Ivan perlu menghitung sebuah nilai, sebut saja dengan
    d, yang merupakan kunci dekripsi atau lazim disebut kunci pribadi.
    Nilai dihitung dengan rumus

 

e * d = 1 (mod
(p-1) * (q-1))

7 * d = 1 (mod 16 *
10)

7 * d = 1 (mod 160)

      d = 23

 

Karena nilai d
diperoleh dengan cara menebak (iterasi atau trial-error) maka cara
ini sebenarnya tidak bisa dilakukan dengan efektif jika nilai p dan q
sangat besar. Cara yang lebih efektif dapat menggunakan algoritma
Euclid.

 

  • Untuk mendekripsi cipher teks,
    Ivan menggunakan rumus

M = C^d (mod N)

M = 11^23 (mod 187)

M = [11^1 (mod 187) * 11^2 (mod 187) * 11^4 (mod 187) *
11^16 (mod 187) ] (mod 187)

M = 11 * 121 * 55 * 154 (mod 187)

M = 88 = X dalam ASCII

Selesai deh langkah2nya.

Menerapkan RSA secara huruf-per huruf seperti diatas bukanlah hal
yang baik karena akan membuat RSA menjadi seperti sistem
substitusi-monoalfabetik yang dapat dipecahkan dengan
analisis-frekuensi. Dalam praktiknya (lihat pkcs 1) enkripsi RSA
dilakukan pada blok dari bit yang lebih besar sehingga akan
menyulitkan (impossible) analisis frekuensi.   

Serangan terhadap
algoritma RSA secara normal dilakukan dengan faktorisasi. Berhasil
tidaknya faktorisasi amat bergantung pada pemilihan nilai p dan q.
Semakin besar nilai p dan q maka faktorisasi semakin memakan waktu.
Kelemahan yang biasanya mengakibatkan RSA bisa di-crack adalah pada
keteledoran user ataupun pembuat aplikasi RSA (engineer) dalam
menerapkan algoritma RSA. Serangan pada RSA juga biasanya dilakukan
pada level protokol dimana celah tidak hanya muncul dari RSA namun
dapat berawal dari skema lain dalam protokol tersebut.

Sementara ini,
setelah usianya mencapai paruh baya, algoritma RSA tetap Simple But
Powerfull.