Sunday, May 26, 2013

Security : Implementasi RSA pada PHP

Pada artikel sebelum telah dibahas mengenai algoritma RSA dan cara membangkitkan kunci yang dibutuhkannnya [cek di sini ] . sekarang akan dibahas bagaimana cara mengimplementasikan algoritma RSA ini di PHP [ PHP =! pemberi harapan palsu, pada bahasan ini :-) ]. ok. let's go!.

langkah yang perlu untuk dilakukan meliputi
- membangkitkan kuncil public dan private RSA
- melakukan enkripsi
- melakukan deskripsi

membangkitkan kunci RSA

<?php

echo "Membentuk kunci RSA";

//untuk membuat kunci yang lebih panjang coba gmp_random

//$rand1 = gmp_random(1); // mengeluarkan random number dari 0 sampai 1 x limb

//$rand2 = gmp_random(1); // mengeluarkan random number dari 0 sampai 1 x limb

//mencari bilangan random

$rand1=rand(100,200);

$rand2=rand(100,200);


// mencari bilangan prima selanjutnya dari $rand1 &rand2

$p = gmp_nextprime($rand1);
$q = gmp_nextprime($rand2);


//menghitung&menampilkan n=p*q
$n=gmp_mul($p,$q);


//menghitung&menampilkan totient/phi=(p-1)(q-1)
$totient=gmp_mul(gmp_sub($p,1),gmp_sub($q,1));


//mencari e, dimana e merupakan coprime dari totient
//e dikatakan coprime dari totient jika gcd/fpb dari e dan totient/phi = 1

for($e=2;$e<100;$e++){  //mencoba perulangan max 100 kali,

    $gcd = gmp_gcd($e, $totient);

    if(gmp_strval($gcd)=='1')

        break;

}

//cari d dengan syarat
// d.e mod totient =1
// d.e = totient*x + 1
// d.e = totient*1 + 1
// d = (totient *1 + 1)/e


//menghitung nilai d

$i=1;

do{

    $res = gmp_div_qr(gmp_add(gmp_mul($totient,$i),1), $e);

    $i++;

    if($i==10000) //maksimal percobaan 10000

        break;

}while(gmp_strval($res[1])!='0');

$d=$res[0];


$n =gmp_strval($n); //nilai n
$e =gmp_strval($e); //nilai e [enkripsi]
$d =gmp_strval($d); //nilai d [deskripsi]

?>


langkah kedua melakukan enkripsi
<?php

if(!empty($_POST['enkrip'])){
    $n=$_POST['n'];
    $e=$_POST['e'];
    $teks=$_POST['teks'];
    //pesan dikodekan menjadi kode ascii, kemudian di enkripsi per karakter
    for($i=0;$i<strlen($teks);++$i){
        //rumus enkripsi <enkripsi>=<pesan>^<e>mod<n>
        $hasil.=gmp_strval(gmp_mod(gmp_pow(ord($teks[$i]),$e),$n));

        //antar tiap karakter dipisahkan dengan "."
        if($i!=strlen($teks)-1){
            $hasil.=".";
        }
    }

}

?>
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
        <title>Enkripsi rsa</title> 

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head> 
    <body>
        <?php
        if($hasil){
            echo "<textarea id=\"hasil\">".$hasil."</textarea>";
        }
        ?>
        <form id="enkripsi" name="enkripsi" method="post">
           <textarea name="teks" id="teks"></textarea>
            <label for="n">n (desimal)=</label><input type="text" name="n" id="n" size="30" value="" />
            <label for="e">e (desimal)=</label><input type="text" name="e" id="e" size="10" value="" />
            <input type="submit" name="enkrip" id="enkrip" value="enkrip"/>
        </form>
</body>
</html>

kemudian kalau ingin mengembalikan pesan yang telah terenkrip tadi gunakan file berikut ini :

<?php
if(!empty($_POST['dekrip'])){
    $time_start = microtime(true);//menghitung waktu awal eksekusi
    $n=$_POST['n'];
    $d=$_POST['d'];

    //pesan enkripsi dipecah menjadi array dengan batasan "."
    $teks=explode(".",$_POST['teks']);
    foreach($teks as $nilai){
        //rumus enkripsi <pesan>=<enkripsi>^<d>mod<n>
        $hasil.=chr(gmp_strval(gmp_mod(gmp_pow($nilai,$d),$n)));
    }
    $time_end = microtime(true); //menghitung waktu akhir eksekusi dekripsi
    $time = $time_end - $time_start; //total waktu untuk dekripsi
}
?>
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
       <title>Proses Dekripsi rsa</title> 
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head> 
    <body>
        <h2>membutuhkan waktu <?php echo $time; ?> untuk dekripsi</h2>

<?php
        if($hasil){
            echo "<textarea id=\"hasil\">".$hasil."</textarea>";
        }
        ?>
        <form id="enkripsi" name="enkripsi" method="post">
            <textarea name="teks" id="teks"></textarea>
            <label for="n">n (desimal)=</label><input type="text" name="n" id="n" size="30" value="" />
            <label for="d">d (desimal)=</label><input type="text" name="d" id="d" size="10" value="" />
            <input type="submit" name="dekrip" id="dekrip" value="dekrip"/>
        </form>
</body>
</html>

Semoga Bermanfaat Ach Khozaimi #kuliah

5 comments:

  1. jalankan satu-satu, mulai dari yang atas. :-)

    ReplyDelete
  2. mas kalau muncul pesan Fatal error: Call to undefined function gmp_mul() in C:\xampp\htdocs\project\bayu\process\doencrypt.php on line 17.
    itu kenapa ya?

    ReplyDelete
  3. mas kalau muncul message Fatal error: Call to undefined function gmp_mul() in C:\xampp\htdocs\project\bayu\process\doencrypt.php on line 17.
    itu kenapa ya?

    ReplyDelete
  4. silakan buka file php.ini pada apache anda, kemudian cari ;extension=php_gmp.dll , buang tanda titik koma yang ada di depannya.

    ReplyDelete