Membuat Enkripsimu Sendiri

Enkripsi, dalam dunia kriptografi enkripsi adalah menyembunyikan suatu informasi agar informasi tersebut tidak dapat dibaca oleh orang yang tidak berkepentingan. Enkripsi sudah ada sejak lama. Sejarah mencatat bahwa Julius Caesar dari Roma menggunakan sistem enkripsi yang bernama rot13 untuk mengacak informasi. Sandi sederhana ini dianggap sebagai salah satu enkripsi pertama di masa itu. Nah kita juga bisa membuat enkripsi kita sendiri. Bagaimana caranya? Ikuti langkah-langkah berikut:

Membuat Tabel Karakter

Hal pertama yang harus dilakukan adalah kita harus menentukan karakter-karakter apa yang akan dienkripsi. Dalam Rot13 Julius Caesar menggunakan 26 huruf dalam alfabet. Setelah menentukan karakter-karakter apa saja yang akan dienkripsi baru kita membuat daftar sederhananya. Daftar atau tabel karakter digunakan sebagai acuan utama dalam algoritma kita nanti. Teman-teman bisa membuat tabel yang beraneka macam karakter. Dalam tabel kita bisa bebas menentukan urutan huruf-huruf yang ada. Sebagai contoh, saya akan membuat tabel sebagai berikut:

apwnozqruvbcdxyghstijklmef

Perlu diperhatikan, tabel yang saya buat merupakan daftar 26 karakter alfabet. Tabel itu memang sengaja disusun dalam urutan demikian. Teman-teman bisa mendefinisikan tabel teman-teman sendiri dengan urutan abjad berbeda. Atau teman-teman dapat juga menyertakan angka dari 0 hingga 9 dan karakter-karakter lain dalam tabel. Tapi untuk sementara, kita gunakan tabel ini dulu😀

Menentukan Algoritma

Setelah menentukan tabel karakter, kita masuk ke langkah selanjutnya yaitu membuat algoritma untuk mengacak informasi. Algoritma mengacak informasi / teks secara teknis adalah membaca karakter demi karakter teks yang akan dienkripsi kemudian teks tersebut dienkripsi menggunakan algoritma yang mengacu kepada tabel karakter yang kita buat.

Jika diambil contoh pada Rot13, Julius Caesar menggunakan tabel karakter berupa 26 karakter alfabet secara terurut dari a hingga z. Karakter yang terletak pada posisi ke-n dalam tabel Rot13 akan digeser sejauh 13 karater ke kanan dari posisi asal. Misal karakter yang ingin dienkripsi adalah a maka setelah dienkripsi menjadi n (a adalah urutan 1 dan n huruf dengan urutan 14 dalam alfabet). Begitu pula dengan g akan menjadi t dan sebagainya.

Kita juga akan menggunakan algoritma serupa namun kita akan memakai tabel karakter yang kita definisikan sendiri. Untuk menggeser karakter kita gunakan saja 7 sebagai angka ajaib kita. Kita akan menggeser karakter ke posisi 7 karakter setelah karakter awal kita.

Contoh kata: saya makan

jika dienkripsi ke menggunakan tabel karakter kita akan dapatkan: erkr orwrb

Catatan, jika karakter yang digeser ke kanan berada di akhir tabel, maka kita bisa melanjutkan perhitungan kembali dari awal. contohnya pada karakter k. Jika digeser ke kanan sebanyak 7 karakter maka  setelah melewati karakter f tidak ada karakter lagi maka kita bisa melanjutkan pergeseran dari awal dengan melanjutkan perhitungan kita.

Kita sudah bisa membuat enkripsi sederhana dengan 2 langkah barusan. Untuk mendekripsikan /mengembalikan teks ke semula bisa dilakukan dengan mudah. Jika kita punya angka 4 dan ditambahkan dengan 3 maka akan menghasilkan angka 7. Lalu untuk mendapatkan angka 4 kembali kita harus mengurangi 7 dengan 3. Secara teknis kita juga bisa menggunakan prinsip tersebut. Dengan menggeser karakter berlawanan arah dengan arah enkripsi kita, kita bisa mendapatkan kembali karakter awal kita.

OKE, kita udah bikin algoritma sederhana dan membuktikan dengan contoh-contoh. Lalu bagaimana caranya diaplikasikan dalam algoritma pemrograman?

Dalam pemrograman maka algoritmanya menjadi seperti ini (jangan lupa melihat daftar karakter sebagai rujukan):

jika a maka r

jika n maka b

dan sebagainya.

namun cara di atas tidaklah efisien karena kita harus membuat pemilihan kondisi untuk masing-masing karakter. Lalu bagaimana caranya? Kita misalkan saja karakter-karakter tabel tersebut sebagai larik / array

