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”) 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’)
if ord(input[i]) > ord(‘Z’) 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’)
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’)
if ord(input[i]) > ord(‘Z’) 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’)
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.

Posting yang berbobot