Kriptografi Algoritma Vigenere Cipher

1. Pendahuluan

Pada kesempatan ini kita akan membahas mengenai Kriptografi Algoritma Vigenere Cipher. Algoritma vigenere cipher adalah algoritma kriptografi klasik yang umum dan banyak digunakan pada masanya. Pada tulisan ini kita akan membahas mengenai algoritma tersebut dan hal-hal yang berkenaan dengan nya:

  • Pengertian Algoritma Vigenere Cipher
  • Enkripsi Algoritma Vigenere Cipher
  • Dekripsi Algoritma Vigenere Cipher
  • Desain Program
  • Proses Enkripsi
  • Proses Dekripsi

2. Pengertian Algoritma Vigenere Cipher

Algoritma vigenere cipher adalah algoritma klasik yang merupakan pengembangan dari metode Caesar Cipher. Proses Enkripsi dilakukan dengan cara menggeser atau menambahkan plaintext sebanyak kunci ke-i. Sedangkan dekripsi adalah proses menggeser ciphertext ke arah berlawanan atau mengurangkan ciphertext sebanyak kunci ke-i.

2.1 Enkripsi Algoritma Vigenere Cipher

Proses enkripsi algoritma vigenere cipher lebih mudah dengan melihat rumus berikut:

Keterangan:

  • Ci = Cipertext ke-i
  • Pi = Plaintext ke-i
  • Ki = Kunci ke-i


Gambar urutan alfabet ke-i

Contoh Enkripsi

Plaintext : data

Kunci : abcd

Ciphertext : [d+a][a+b][t+c][a+d]

Cipertext : [4+1][1+2][20+3][1+4]

Ciphertext : [5]mod 26 [3]mod 26 [23]mod 26 [5]mod 26

Ciphertext : [5][3][23][5]

Ciphertext : ecwe

2.2 Dekripsi Algoritma Vigenere Cipher

Proses dekripsi algoritma vigenere cipher lebih mudah dengan melihat rumus berikut:

Keterangan:

  • Ci = Cipertext ke-i
  • Pi = Plaintext ke-i
  • Ki = Kunci ke-i


Gambar urutan alfabet ke-i

Contoh Dekripsi

Ciphertext : ecwe

Kunci : abcd

Plaintext : [e-a][c-b][w-c][e-d]

Plaintext : [5-1][3-2][23-3][5-4]

Plaintext : [4]mod 26 [1] mod 26 [20] mod 26 [1] mod 26

Plaintext : [4][1][20][1]

Plaintext : data

3. Kesimpulan

Dari contoh algoritma vigenere cipher diatas dapat ditarik beberapa kesimpulan.

  • Jumlah modulus adalah jumlah karakter yang digunakan
  • Untuk mendaftarkan karakter lain seperti spasi, huruf kapital, angka, tanda baca dll, berarti merubah jumlah modulus
  • Panjang kunci yang lebih pendek dari panjang plaintext, contoh:
    Plaintext : Data ini sangat penting
    Kunci : abc
    Dapat disiasati dengan cara mengulang kunci sebanyak panjang plaintext.

4. Latihan

Hitunglah hasil enkripsi dan dekripsi data berikut menggunakan metode vigenere cipher:

Plaintext : Data Penting

Kunci : rahasia

5. Video

Untuk memahami penjelasan di atas lebih mudah, silahkan tonton video berikut:



6. Desain Tampilan Program

Kali ini saya akan menunjukkan desain tampilan dari program algoritma vigenere cipher yang terdapat 3 halaman yaitu home, enkripsi dan dekripsi. Untuk mempercepat pembuatan tampilan kita menggunakan bootstrap.

6.1. Halaman Home

Halaman home digunakan sebagai halaman utama yang menampilkan informasi penting secara ringkas. Berikut tampilannya.



6.2. Halaman Enkripsi

Halaman enkripsi ini berisi formulir untuk melakukan proses enkripsi. Terdapat beberapa elemen formulir seperti input text untuk plaintext, kunci dah hasil. Formulir tersebut juga menggunakan sebuah tombol submit. Berikut tampilannya.



6.3. Halaman Dekripsi

Halaman enkripsi ini berisi formulir untuk melakukan proses dekripsi. Berikut tampilannya.



7. Struktur Folder Program

Untuk mengikuti tutorial ini, kamu perlu melihat struktur folder program berikut:



7.1. File vigenere.php

Berikut ini adalah isi dari file vigenere.php yang dapat anda contoh. Perlu diketahui, tidak ada aturan baku dalam membuat kode program. Bagian terpentingnya adalah tercapainya tujuan sebuah program, panjang baris program, kecepatan eksekusi dll. Berikut ini adalah kode program vigenere cipher saya.