larik sTabel : huruf = apwnozqruvbcdxyghstijklmef

artinya kita mempunyai larik seperti di atas. Apa itu larik? Larik dapat diasumsikan sebagai kumpulan data yang saling berurutan. Masing-masing data memiliki posisi yang disebut indeks. Indeks dimulai dari 0 dalam pseudocode kita. Kenapa 0? Karena asumsi kita bahwa angka pertama adalah 0. Kenapa 0, harusnya kan 1? Karena dalam sistem bilangan desimal, terdapat 10 angka tiap digit dan angka paling rendah nilainya adalah 0. 0 < 1 kan? karena itu indeks dimulai dari 0. Contoh, karakter z dalam tabel menempati indeks 5 (hitung mulai dari 0). Jadi kita punya 26 huruf dalam karakter dengan indeks 0 hingga 25)

Oke, kita udah punya larik, trus sekarang bagaimana?

Sebelum melangkah lebih jauh, saya akan bertanya bagaimana cara teman-teman mencari sebuah karakter dalam tabel tadi? Cara paling mudah adalah melihat karakter tersebut satu per satu kan? Nah kita juga akan menggeser karakter demi karakter sama dengan cara tadi. Pertama apa yang akan kita lakukan? Tentu kita pastikan penyeleksian untuk menentukan apakah karakter yang kita lihat sekarang merupakan karakter yang dicari.

Diasumsikan terdapat variabel c bernilai karakter yang dicari maka

jika sTabel [ indeks ] == c maka enkripsi

apa maksudnya sTabel [ indeks ] ? Itu adalah perintah untuk mendapatkan elemen data dari tabel sesuai indeks. Contoh jika kita ingin mendapatkan karakter dengan indeks 4 dalam karater maka kita tuliskan sTabel [ 4 ]. Jika karakter yang dimaksudkan sama (cocok) maka kita akan lakukan enkripsi. Enkripsi yang kita maksud adalah menggeser karakter sejauh 7 karakter ke kanan maka dipastikan bahwa indeks baru lebih besar 7 angka dari yang lama bukan? Jika demikian maka kita akan dapatkan sebagai berikut.

jika sTabel [ indeks ] == c maka kembalikan sTabel [ indeks + 7 ]

Maksud dari pseudo-code di atas adalah kita akan menhasilkan nilai karakter dengan indeks + 7 di tabel.

Di awal-awal kita sudah mewaspadai adanya karakter terakhir. Jika pergeseran ke kanan tidak cukup tempat kita dapat melanjutkan pergeseran dimulai dari kiri tabel. Kita dapat mengevaluasi nilai yang dihasilkan penjumlahan indeks dan 7. Jika jumlahnya melebihi 26 maka jelas akan keluar batas. Untuk mengatasinya maka kita dapat melakukan modulus terhadap hasil penjumlahan. sehingga menjadi (indeks + 7) mod 26.  Hal ini menjamin angka tidak akan melebihi batas. Misal indeks = 23 dan penjumlahan dengan 7 menghasilkan 30, dengan modulus kita akan mendapatkan hasil 30 mod 26 menjadi 4. Maka kita dapatkan indeks baru yaitu 4. Kita dapat tuliskan lagi:

jika sTabel [ indeks ] == c maka kembalikan sTabel [ (indeks + 7) mod 26 ]

Bagaimana dengan dekripsi? Kita lihat balik saja operasinya menjadi pengurangan sehingga

jika sTabel [ indeks ] == c maka kembalikan sTabel [ (indeks – 7) mod 26 ]

Tapi hal tersebut sangat beresiko karena jika nilai indeks lebih kecil dari 7 akan didapatkan hasil negatif. Padahal kita ingin jika pergeseran sudah mencapai batas tabel dari kiri, kita dapat melanjutkan pergeseran tabel dari kanan. Lalu bagaimana caranya? Untuk itu kita definisikan sebuah fungsi khusus untuk melakukan pengecekan batas.

fungsi batas( masukan : angka) : angka<

jika masukan < 0 maka kembalikan 26+masukan

lainnya kembalikan masukan

>


maksud dari fungsi itu adalah, jika angka yang dimasukkan dalam fungsi kurang dari 0 maka angka itu bilangan negatif (ya iyalah). Nilai fungsi itu menjadi 26 ditambah angka masukan. Kenapa ditambah? Karena angka itu negatif. coba pikirkan ;P

Misal angka masukan = -4. Maka nilai fungsi tersebut adalah 26 + (-4) menghasilkan 22.

Selanjutnya kita menuliskan kembali perintah sebagai berikut:

jika sTabel [ indeks ] == c maka kembalikan sTabel [ batas(indeks + 7) mod 26 ]

