09 Oct 2008 @ 3:28 AM 

Nah, setelah lama nggak posting, sekarang gw mau posting tapi bukan tentang opini, tapi iklan untuk salah satu aplikasi buatan gw sendiri: MD5Fivers versi BETA.
Apa itu MD5? MD5 merupakan salah satu teknik perhitungan hash yang sering digunakan sekarang ini. Cari di Wikipedia untuk penjelsan lebih lanjut.
Tapi berhubung bukan untuk umum (masih versi BETA soalnya) jadi gw cuma ngasih ke orang yang kirim email ke gw di nitenightknight@yahoo.com.
Yah, cuma mau memberitahu itu saja kok.

Tags Categories: Programming Posted By: Penguin
Last Edit: 09 Oct 2008 @ 03 28 AM

EmailPermalinkComments (0)
 16 Sep 2008 @ 12:11 AM 

Nah, berhubung ternyata gak ada yang ngebahas soal gw, gw jadi terdorong untuk ngebahas soal gw sendiri yang tentang kriptografi. Positif thinking aja, mungkin anak-anak osn kompi lain lagi sibuk menghadapi nasib… eh, pelatnas.

Kenapa gw bahas soal ini di blog gw sendiri dan bukannya di blog osn kompi? Yah, alasannya sederhana aja, gw cuma mau mempromosikan blog gw ini. Jadi jangan marah yaaa…

Oke, kita mulai pembahasan ini dengan melihat contoh testcase kita:
Input:
agung
keren
agung
cool
agung utama
ganteng

Output:
KKLRT
CUIYI
GGHGK ATNFE

