08 Desember 2015 - 16:51:49 - Read: 957

Membuat Vigenere Cipher Menggunakan Ruby

Yarp, dah lama nih gak nulis artikel tentang programming. Cuma kali ini bukan tentang PHP, tapi tentang Ruby. Penjelasan tentang bahasa pemrograman Ruby langsung di wikipedia aja yak. Karena kali ini kita akan langsung dengan contoh kasus membuat enkripsi menggunakan metode Vigenere Cipher.

Penjelasan sedikit tentang Vigenere Cipher, merupakan salah satu metode Classical Cipher turunan dari Caesar Cipher, tapi dengan menambahkan "KEY" sebagai patokan banyaknya jumlah rotasi karakter yang akan disubstitusi.

Berikut perbandingan Caesar Cipher dengan Vigenere Cipher:

Plaintext: ABCDEFAB

dirotasi sebanyak 3 kali, maka hasilnya:

Hash : DEFGHIDE

Mudah kan? Yarp, cukup dengan menggeser masing-masing huruf sebanyak 3 kali. maka A => D, B=>E, dan G=>J

Sedangkan pada Vigenere Cipher, masing-masing karakter (A,B,C,D,E,F,G) digeser sebanyak n kali. Sehingga masing-masing karakter bisa menghasilkan output yang berbeda walaupun memiliki plaintext yang sama. Jumlah pergeseran n ini tergantung dari "KEY" yang diinputkan. Sebagai contoh awal:

Plaintext: ABCDEFA

Key: CAFE

Pertama kita buat dulu inisialisasi index untuk masing-masing karakter dari A-Z.

A=0, B=1, C=2, Z=25, dst

Kemudian, masing-masing karakter pada "Plaintext" akan digeser sebanyak n kali dari "Key", dan karena jumlah karakter "Plaintext" lebih panjang dari "Key", maka "Key" akan diulang sebanyak jumlah karakter plaintext. Perhatikan hasilnya dibawah ini:

A B C D E F A

C A F E C A F

Jika, dibaca maka

A digeser sebanyak C, dimana index dari A adalah 0, dan index dari C adalah 2, maka 0 digeser sebanyak 2 kali. Sehingga setelah pergeseran A (index 0) akan berada pada index ke 2 (C)

A => C = C

B => A = B

C => F = H

D => E = H

E => C = G

F => A = F

A => F = F

Terlihat kan, karakter "A" pertama dengan "A" kedua menghasilkan karakter yang berbeda, karena jumlah pergeseran n-kali dari "Key" berbeda. Atau jika menggunakan index, maka

0 => 2 = 2

1 => 0 = 1

2 => 5 = 7

3 => 4 = 7

4 => 2 = 6

5 => 0 = 5

0 => 5 = 5

Pada contoh diatas, terlihat 0 => 2 seperti 0 + 2, lalu kenapa bukan dikatakan penjumlahan?

Yarp, hal ini dikarenakan jika pergeseran terjadi pada karakter Z => C

jika, Z = 25 ditambah C = 2, maka hasilnya adalah 27.

 

Plaintext:

{0=>"A", 1=>"B", 2=>"C", 3=>"D", 4=>"E", 5=>"F", 6=>"G", 7=>"H", 8=>"I", 9=>"J", 10=>"K", 11=>"L", 12=>"M", 13=>"N", 14=>"O", 15=>"P", 16=>"Q", 17=>"R", 18=>"S", 19=>"T", 20=>"U", 21=>"V", 22=>"W", 23=>"X", 24=>"Y", 25=>"Z"}

 

Dan tidak ada karakter yang mewakili index ke-27 bukan? 

Dan itulah kenapa disebut pergeseran (rotasi), karena jika Z digeser sebanyak C, maka akan menghasilkan

Z digeser 2 kali, 

Z > A > B.

maka

Z => C = B

Yarp, daripada pusing ngebayangin, mending langsung ngoding ja.. ni Source code untuk meng-encrypt menggunakan metode Vigenere Cipher

 

#!/usr/bin/ruby
# Author: K4pT3N
# URL    : www.ExploreCrew.org

def alphabets(u=true)
    a=Hash.new()
    (0..25).each{|i|a[i]=(i+((u)? 65 : 97)).chr}
    return a
end
def Alphabet2Num(char)
    u=(char.ord<91)? true : false
    return alphabets(u).key(char).to_s.to_i
end

def Num2Alphabet(idx,u=true)
    return alphabets(u)[idx.to_i]
end
def vigenerecipher(plaintext,key)
    x=plaintext.length
    y=key.length
    a=''
    d=0
    k=''
    for i in 0..x-1
        if(/[^a-zA-Z]/.match(plaintext[i]))
            d=d+1
            a+= plaintext[i]
        else
            a+=Num2Alphabet((Alphabet2Num(plaintext[i]) +Alphabet2Num(key[i % y - d])) % 26,(plaintext[i].ord<91)? true:false)
            k+= key[i % y - d]
        end
    end
    p a
end
vigenerecipher(ARGV[0],ARGV[1])

 

Source code diatas menggunakan bahasa pemrograman Ruby, lalu simpan misalnya dengan nama "vigenere.rb" dan untuk menjalankannya (selain ruby harus sudah terinstall), adalah dengan menggunakan terminal:

$ ./vigenere.rb PLAINTEXT KEY

Ex:

$ ./vigenere.rb ABCDEFA CAFE

Vigenere-Cipher

Yarp, semoga bermanfaat :)