21 Agustus 2012

Substitusi Homofon dengan PHP


Substitusi homofon adalah kriptografi klasik yang memetakan setiap karakter plainteks ke dalam salah satu chiperteks yang ada dengan tujuan untuk menyembunyikan hubungan antara plainteks dengan chiperteks dari frekuensi karakter yang muncul. Pada substitusi homofon, setiap karakter dapat memiliki chiperteks yang berbeda. Contoh plainteks A memiliki chiperteks AA, AC, GR atau lainnya yang mungkin, dengan begini untuk menebak plainteks dari chiperteks akan menjadi lebih sulit.



Disini saya mencoba membuat program kecil untuk membuat substitusi homofon dengan PHP, berikut langkah-langkahnya :

1. Pengguna memasukkan teks pada text area
2. Pilih enkripsi/dekripsi
3. Teks enkripsi/dekripsi ada pada text area hasil

Berikut kode program yang saya buat waktu kuliah Sistem Keamanan Komputer, mudah - mudahan dapat membantu. Hanya saja program ini mengacuhkan spasi dan angka serta simbol kecuali huruf :

File 1 : index.php
Untuk file index.php setiap tag saya tambahkan titik, karena malah jadi form ketika di publish


include dirname(__FILE__).'/SubstitusiHomofon.php';
/** Variabel penampung hasil deksripsi/enkripsi */
$hasil_text = null;
if(isset($_POST['text'])&&isset($_POST['submit'])){
$text = $_POST['text'];
/** Enkripsi plainteks ke chiperteks */
if($_POST['submit']=="Enkripsi"){
$hasil_text = enkripsi($text);
}
/** Dekripsi chiperteks ke plainteks */
else if($_POST['submit']=='Dekripsi'){
$hasil_text = dekripsi($text);
}

}
else{
$text = null;
}

?>
<.html>
<.body>
<.table border="1">
<.form action="index.php" method="post">
<.tr><.td align="center">Substitusi Homofon<./td><./tr>
<.tr><.td align="center"><./td><./tr>
<.tr><.td align="center">Hasil Enkripsi/Dekripsi<./td><./tr>
<.tr><.td width="300"><.textarea style="background-color:#ddd;" readonly="true" rows="10" cols="70" ><./textarea>
<./tr>
<.tr><.td align="center">Plaintext/Chipertext<./td><./tr>
<.tr><.td width="300"><.textarea name="text" rows="10" cols="70" ><./textarea><./td><./tr>
<.tr><.td colspan="2"><.input type="submit" value="Enkripsi" name="submit."/><.input type="submit" value="Dekripsi" name="submit"/><./td><./tr>
<./form>
<./table>
<./body>
<./html>

File 2 : SubstitusiHomofon.php

function getTable(){
/** Tabel plainteks ke chiperteks */
$tabel = array("A"=>array("BU","CP","AV","AH","BT","BS","CQ"),
           "B"=>array("AT"),
           "C"=>array("DL","BK","AU"),
               "D"=>array("BV", "DY", "DM", "AI"),
           "E"=>array("DK", "CO", "AW", "BL","AA", "CR", "BM", "CS","AF", "AG", "BO","BN", "BE"),
           "F"=>array("BW","CM","CN"),
           "G"=>array("DN","BJ"),
           "H"=>array("AS","CL","CK"),
           "I"=>array("DJ","BI","AX","CJ","AB","BP","CU","CT"),
           "J"=>array("BX"),
           "K"=>array("DI"),
               "L"=>array("AR", "BH", "CI", "AJ"),
               "M"=>array("DH", "BG", "AY"),
           "N"=>array("BY","DG","DF","CH","AC","BR","DU","DT"),
           "O"=>array("DZ","BF","DX","AK","CG","BQ","DR"),
               "P"=>array("BZ", "DE", "AZ"),
           "Q"=>array("DD"),
           "R"=>array("AQ","DC","DQ","AL","CE","CF","CV","DS"),
           "S"=>array("AP","AN","AO","CD","DW","DV"),
           "T"=>array("CB","DB","DP","CC","AD","CY","CW","CX","AE"),
           "U"=>array("CA","AM","BA"),
           "V"=>array("BB"),
           "W"=>array("CZ"),
           "X"=>array("BD"),
           "Y"=>array("DO", "DA"),
           "Z"=>array("BC"));
return $tabel;
}

/** Fungsi yang digunakan untuk mengenkripsi plainteks */
function enkripsi($str){
/** Hilangkan spasi pada string */
$str = str_ireplace(' ','',$str);
/** Rubah semua huruf menjadi huruf kapital */
$str = strtoupper($str);
/** Ambil jumlah huruf untuk pencacah */
$len = strlen($str);
/** Ambil peta plainteks ke chiperteks pada tabel */
$tabel = getTable();
$chiper = '';

for($i=0;$i<$len;$i++){
/** Cek apakah huruf plainteks ada pada tabel ? */
if(array_key_exists($str[$i], $tabel)){
/** Hitung jumlah kemungkinan chiperteks pada huruf*/
$c = count($tabel[$str[$i]]);
/** Ambil salah satu chiperteks dari huruf plainteks */
$chiper .= $tabel[$str[$i]][rand(0,$c-1)];
}
}
return $chiper;
}

/** Fungsi yang digunakan untuk melakukan dekripsi pada chiperteks */
function dekripsi($chipertext){
/** Hitung panjang karakter yang ada pada chiperteks */
$len = strlen($chipertext);
/** Jika chiperteks berjumlah genap, maka dapat dilakukan dekripsi pada chiperteks */
if($len%2==0){
/** Ambil peta plainteks ke chiperteks pada tabel*/
$tabel = getTable();
$plaintext = '';
$i=0;
while($i<$len){
foreach($tabel as $tab=>$tabs){
/** cek apakah setiap 2 huruf chiperteks ada pada array di tabel ? jika ada berikan nilai index */
if(in_array($chipertext[$i].$chipertext[$i+1], $tabel[$tab])){$plaintext .= $tab;}

}
$i+=2;
}
}
/** Jika chiperteks tidak berjumlah genap berarti chiperteks tidak dapat di dekripsi */
else{
$plaintext = 'Chipertext tidak lengkap';
}
return $plaintext;
}

Source Code : http://dl.dropbox.com/u/55867545/source_php/substitusi_homofon.zip

Program ini juga masih memiliki kekurangan seperti belum ada peta huruf, angka dan spasi. juga jumlah karakter yang bisa didekripsi hanya 2 huruf. Maklum, masih belajar :)

0 komentar:

Posting Komentar