<?php
class Kripto{
var $tersedia = array('a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u',
'v','w','x','y','z');
var $angka_konversi_plaintext=array();
var $angka_konversi_ciphertext=array();
var $angka_konversi_kunci=array();
var $angka_hasil_enkripsi=array();
var $angka_hasil_dekripsi=array();
var $kunci;


public function konversi_angka($karakter=''){
for ($i=0; $i < count($this->tersedia) ; $i++) { 
if ($karakter==$this->tersedia[$i]) {
return $i+1;// tambah 1 supaya mulainya dari 1
}
}
}


public function enkripsi($teks){
echo "Plaintext: $teks <br>";
echo "Kunci: $this->kunci <br>";
for ($i=0; $i < strlen($teks) ; $i++) { 
$this->angka_konversi_plaintext [$i] =  $this->konversi_angka(substr($teks, $i,1));
}
echo "Urutan Plaintext: ";
echo var_dump($this->angka_konversi_plaintext)."<br>";
// angka urutan atau konversi plaintext
for ($i=0; $i < strlen($this->kunci) ; $i++) { 
$this->angka_konversi_kunci [$i] =  $this->konversi_angka(substr($this->kunci, $i,1));
}
echo "Urutan Kunci: ";
echo var_dump($this->angka_konversi_kunci)."<br>";
// angka urutan atau konversi kunci
for ($i=0; $i < count($this->angka_konversi_plaintext); $i++) { 
$this->angka_hasil_enkripsi[$i]=($this->angka_konversi_plaintext[$i] + ($this->angka_konversi_kunci[$i % strlen($this->kunci)])) % count($this->tersedia);
}
echo "Urutan Hasil Enkripsi: ";
echo var_dump($this->angka_hasil_enkripsi)."<br>";

}

public function dekripsi($teks){
echo "Ciphertext: $teks <br>";
echo "Kunci: $this->kunci <br>";
for ($i=0; $i < strlen($teks) ; $i++) { 
$this->angka_konversi_ciphertext [$i] =  $this->konversi_angka(substr($teks, $i,1));
}
echo "Urutan Ciphertext: ";
echo var_dump($this->angka_konversi_ciphertext)."<br>";
// angka urutan atau konversi plaintext
for ($i=0; $i < strlen($this->kunci) ; $i++) { 
$this->angka_konversi_kunci [$i] =  $this->konversi_angka(substr($this->kunci, $i,1));
}
echo "Urutan Kunci: ";
echo var_dump($this->angka_konversi_kunci)."<br>";
// angka urutan atau konversi kunci
for ($i=0; $i < count($this->angka_konversi_ciphertext); $i++) { 
$negatif=($this->angka_konversi_ciphertext[$i] - ($this->angka_konversi_kunci[$i % strlen($this->kunci)]));
if ($negatif<=0){// nol dikurang 1 negatif
$this->angka_hasil_dekripsi[$i]=($this->angka_konversi_ciphertext[$i] - ($this->angka_konversi_kunci[$i % strlen($this->kunci)])) % count($this->tersedia)+count($this->tersedia);
}else{
$this->angka_hasil_dekripsi[$i]=($this->angka_konversi_ciphertext[$i] - ($this->angka_konversi_kunci[$i % strlen($this->kunci)])) % count($this->tersedia);
}
}
echo "Urutan Hasil Dekripsi: ";
echo var_dump($this->angka_hasil_dekripsi)."<br>";
}



public function tampil_h_enkripsi(){
//echo "Karakter Hasil Enkripsi :";
for ($i=0; $i <count($this->angka_hasil_enkripsi) ; $i++) { 
echo $this->tersedia[$this->angka_hasil_enkripsi[$i]-1]; //kurang satu supaya hasil sesuai
}
}
public function tampil_h_dekripsi(){
//echo var_dump($this->hasil_dekripsi);
//echo "Karakter Hasil Dekripsi :";
for ($i=0; $i <count($this->angka_hasil_dekripsi) ; $i++) { 
echo  $this->tersedia[$this->angka_hasil_dekripsi[$i]-1];
}
}
}


7.2. File enkripsi.php

Berikut ini adalah isi dari file enkripsi.php yang dapat anda contoh. File ini tidak ditampilkan langsung. Melainkan di include kedalam file index.php.


<div class="card col-md-6 m-1">
  <h5 class="card-header">Enkripsi</h5>
  <div class="card-body">
  <?php 
include "kripto/vigenere.php";
if (isset($_POST['proses_enkripsi'])){
$krip=new Kripto;
$krip->kunci=$_POST['kunci'];
$krip->enkripsi($_POST['plaintext']);
}
?>
<hr>
    <form method="POST">
  <div class="mb-1">
    <label for="plaintext" class="form-label">Plaintext</label>
    <input type="text" class="form-control" id="plaintext" name="plaintext">
    <div id="kunci" class="form-text text-danger">Masukkan data atau pesan yang mau dienkripsi.</div>
  </div>
  <div class="mb-1">
    <label for="kunci" class="form-label">Kunci</label>
    <input type="text" class="form-control" id="kunci" name="kunci">
  </div>
  <button type="submit" class="btn btn-primary" name="proses_enkripsi">Enkrip</button>
  <div class="mb-1">
    <label for="hasil_ciphertext" class="form-label">Ciphertext</label>
    <input type="text" class="form-control" id="hasil_ciphertext" name="hasil_ciphertext" disabled="" value=" <?php echo $krip->tampil_h_enkripsi();?>">
    <div class="form-text text-success">Lihat Hasil.</div>
  </div>
