09 Desember 2015 - 15:32:36 - Read: 708

Vigenere Decipher

Hi hallo programmer, udah ngirim pesan ke gebetan pake kata cinta yang udah dienkripsi pake Vigenere? Trus kalo si dia udah bales pake Enkripsi yang sama, ngerti cara bacanya gak? :)

Yarp, artikel kali ini merupakan request dari teman-teman yang habis baca artikel sebelumnya Membuat Vigenere Cipher Menggunakan Ruby. Lalu bagaimana cara mengembalikan hash encrypted text nya ke normal text lagi?

Sebenarnya mudah saja sih, karena jika pada proses enkripsi, huruf digeser ke kanan, maka, pada proses dekripsi, karakter cukup digeser kembali ke kiri berdasarkan "KEY" yang diberikan. Perhatikan baris code berikut ini:

a+=Num2Alphabet((Alphabet2Num(plaintext[i]) +Alphabet2Num(key[i % y - d])) % 26,(plaintext[i].ord<91)? true:false)

pada script diatas, plaintext[i] dijumlahkan dengan karakter "Key" yang pair. Ini adalah kunci dari script Vigenere Cipher. Sehingga untuk men-decrypt, kita cukup mengganti operator penjumlahan "+" dengan operator pengurangan "-"

a+=Num2Alphabet((Alphabet2Num(plaintext[i]) -Alphabet2Num(key[i % y - d])) % 26,(plaintext[i].ord<91)? true:false)

Dan, daripada membuat 2 file yang berbeda, ada baiknya kita cukup membuat parameter tambahan di script yang berfungsi untuk inisialisasi "Encrypt" atau "Decrypt", sebagai contoh:

./vigenere.rb CBHHGFF CAFE -d

yarp, pada command diatas, bertambah lagi 1 parameter "-d" yang berfungsi untuk decipher.

vigenere-decipher

Berikut kode lengkapnya

#!/usr/bin/ruby
# Vigenere Decipher
# 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,act)
    x=plaintext.length
    y=key.length
    a=''
    d=0
    for i in 0..x-1
        if(/[^a-zA-Z]/.match(plaintext[i]))
            d=d+1
            a+= plaintext[i]
        else
            if(act==nil)
                a+=Num2Alphabet((Alphabet2Num(plaintext[i]) +Alphabet2Num(key[i % y - d])) % 26,(plaintext[i].ord<91)? true:false)
            else
                a+=Num2Alphabet((Alphabet2Num(plaintext[i]) -Alphabet2Num(key[i % y - d])) % 26,(plaintext[i].ord<91)? true:false)
            end
        end
    end
    p a
end
vigenerecipher(ARGV[0],ARGV[1],ARGV[2])

Yarp, semoga bermanfaat lagi :)