Pengertian dan Penerapan Algoritma Kriptografi Viegenere Chiper di Php

Kode vigènere termasuk kode abjad-majemuk (polyalphabetic substitution cipher). Dipublikasikan oleh diplomat (sekaligus seorang kriptologis) Perancis, Blaise de Vigènere pada abad 16, tahun 1586. Sebenarnya Giovan Batista Belaso telah menggambarkannya untuk pertama kali pada tahun 1533 seperti ditulis di dalam buku La Cifra del Sig. Algoritma ini baru dikenal luas 200 tahun kemudian dan dinamakan kode vigènere. Vigènere merupakan pemicu perang sipil di Amerika dan kode vigènere digunakan oleh Tentara Konfederasi (Confederate Army) pada perang sipil Amerika (American Civil War). Kode vigènere berhasil dipecahkan oleh Babbage dan Kasiski pada pertengahan abad 19. (Ariyus, 2008).

Algoritma enkripsi jenis ini sangat dikenal karena mudah dipahami dan diimplementasikan. Teknik untuk menghasilkan ciphertext bisa dilakukan menggunakan substitusi angka maupun bujursangkar vigènere. Teknik susbtitusi vigènere dengan menggunakan angka dilakukan dengan menukarkan huruf dengan angka, hampir sama dengan kode geser.

 Kolom paling kiri dari bujursangkar menyatakan huruf-huruf kunci, sedangkan baris paling atas menyatakan huruf-huruf plaintext. Setiap baris di dalam bujursangkar menyatakan huruf-huruf ciphertert yang diperoleh dengan Caesar cipher, yang mana jumlah pergeseran huruf plaintext ditentukan nilai numerik huruf kunci tersebut (yaitu, a=0, b=1, c=2, …, z=25). Sebagai contoh, huruf kunci c (=2) menyatakan huruf-huruf plaintext digeser sejauh 2 huruf ke kanan (dari susunan alfabetnya),

Sandi Vigenère adalah metode menyandikan teks alfabet dengan menggunakan deretan sandi Caesar berdasarkan huruf-huruf pada kata kunci. Sandi Vigenère merupakan bentuk sederhana dari sandi substitusi polialfabetik. Kelebihan sandi ini dibanding sandi Caesar dan sandi monoalfabetik lainnya adalah sandi ini tidak begitu rentan terhadap metode pemecahan sandi yang disebut analisis frekuensi.

Rumus enkripsi vigenere cipher :

Pi = (Ci-Ki) mod 26

atau

Ci = ( Pi + Ki ) – 26, kalau hasil penjumlahan Pi dan Ki lebih dari 26

Rumus dekripsi vigenere cipher :

Pi = (Ci-Ki) mod 26

atau

Pi = ( Ci – Ki ) + 26, kalau hasil pengurangan Ci dengan Ki minus

Keterangan:

Ci = nilai desimal karakter ciphertext ke-i

Pi = nilai desimal karakter plaintext ke-i

Ki = nilai desimal karakter kunci ke-i

Nilai desimal karakter: A=0 B=1 C=2 ... Z=25

 

implementasi Pada Code Php :

<?php
function encrypt($pswd, $text)
{
  //array untuk mengubah abjad menjadi angka
  $AbjToNumTable=array('a' => '0','b' => '1','c' => '2','d'=>'3','e'=>'4','f'=>'5','g'=>'6','h'=>'7','i'=>'8','j'=>'9','k'=>'10',
      'l'=>'11','m'=>'12','n'=>'13','o'=>'14','p'=>'15','q'=>'16','r'=>'17','s'=>'18','t'=>'19','u'=>'20',
      'v'=>'21','w'=>'22','x'=>'23','y'=>'24','z'=>'25'
  );

  //tabel untuk mengubah angka menjadi huruf
  $table ="abcdefghijklmnopqrstuvwxyz";

	//mengubah key kedalam bentuk huruf kecil
  $pswd1 = strtolower($pswd);
  //menghilangkan spasi pada key
  $pswd = str_replace(' ', '', $pswd1);

  //mengubah plaintext menjadi huruf kecil
  $text1 = strtolower($text);
  //menghilangkan spasi pada plaintext
  $text = $text;

	//inisialisasi variable
	$ki = 0;
  //mencari panjang key
	$kl = strlen($pswd);
  //mencaari panjang plaintext
	$length = strlen($text);

	//looping untuk mencari nilai enkripsi sepajang nilai plaintext
	for ($i = 0; $i < $length; $i++)
	{
		// if the letter is alphabetical, encrypt it
		if (ctype_alpha($text[$i]))
		{
        //variabel mengambil kata ke-n
        $fghij = $text[$i];
        $numText = $AbjToNumTable[$fghij]; //0

        //variabel mengambil password ke-n
        $abcde = $pswd[$ki];
        $numPass = $AbjToNumTable[$abcde];  //1

        $angkaCipher = ($numText + $numPass)%26; //0+1%26 = 1
        $kataHasil = substr($table,$angkaCipher,1); //1,1 = b
        $text[$i] = $kataHasil;
			}
			// update the index of key
			$ki++;
			if ($ki >= $kl)
			{
				$ki = 0;
			}
		}
	// return the encrypted code
	return $text;
}


// function to decrypt 
function decrypt($pswd, $text)
{
  $AbjToNumTable=array('a' => '0','b' => '1','c' => '2','d'=>'3','e'=>'4','f'=>'5','g'=>'6','h'=>'7','i'=>'8','j'=>'9','k'=>'10',
      'l'=>'11','m'=>'12','n'=>'13','o'=>'14','p'=>'15','q'=>'16','r'=>'17','s'=>'18','t'=>'19','u'=>'20',
      'v'=>'21','w'=>'22','x'=>'23','y'=>'24','z'=>'25'
  );
  $table ="abcdefghijklmnopqrstuvwxyz";
  $pswd1 = strtolower($pswd);
  $pswd = str_replace(' ', '', $pswd1);

  $text1 = strtolower($text);
  $text = $text;

	// intialize variables
	$code = "";
	$ki = 0;
	$kl = strlen($pswd);
	$length = strlen($text);

	// iterate over each line in text
	for ($i = 0; $i < $length; $i++)
	{
		// if the letter is alpha, decrypt it
		if (ctype_alpha($text[$i]))
		{

        $fghij = $text[$i];
        $numText = $AbjToNumTable[$fghij];

        //variabel mengambil password ke-n
        $abcde = $pswd[$ki];
        $numPass = $AbjToNumTable[$abcde];

        $angkaCipher = ($numText - $numPass)%26;
        $kataHasil = substr($table,$angkaCipher,1);
        $text[$i] = $kataHasil;
			}

			// update the index of key
			$ki++;
			if ($ki >= $kl)
			{
				$ki = 0;
			}
		}

	// return the decrypted text
	return $text;
}

 

Sumber : 

  • https://id.wikipedia.org/wiki/Sandi_Vigenère

image

Mazadie

Assalamualikum .. Saya adalah Seorang Web Developer Asal Riau.

Komentar