</form>
  </div>
</div>

7.3. File dekrpsi.php

Berikut ini adalah isi dari file dekripsi.php yang dapat anda contoh. File ini tidak ditampilkan langsung. Melainkan di include kedalam file index.php.


<div class="card col-md-6 m-1">
  <h5 class="card-header">Dekripsi</h5>
  <div class="card-body">
  <?php 
include "kripto/vigenere.php";
if (isset($_POST['proses_enkripsi'])){
$krip=new Kripto;
$krip->kunci=$_POST['kunci'];
$krip->dekripsi($_POST['ciphertext']);
}
?>
<hr>
    <form method="POST">
  <div class="mb-1">
    <label for="ciphertext" class="form-label">Plaintext</label>
    <input type="text" class="form-control" id="ciphertext" name="ciphertext">
    <div id="kunci" class="form-text text-danger">Masukkan cipher text yang mau didekripsi.</div>
  </div>
  <div class="mb-1">
    <label for="kunci" class="form-label">Kunci</label>
    <input type="text" class="form-control" id="kunci" name="kunci">
  </div>
  <button type="submit" class="btn btn-primary" name="proses_enkripsi">Dekrip</button>
  <div class="mb-1">
    <label for="hasil_ciphertext" class="form-label">Plaintext</label>
    <input type="text" class="form-control" id="hasil_plainttext" name="hasil_plainttext" disabled="" value=" <?php echo $krip->tampil_h_dekripsi();?>">
    <div class="form-text text-success">Lihat Hasil.</div>
  </div>
</form>
  </div>
</div>

7.3. File index.php

Berikut ini adalah isi dari file index.php yang dapat anda contoh. File ini bisa dikatakan template program. File inilah yang akan meng-include file-file lain yang akan ditampilkan dalam format yang sama.


<!DOCTYPE html>
<html>
<head>
<title>Kriptografi Metode Vigenere Cipher</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-2 bg-dark" style="min-height: 700px">
<div class="text-light">
~BWM2021~
</div>
<div class="d-flex justify-content-center mt-5">
<h5 class="text-light">
<a href="?halaman=home">Home</a>
</h5>
</div>
<div class="d-flex justify-content-center mt-2">
<h5 class="text-light">
<a href="?halaman=enkripsi">Enkripsi</a>
</h5>
</div>
<div class="d-flex justify-content-center mt-2">
<h5 class="text-light">
<a href="?halaman=dekripsi">Dekripsi</a>
</h5>
</div>
</div>
<div class="col-md-10">
<div class="row">
<div class="col-md-12 bg-secondary">
<div class="text-light m-1 text-center">
<h5>Kriptografi Metode Vigenere Cipher</h5>
</div>
</div>
</div>
<?php
if (isset($_GET['halaman'])) {
if ($_GET['halaman']=='enkripsi') {
include("enkripsi.php");
}elseif ($_GET['halaman']=='dekripsi') {
include("dekripsi.php");
}elseif ($_GET['halaman']=='home') {

echo "<br>Algoritma vigenere cipher adalah algoritma klasik yang merupakan pengembangan dari metode Caesar Cipher. Proses Enkripsi dilakukan dengan cara menggeser atau menambahkan plaintext sebanyak kunci ke-i. Sedangkan dekripsi adalah proses menggeser ciphertext ke arah berlawanan atau mengurangkan ciphertext sebanyak kunci ke-i. <a href='https://belajarwebmedan.com/2021/10/04/kriptografi-vigenere-cipher/'>Selengkapnya...</a>";
}
}else{
echo "<br>Algoritma vigenere cipher adalah algoritma klasik yang merupakan pengembangan dari metode Caesar Cipher. Proses Enkripsi dilakukan dengan cara menggeser atau menambahkan plaintext sebanyak kunci ke-i. Sedangkan dekripsi adalah proses menggeser ciphertext ke arah berlawanan atau mengurangkan ciphertext sebanyak kunci ke-i. <a href='https://belajarwebmedan.com/2021/10/04/kriptografi-vigenere-cipher/'>Selengkapnya...</a>";
}
?>
<!--div class="container-fluid h-100">
    <div class="row align-items-center h-100">
        <div class="col-6 mx-auto">
            <div class="jumbotron">
                <img src="https://belajarwebmedan.com/wp-content/uploads/2021/09/keamanan_post.png">
            </div>
        </div>
    </div>
</div-->

</div>
</div>
<div class="col-md-12">
<center>&copy; 2021 BWM</center>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body>
</html>

8. Latihan

Coba modifikasi kode Program diatas agar mampu melakukan proses enkripsi dan dekripsi data barikut:

Plaintext : Data Penting

Kunci : rahasia

9. Video Penjelasan Program

Untuk penjelasan kode program vigenere cipher. serta demo programnya. Tonton video berikut:




Popular posts from this blog

Cara Menggunakan Template Admin LTE Sebagai Template Web Dinamis

Aplikasi CRUD menggunakan Template Admin LTE

Cara membuat Link ke Halaman lain dan Link ke bagian Halaman