Jika ditelusuri kembali, statement di atas hanya akan mencari 1 karakter sebanyak 1 kali saja. Bagaimana jika dalam pencarian yang hanya sekali itu kita tidak menemukan apa yang kita cari? Pastinya kita akan mencari kembali bukan? Karena itu kita butuh perulangan. Perulangan yang kita pakai adalah tipe untuk (dalam pseudo-code kita seperti ini) atau perulangan for (dalam bahasa pemrograman). Kenapa kita memakai perulangan tipe ini? Karena kita sudah menentukan berapa kali harus melakukan perulangan yaitu sebanyak 26 kali (sebanyak karakter dalam tabel kita) dengan indeks dimulai dari 0.

Diasumsikan kita punya variabel bernama indeks

untuk indeks = 0, indeks < 26, indeks++

<

jika sTabel [ indeks ] == c maka kembalikan sTabel [ batas(indeks + 7) mod 26 ]

>

Bagaimana jika karakter dalam variabel c itu bukan yang kita cari?? maka kita harus menyertakan baris tambahan yang mengembalikan nilai karakter c tadi. Sekarang kita gunakan data-data di atas untuk membuat suatu fungsi.

fungsi enkripsi( c : huruf) : huruf

<

untuk indeks = 0, indeks < 26, indeks++

<

jika sTabel [ indeks ] == c maka kembalikan sTabel [ batas(indeks + 7) mod 26 ]

>

kembalikan c

{

Jika dalam perulangan karakter dalam c ditemukan pada tabel, maka fungsi akan mengembalikan nilai sesuai format yang kita tentukan. Jika tidak maka perulangan terus terjadi dan akhirnya tak kunjung menghasilkan nilai. Jika demikian di bawah perulangan tersebut kita siapkan perintah agar fungsi menghasilkan nilai sesuai masukan.

}

>

Sehingga karakter c adalah sebuah paramete fungsi tersebut. berikut source code lengkapnya dalam pseudo-code

larik sTabel : huruf = apwnozqruvbcdxyghstijklmef

fungsi batas( masukan : angka) : angka<

jika masukan < 0 maka kembalikan 26+masukan

lainnya kembalikan masukan

>

fungsi enkripsi( c : huruf) : huruf

<

untuk indeks = 0, indeks < 26, indeks++

<

jika sTabel [ indeks ] == c maka kembalikan sTabel [ batas(indeks + 7) mod 26 ]

>

kembalikan c

>

Nah, setelah mengetahui enkripsi dan dekripsi sederhana di atas, teman-teman bisa membuat sistem enkripsi sendiri. Keren kan kalo kita berkomunikasi dengan orang-orang terdekat tanpa bisa diketahui?😉

Teman-teman juga bisa mengombinasikan berbagai macam algoritma lain seperti jika enkripsi digeser ke kiri, kalo dekripsi digeser ke kanan. Atau pergeserannya sebanyak 9 angka.

Mungkin ada yang bingung dengan cara translasinya ke program, oke saya kasih contoh dalam bahasa C++

check it out:

#include <iostream>     // Untuk input output
#include <cstring>        // untuk string dan manipulasinya
using namespace std;

char sTabel[] = “apwnozqruvbcdxyghstijklmef”;    // Ini tabel karakter kita
// Fungis batas untuk menjamin agar karakter tidak keluar batas

int batas(int masukan) {
if(masukan < 0) return (26+masukan);
else return masukan;
}
//Engine dasar, fungsi ini akan mengenkripsi karakter berdasarkan tabel karakter

char enkripsi(char c) {
for(int indeks = 0; indeks < 26; indeks++) {
if(sTabel[indeks] == c) return sTabel[ batas(indeks + 7) % 26];
}
return c;
}
//Fungsi ini akan menerima sebuah kalimat kemudian secara berulang-ulang melakukan

// enkripsi di setiap karakter

string enkripsi(string masukan) {
string temp;
for(int indeks=0; indeks < masukan.length(); indeks++) {
temp += enkripsi(masukan.at(indeks));
}
return temp;
}
// Program berawal dari sini

int main() {
cout<<enkripsi(“saya makan”)<<endl;
}

/* END OF FILE */

-Satria Ady Pradana-

5 Comments

  1. mantab gan
    minta contoh sourcenya dong…

    • Artikelnya udah q edit… silahkan dibaca😀

  2. dede

    makasich saudara setanah air ..nambah wangsit buat ngerjain tugas saya.. klo buat algoritma transposisi diagonal,gmn mas ??

  3. dede

    mas,mau tanya lagi.. untuk cipher clock chaining atau blok CBC ntuh alur algoritma nya gmn?? klo bisa hitungan manualnya juga mas, maaf mas banyak tanya..maklum mas saya mash awam.. makasih sebelumnya..

    • Hmmm… nanti kalo saya ada waktu mungkin saya mau nulis postingan tentang itu😀

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: