Pages

Find Us On Facebook

Featured Video

Breaking News

Looped Slider

Gagdet

Flickr Images

Video Of Day

mplementasi algoritma RSA di PHP

Bagaimana cara mengirim pesan secara aman? Pertanyaan ini mungkin pernah muncul di benak anda. Di saat perang masing-masing pihak berusaha untuk mengirim pesan secara aman antar sekutu. Darisini munculah ide enkripsi pesan


Pesan diolah sedemikian rupa supaya makna asli dari pesan tersebut tidak dapat dibaca oleh orang yang tidak berhak. Ilmu yang mempelajari hal ini  disebut dengan kriptografi.

Kriptografi menggunakan kunci untuk mengubah pesan asli ke pesan terenkripsi dan sebaliknya untuk mengubah pesan terenkripsi menjadi pesan asli. Dilihat dari kuncinya enkripsi dapat dibagi menjadi dua macam yaitu symmetric key dan asymmetric key. Dikatakan symmetric key jika kunci yang digunakan untuk enkripsi dan dekripsi sama, sedangkan asymmetric key jika kunci yang digunakan berbeda.

RSA merupakan algoritma kriptografi yang menggunakan kunci asymmetric. Di RSA ada dua macam kunci yaitu kunci public(kunci yang digunakan untuk enkripsi) dan kunci private(kunci yang digunakan untuk dekripsi). Berikut ini algoritma RSA secara ringkas:

  1. cari bilangan prima yang berbeda untuk p dan q yang cukup besar, semakin besar semakin baik.
  2. hitung n, dimana n=pq.
  3. hitung totient euler, yaitu totient/phi=(p-1)(q-1).
  4. cari bilangan e, dimana e merupakan coprime dari totient, 1 < e < totient. coprime yaitu gcd/fpb dari e dan totient sama dengan 1
  5. tentukan nilai d, dimana d * e mod totient = 1, atau dengan kata lain d=(totient*x+1)/e. nilai x merupakan nilai sembarang
Kunci untuk public key: n dan e, kunci untuk private key: n dan d. Rumus untuk enkripsi yaitu [pesan terenkripsi]=[pesan]e mod n. Rumus untuk dekripsi [pesan]=[pesan terenkripsi]d mod n. Untuk implementasi RSA di PHP saya membuat 3 file yaitu: generate.php untuk membuat kunci RSA, encrypt.php untuk enkripsi, dan decrypt.php untuk dekripsi. berikut ini source code dari ketiga file tersebut :

generate.php
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
<pre>
<?php
echo "<h2>Membuat public & private key RSA</h2>\n";
//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(1000,2000);
$rand2=rand(1000,2000);
// mencari bilangan prima selanjutnya dari $rand1 &rand2
$p = gmp_nextprime($rand1);
$q = gmp_nextprime($rand2);
//menampilkan p & q
echo 'p='.gmp_strval($p) . "\n";
echo 'q='.gmp_strval($q). "\n";
//menghitung&menampilkan n=p*q
$n=gmp_mul($p,$q);
echo 'n='.gmp_strval($n). "\n";
//menghitung&menampilkan totient/phi=(p-1)(q-1)
$totient=gmp_mul(gmp_sub($p,1),gmp_sub($q,1));
echo 'totient='.gmp_strval($totient). "\n";
//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;
}
//menampilkan gcd
echo 'gcd = '.gmp_strval($gcd) . "\n";
//menampilkan e
echo 'e='.gmp_strval($e). "\n";
//cari d
// d.e mod totient =1
// d.e = totient*x + 1
// d.e = totient*1 + 1
// d = (totient *1 + 1)/e
//menghitung&menampilkan d
$i=1;
do{
$res = gmp_div_qr(gmp_add(gmp_mul($totient,$i),1), $e);
echo '((totient*'.$i.') + 1) / e='.gmp_strval($res[0])." ; sisa= ".gmp_strval($res[1])."\n";
$i++;
if($i==10000) //maksimal percobaan 10000
break;
}while(gmp_strval($res[1])!='0');
$d=$res[0];
echo 'd='.gmp_strval($d). "\n";
echo "hasil test d.e mod totient = ".gmp_strval(gmp_mod(gmp_mul($d,$e),$totient));
echo "<hr/>\n";
echo "<h2>
Ringkasan</h2>
\n";
echo "Desimal :\n";
echo "n =".gmp_strval($n)."\n";
echo "e =".gmp_strval($e)."\n";
echo "d =".gmp_strval($d)."\n";
echo "Hexadesimal :\n";
echo "n =".gmp_strval($n,16)."\n";
echo "e =".gmp_strval($e,16)."\n";
echo "d =".gmp_strval($d,16)."\n";
echo "Biner :\n";
echo "n =".gmp_strval($n,2)."\n";
echo "e =".gmp_strval($e,2)."\n";
echo "d =".gmp_strval($d,2)."\n";
echo "Basis 36 :\n";
echo "n =".gmp_strval($n,36)."\n";
echo "e =".gmp_strval($e,36)."\n";
echo "d =".gmp_strval($d,36)."\n";
?>
</pre>
view rawgenerate.php hosted with ❤ by GitHub


encrypt.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
<?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"/>
<style type="text/css">
input,label{
display:block;
}
textarea{
font-family: Helvetica, Arial;
line-height: 1.1em;
font-size:15pt;
text-align:left;
width:800px;
height:400px;
}
#hasil{
padding:20px;
background:gray;
color:lightgreen;
font-family:monospace;
}
</style>
</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>
view rawencrypt.php hosted with ❤ by GitHub


decrypt.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
<?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>Dekripsi rsa</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
input,label{
display:block;
}
textarea{
font-family: Helvetica, Arial;
line-height: 1.1em;
font-size:15pt;
text-align:left;
width:800px;
height:400px;
}
#hasil{
padding:20px;
background:gray;
color:lightgreen;
font-family:monospace;
}
</style>
</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>
view rawdecrypt.php hosted with ❤ by GitHub


ScreenShoot testing RSA :





No comments:

Post a Comment

 

Sponsor

Mengenai Saya

Most Reading

Powered by Blogger.