Algoritma kriptografi ini (yang notabane disebut “Vigenere Chiper”winking untuk dipemograman sebenatnya sederhana:
1. Input plain text.
2. Input sandi.
3. Rubah huruf pertama plain text dengan huruf pertama sandi sesuai tabel.
4. Kalau bertemu spasi, jangan di proses, dan sandi dimulai lagi dari huruf pertama.
5. Kalau sudah sampai ke huruf akhir sandi, kembalikan ke huruf pertama sandi.
Baca soal lagi kalau tidak mengerti dengan algoritmanya.

Gak sulit kan? Tapi yang terlihat ternyata tidak semudah kelihatannya. Coba lihat lagi poin ke 3. Kita diminta mencocokan dengan tabel. Sekedar cerita, dulu gw bikin kodenya pakai array 2 dimensi, jadi keluaran sandi[huruf plain, huruf sandi] adalah hasilnya. Cara ini bisa dibuat untuk enkripsi, tapi gimana dengan dekripsi? Silahkan coba sendiri.

Kalau pakai array juga memakan memori banyak. Satu variabel char sudah 1 byte. Kalau ada 26 huruf berarti ada 26 X 26 variabel char (676 variabel). Kelihatannya sedikit, tapi tidak efektif. Jadi marilah kita tinggalkan cara ini.

Coba perhatikan tabel kriptografi ini. Kalau diperhatikan, sebenarnya chiper text merupakan hasil increment dari plain text. contoh: ‘A’ dengan sandi ‘A’ menghasilkan ‘A’ lagi. ‘A’ dengan sandi ‘B’ menghasilkan ‘B’. Kalau ‘F’ dengan sandi ‘L’ akan menghasilkan ‘Q’ (huruf ‘F’ naik sebanyak ‘L’ – 1 kali).

Sekarang, dalam pascal kita bisa tulis:
////////////////////////////////////////////////////////
var
input : string; //variabel untuk plain text
sandi : string; //variabel untuk sandi
i,j,k : byte; //variabel untuk (i)iterasi, (j)panjang sandi, dan (k)hurufsandi

begin
repeat //untuk perulangan

readln(input); //input plain
if input = ” then exit; //kalau kosong, selesai

readln(sandi); //input sandi

j := length(sandi); //simpan panjang sandi
input := upcase(input); //jadikan input huruf besar
sandi := upcase(sandi); //jadikan sandi huruf besar
k := 1; //simpan huruf ke berapa sandi akan dipakai

for i := 1 to length(input) do
begin
if input[i] = ‘ ‘ then begin k := 1; continue; end;
//kalau huruf spasi, jangan diproses
input[i] := chr( ord(input[i]) + ord(sandi[k]) – 65 );
//huruf input dinaikan sebanyak huruf sandi dikurangi 65(ASCII dari ‘A’winking
if ord(input[i]) > ord(‘Z’winking then
input[i] := chr( ord(input[i]) – 26 );
//Kalau lebih dari Z maka kurangi 26 huruf
k := k + 1;
//Gunakan huruf sandi berikutnya
if k > j then k := 1;
//Kalau lebih panjang dari sandi itu sendiri, kembalikan ke huruf pertama
end;

writeln(input); //cetak hasilnya

until input = ”;

end.
////////////////////////////////////////////////////////

Dari logika tadi, maka untuk mendekrip bisa kita rubah sedikit kodenya. Dimana setiap simbol dibalik.
////////////////////////////////////////////////////////
var
input : string; //variabel untuk plain text
sandi : string; //variabel untuk sandi
i,j,k : byte; //variabel untuk (i)iterasi, (j)panjang sandi, dan (k)hurufsandi

begin
repeat //untuk perulangan

readln(input); //input plain
if input = ” then exit; //kalau kosong, selesai

readln(sandi); //input sandi

j := length(sandi); //simpan panjang sandi
input := upcase(input); //jadikan input huruf besar
sandi := upcase(sandi); //jadikan sandi huruf besar
k := 1; //simpan huruf ke berapa sandi akan dipakai

for i := 1 to length(input) do
begin
if input[i] = ‘ ‘ then begin k := 1; continue; end;
//kalau huruf spasi, jangan diproses
input[i] := chr( ord(input[i]) – ord(sandi[k]) + 65 );
//huruf input diturunkan sebanyak huruf sandi ditambah 65(ASCII dari ‘A’winking
if ord(input[i]) <> j then k := 1;
//Kalau lebih panjang dari sandi itu sendiri, kembalikan ke huruf pertama
end;

writeln(input); //cetak hasilnya

until input = ”;

end.
////////////////////////////////////////////////////////

Sebenarnya untuk tugas yang sekarang kode ini sudah cukup, karena testcase sudah pasti tidak memiliki karakter lain selain alphabet dan spasi. Tapi sebenarnya dalam Vigenere Chiper, ada kemungkinan kalau input memiliki karakter khusus (seperti “‘!@#$%^&* dll). Maka, ada baiknya kita melakukan pengecualian proses untuk karakter-karakter tersebut. Kalau gw lebih suka pakai tipe set.
var
…..
himp : Set of char;
…..

jadi kode enkrip:
////////////////////////////////////////////////////////
var
input : string; //variabel untuk plain text
sandi : string; //variabel untuk sandi
i,j,k : byte; //variabel untuk (i)iterasi, (j)panjang sandi, dan (k)hurufsandi
himp : Set of char //variabel himpunan karakter yang diizinkan

begin
repeat //untuk perulangan

readln(input); //input plain
if input = ” then exit; //kalau kosong, selesai

readln(sandi); //input sandi

j := length(sandi); //simpan panjang sandi
input := upcase(input); //jadikan input huruf besar
sandi := upcase(sandi); //jadikan sandi huruf besar
himp := ['A'..'Z']; //krakter yang diizinkan dari A sampai Z
k := 1; //simpan huruf ke berapa sandi akan dipakai

for i := 1 to length(input) do
begin
if input[i] = ‘ ‘ then begin k := 1; continue; end;
//kalau huruf spasi, jangan diproses
if not(input[i] in himp) then continue;
//kalau tidak termasuk huruf yang diizinkan, jangan diproses
input[i] := chr( ord(input[i]) + ord(sandi[k]) – 65 );
//huruf input dinaikan sebanyak huruf sandi dikurangi 65(ASCII dari ‘A’winking
if ord(input[i]) > ord(‘Z’winking then
input[i] := chr( ord(input[i]) – 26 );
//Kalau lebih dari Z maka kurangi 26 huruf
k := k + 1;
//Gunakan huruf sandi berikutnya
if k > j then k := 1;
//Kalau lebih panjang dari sandi itu sendiri, kembalikan ke huruf pertama
end;

writeln(input); //cetak hasilnya

until input = ”;

end.
////////////////////////////////////////////////////////

dan dekrip:
////////////////////////////////////////////////////////
var
input : string; //variabel untuk plain text
sandi : string; //variabel untuk sandi
i,j,k : byte; //variabel untuk (i)iterasi, (j)panjang sandi, dan (k)hurufsandi
himp : Set of char //variabel himpunan karakter yang diizinkan

begin
repeat //untuk perulangan

readln(input); //input plain
if input = ” then exit; //kalau kosong, selesai

readln(sandi); //input sandi

j := length(sandi); //simpan panjang sandi
input := upcase(input); //jadikan input huruf besar
sandi := upcase(sandi); //jadikan sandi huruf besar
himp := ['A'..'Z']; //krakter yang diizinkan dari A sampai Z
k := 1; //simpan huruf ke berapa sandi akan dipakai

for i := 1 to length(input) do
begin
if input[i] = ‘ ‘ then begin k := 1; continue; end;
//kalau huruf spasi, jangan diproses
if not(input[i] in himp) then continue;
//kalau tidak termasuk huruf yang diizinkan, jangan diproses
input[i] := chr( ord(input[i]) – ord(sandi[k]) + 65 );
//huruf input diturunkan sebanyak huruf sandi ditambah 65(ASCII dari ‘A’winking
if ord(input[i]) <> j then k := 1;
//Kalau lebih panjang dari sandi itu sendiri, kembalikan ke huruf pertama
end;

writeln(input); //cetak hasilnya

until input = ”;

end.
////////////////////////////////////////////////////////
Sekarang, kita sudah benar-benar selesai dengan Vigenere Chiper.

Yah, pambahasan ini masih banyak kelemahannya. Pertama, mungkin kurang jelas. Kedua, gw terlalu ganteng (gak nyambung, oon!). Gw menerima segala kritik, saran, dan pujian dari siapa saja (siapa yang mau muji?). Terima Kasih atas perhatiannya, semoga anda yang memperhatikan selalu berbahagia dan yang tidak memperhatikan selalu sengsara (??).

Pembahasan tentang IP converting masih di proses.

Tags Categories: Pembahasan, Programming Posted By: Penguin
Last Edit: 16 Sep 2008 @ 12 11 AM

EmailPermalinkComments (0)
 13 Sep 2008 @ 6:03 AM 

Soal ini juga pernah gw terbitin di http://osn08kom.blogspot.com

Tau gak IP address?? Kalau bahasa umumnya, IP address itu seperti alamat rumah kita didunia maya. Dengan IP address kita bisa dikenal di internet saat browsing, chatting, dll. Tapi tau gak kalau sebenarnya kita bisa menentukan lokasi komputer cuma dari alamat IP nya? Bagi yang tau tentang IP, pasti tau dong kalau kita bisa mengecek asal IP address dengan mengunjungi situs tertentu atau dengan aplikasi bantuan. Kita fokus tentang situsnya.

Situs yang bisa menginformasikan asal IP address ada banyak (googling aja sendiri!) tapi metodenya sama: mencocokan suatu IP address dengan database. Nah, disini masalah databasenya: IP address terbagi kedalam 4 sub-block. Kalau tiap sub-block harus dicocokan, bisa repot.

Karena itu database ini memakai cara yang lain, yaitu dengan menghitung IP number dari IP address tersebut baru dicocokan dengan database. Contoh: IP address 202.186.13.4 mempunyai IP number 3401190660. Sebuah negara memiliki range IP number yang berbeda dengan range IP number negara lain. Dengan IP number tadi, diketahui bahwa IP tersebut berasal dari MALAYSIA.

Cara menghitung IP address menjadi IP number begini: anggap keempat blok IP address sebagai w.x.y.z, maka rumusnya

IP Number = 16777216 X w + 65536 X x + 256 X y + z

sehingga perhitungan untuk contoh yang tadi:

IP Number = 16777216 X 202 + 65536 X 186 + 256 X 13 + 4
= 3388997632 + 12189696 + 3328 + 4
= 3401190660

Kemudian databasenya memiliki format seperti ini:

IP Number Kode Negara Nama Negara
3401023488..3401056255 TH THAILAND
3401056256..3401400319 MY MALAYSIA
3401408512..3401416703 HK HONG KONG
3401416704..3401420799 KR KOREA
3401441280..3401449471 PH PHILIPPINES
3401441280..3401515263 MY MALAYSIA

Bisa dilihat di database diatas kalau MALAYSIA punya 2 range IP number. Tapi karena sama-sama Malaysia, 2 itu dianggap sama. Bisa dilihat juga kalau database sudah mengurutkan alamat IP dari kecil ke besar.

FORMAT MASUKAN
Diawali dengan sebuah bilangan T dan diikuti dengan T baris database berisi M..N(range IP number),Kode Negara, dan Nama Negara. Sebuah negara bisa memiliki 2 range IP number atau bisa lebih. Lalu sebuah bilangan O (1 <= O <= 100) dan dikuti O buah IP address dengan format w.x.y.z. FORMAT KELUARAN
O buah Kode Negara dan Nama Negara asal IP address. Antara Kode & Nama Negara dipisahkan sebuah spasi.

CONTOH MASUKAN
6
3401023488..3401056255 TH THAILAND
3401056256..3401400319 MY MALAYSIA
3401408512..3401416703 HK HONG KONG
3401416704..3401420799 KR KOREA
3401441280..3401449471 PH PHILIPPINES
3401441280..3401515263 MY MALAYSIA
5
202.186.13.4
202.183.170.13
202.186.13.10
202.189.107.17
202.189.224.10

CONTOH KELUARAN
MY MALAYSIA
TH THAILAND
MY MALAYSIA
KR KOREA
PH PHILIPPINES

Ehem,ehem. Sori lagi deh, soalnya cuma bikin satu test case. Tapi yang penting kan udah paham caranya. Kalau belum puas dengan soalnya, nih gw tambahin sedikit.

Kalau misalnya kita dikasih suatu IP number, bagaimana caranya untuk mengembalikan ke IP address? Cari sendiri caranya dan dibawah ini test case nya (yang ini bisa bikin banyak).

FORMAT MASUKAN
x baris IP number dengan jumlah yang tidak ditentukan.

FORMAT KELUARAN
x baris IP address.

CONTOH MASUKAN
3401190660
3401034253
3401190666
3401411345
3401441290
3041441290
3092458469
3546273834
3928475645
2839415365
3940284945
4728394087
2849573823
3948203887
3423432434
2123232498
2342354623

CONTOH KELUARAN
202.186.13.4
202.183.170.13
202.186.13.10
202.189.107.17
202.189.224.10
181.72.182.10
184.83.43.229
211.95.216.42
234.39.199.253
169.62.10.69
234.219.250.17
25.213.145.103
169.217.11.191
235.84.207.111
204.13.110.242
126.141.244.242
139.157.126.191

Cukup deh. Kalau ada yang perlu ditanyakan, jangan malu untuk ngomong di milis (siapa yang malu?). Sekian, banyak maaf kalau ada salah-salah kata. Happy Programming!

Tags Categories: Programming, Soal Posted By: Penguin
Last Edit: 13 Sep 2008 @ 06 03 AM

EmailPermalinkComments (0)
 13 Sep 2008 @ 5:57 AM 

Untuk yang pertama, mungkin ada baiknya gs mengupload soal pemograman, berhubung gw bisanya di bidang ini.

Soal ini pernah gw posting ke http://osn08kom.blogspot.com

Ada yang tau kriptografi? Bagi yang belum tau, Kriptografi adalah suatu cara untuk menyandikan pesan yang bersifat rahasia.

Suatu pesan asli (plain text) menggunakan suatu cara disandikan (encrypt) menjadi pesan yang sulit dibaca (chiper text).

chiper text hanya bisa dibaca setelah dikembalikan ke bentuk plain text (decrypt).

Ada banyak teknik kriptografi yang dipakai, seperti ROT13, RC40, dll. Sekedar informasi, RC40 sering dipakai sebuah program

untuk mengenkripsi file-file di komputer. Sekarang, kita belum akan membahas RC40 (yang cukup sulit), tapi tentang teknik

kriptografi lain yang mirip dengan itu.

Logika enkripsi ini (Gw lupa nama tekniknya) menggunakan kata kunci dan sebuah tabel seperti berikut:

dan kemudian sebuah kata kunci.

Setiap huruf dari plain text di enkripsi sesuai tabel berdasarkan katakunci. Misalkan huruf pertama plain text adalah ‘C’,

dan huruf pertama sandi adalah ‘S’. Berdasarkan tabel didapat bahwa huruf C jika disandikan dengan S menjadi huruf ‘U’.

Misal diberikan sebuah plain text dan sandi:
text : agung
sandi: keren
bila disandikan
a[k]=K
g[e]=K
u[r]=L
n[e]=R
g[n]=T
menjadi KKLRT.

Bagaimana kalau jumlah huruf sandi lebih sedikit? begini…
text : agung
sandi: cool
a[c]=c
g[o]=U
u[o]=I
n[l]=Y
huruf berikutnya kembali lagi ke huruf sandi pertama
g[c]=I
menjadi CUIYI

Untuk yang lebih dari 2 kata begini caranya:
teks :agung utama
sandi:ganteng
a[g]=G
g[a]=A
u[n]=A
n[t]=G
g[e]=K
Kata berikutnya kembali lagi dari huruf sandi pertama
u[g]=H
t[a]=T
a[n]=N
m[t]=F
a[e]=E
jadi GAAGK HTNFE (spasi tidak dienkripsi).

PERHATIAN!!! Kata sandi selalu satu kata dan tidak selalu berupa kata yang memiliki arti.

Semua udah ngerti???? Bagus kalau tidak (loh?).

Jadi, untuk tugas pertama dan kedua, coba buat program yang bisa (1) mengenkripsi dan (2) mendeskripsi dengan kriptografi

ini.

Format Input:
Dalam satu baris, tulis sebuah plain dan sandinya (untuk enkripsi) dan sebuah chiper dengan sandinya (untuk deskripsi). Input

lebih dari satu baris.

Format Output:
Tulis hasilnya dalam satu baris untuk setiap pasang.

Contoh Input Enkripsi:
agung keren
agung cool
agung utama ganteng

Contoh Output Enkripsi:
KKLRT
CUIYI
GAAGK HTNFE

Contoh input Deskripsi:
KKLRT keren
CUIYI cool
GAAGK HTNFE ganteng

Contoh Output Deskripsi:
agung
agung
agung utama

PERHATIAN LAGI!!! Plain texr dan sandi ditulis dalam huruf kecil dan chiper ditulis huruf besar.

Ini cuma tantangan kecil, pasti banyak yg bisa. Tapi, harap tunggu hingga gw selesaikan soal ketiga yang lebih rumit dari

ini.

Jangan lupa, posting pembahasan anda kesini.

Pertanyaan, kritik, saran, kue, minuman, kirim ke grup google.

Semoga berhasil dan tunggu soal berikutnya!!!!

Tags Categories: Programming, Soal Posted By: Penguin
Last Edit: 13 Sep 2008 @ 05 57 AM

EmailPermalinkComments (0)
\/ More Options ...
  • Users » 1
  • Posts/Pages » 41
  • Comments » 36
Change Theme...
  • VoidVoid « Default
  • LifeLife
  • EarthEarth
  • WindWind
  • WaterWater
  • FireFire
  • LightLight

Petunjuk



    No Child Pages.

Penguin?



    No Child Pages.