Implementasi Algoritma Hill Cipher 3x3 dan Rabin Public Key pada Pengiriman Short Message Service (SMS)

(1)

A-1

LAMPIRAN A : LISTING PROGRAM

1. splash.java

import android.app.Activity; import android.os.Bundle; import android.content.Intent;

import android.content.pm.ActivityInfo; import android.view.Window;

public class Splash extends Activity { protected int splash_ = 1000; @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_splash); //getSupportActionBar().hide(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setSplash(); }

public void setSplash() { new Thread() {

public void run() { try {

Thread.sleep(2000); } catch (Exception e) {

}

Intent i = new Intent(Splash.this, MainActivity.class); Splash.this.finish(); startActivity(i); } }.start(); } }

2. BuatPesan.java

import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.telephony.SmsManager; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.util.Random;

public class BuatPesan extends Activity {

EditText nomorKontak, text, hasilencrypt, kunci_p_enk, kunci_q_enk, kuncihill_enk, hasilencryptkunci;

TextView pubkey, nilaiK; // contact picker

private static final int CONTACT_PICKER_RESULT = 1001;

private long waktumulaihill, waktuakhirhill, selisihhill, waktumulairabin;

// phonecontact

public void doLaunchContactPicker(View view) {

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;


(2)

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT); }

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

String phone = ""; Cursor contacts = null; try {

if (resultCode == RESULT_OK) { switch (requestCode) {

case CONTACT_PICKER_RESULT:

// gets the uri of selected contact Uri result = data.getData();

// get the contact id from the Uri (last part is contact // id)

String id = result.getLastPathSegment(); // queries the contacts DB for phone no contacts = getContentResolver().query(

ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

ContactsContract.CommonDataKinds.Phone._ID + "=?", new String[]{id}, null);

// gets index of phone no

int phoneIdx = contacts.getColumnIndex(Phone.DATA); if (contacts.moveToFirst()) {

// gets the phone no

phone = contacts.getString(phoneIdx); EditText phoneTxt = (EditText) findViewById(R.id.nomorHp);

// assigns phone no to EditText field phone number phoneTxt.setText(phone);

} else {

Toast.makeText(this, "error", Toast.LENGTH_LONG).show();

} break; }

} else {

// gracefully handle failure

Toast.makeText(BuatPesan.this, R.string.belumdipilih, Toast.LENGTH_SHORT).show();

}

} catch (Exception e) {

Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } finally {

if (contacts != null) { contacts.close(); }

} }

public String toBinary(long n) { if (n == 0) {

return "0"; }

String binary = ""; while (n > 0) { long rem = n % 2; binary = rem + binary; n = n / 2;

}

return binary; }

public long toDecimal(long binary) { long decimal = 0;

long power = 0; while (true) {

if (binary == 0) { break;


(3)

A-3

long temp = binary % 10;

decimal += temp * Math.pow(2, power); binary = binary / 10;

power++; }

}

return decimal; }

public boolean fermat(int p) { boolean hasil = true; Random rand = new Random(); int a = rand.nextInt(20) + 1; if (a % p == 0) {

hasil = false;

} else if (modExp(a, p - 1, p) != 1) { hasil = false;

}

return hasil; }

public static int modExp(int a, int b, int n) { if (b == 0) return 1;

long t = modExp(a, b / 2, n); long c = (t * t) % n;

if (b % 2 == 1) c = (c * a) % n; return (int) c; }

@Override

public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState);

this.setTitle("Encrypt Message");

setContentView(R.layout.buatpesan);

final Button send = (Button) findViewById(R.id.send); final Button encrypt = (Button) findViewById(R.id.encrypt);

final Button encryptkunci = (Button) findViewById(R.id.encryptkunci); text = (EditText) findViewById(R.id.smsBox);

nomorKontak = (EditText) findViewById(R.id.nomorHp); hasilencrypt = (EditText) findViewById(R.id.hasilEncrypt);

hasilencryptkunci = (EditText) findViewById(R.id.hasilEncryptkunci); kunci_p_enk = (EditText) findViewById(R.id.kunci_p_enk);

kunci_q_enk = (EditText) findViewById(R.id.kunci_q_enk); kuncihill_enk = (EditText) findViewById(R.id.KunciHill_enk); pubkey = (TextView) findViewById(R.id.pubkey);

nilaiK = (TextView) findViewById(R.id.Kvalues);

Intent i = getIntent();

if (i.getStringExtra("message") != null) { text.setText(i.getStringExtra("message")); }

encryptkunci.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) { // TODO Auto-generated method stub

waktumulairabin = System.currentTimeMillis(); String enkunciaes = "";

String keyx = kuncihill_enk.getText().toString(); String p = kunci_p_enk.getText().toString(); String q = kunci_q_enk.getText().toString(); try {

if (TextUtils.isEmpty(keyx)) {

kuncihill_enk.setError("Your key is Empty"); } else if (TextUtils.isEmpty(p)) {

kunci_p_enk.setError("Private Keys cannot Empty"); } else if (TextUtils.isEmpty(q)) {

kunci_q_enk.setError("Private Keys cannot Empty"); } else if (!p.matches("[0-9]*")) {

kunci_p_enk.setError("Private Keys must be a Number");


(4)

} else if (!q.matches("[0-9]*")) {

kunci_q_enk.setError("Private Keys must be a Number"); } else if (p.equals(q)) {

kunci_p_enk.setError("Private Keys must be Different"); } else if (!fermat(Integer.parseInt(p))) {

kunci_p_enk.setError("Private Key must be a Prime Number");

} else if (!fermat(Integer.parseInt(q))) {

kunci_q_enk.setError("Private Key must be a Prime Number");

} else if (Integer.parseInt(p) % 4 != 3) {

kunci_p_enk.setError("Private Keys must have modulus 3 when devide by 4");

} else if (Integer.parseInt(q) % 4 != 3) {

kunci_q_enk.setError("Private Keys must have modulus 3 when devide by 4");

} else {

long startTime = System.currentTimeMillis(); int uvw = Integer.parseInt(p);

int xyz = Integer.parseInt(q); long publickey = uvw * xyz;

pubkey.setText("public key :" + publickey); //tabelEnc obj1 = new tabelEnc();

for (int i = 0; i < keyx.length(); ++i) {

//Toast.makeText(getApplicationContext(), "ke: "+i+"ms", Toast.LENGTH_LONG).show();

char b = keyx.charAt(i);

int plain = tabelEnc.getIndex(b); String double_text = toBinary(plain) + toBinary(plain);

long double_dectext = Long.parseLong(double_text); long m = toDecimal(double_dectext);

long k = (m - (m % publickey)) / publickey; nilaiK.setText(nilaiK.getText() + " " + k); SimpanKunci.setKkey(String.valueOf(k)); long c = (long) (Math.pow(m, 2) % publickey); SimpanKunci.setCipherkey(String.valueOf(c));

hasilencryptkunci.setText(hasilencryptkunci.getText() + " " + c);

}

// obj2 = new simpanVariabel();

long endTime = System.currentTimeMillis(); long duration = (endTime - startTime);

Toast.makeText(getApplicationContext(), "Encryption Time: " + duration + "ms", Toast.LENGTH_LONG).show();

}

} catch (Exception e1) {

Toast.makeText(BuatPesan.this, enkunciaes, Toast.LENGTH_LONG).show(); e1.printStackTrace(); } //hasilencryptkunci.setText(enkunciaes); } });

encrypt.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View e) {

String ambilKata = text.getText().toString();

String kunci_enk_hill = kuncihill_enk.getText().toString(); String enKata = "";

try {

if ((kuncihill_enk.getText().toString().equals("") || text.getText().toString().equals(""))) {

Toast.makeText(BuatPesan.this, "Pesan ataupun kunci tidak boleh kosong",

Toast.LENGTH_SHORT).show(); } else {


(5)

A-5

waktumulaihill = System.currentTimeMillis(); hillCipher obj = new hillCipher();

double sq = Math.sqrt(kunci_enk_hill.length());

System.out.println("ini double " + sq + " ini long " + (long) sq + " ini int " + (int) sq);

if (sq != (long) sq)

System.out.println("panjang kunci salah"); //0+3TLeT*9[I.MV5hk1z%z mOTR$QB>U

else {

int s = (int) sq;

if (obj.check(kunci_enk_hill, s)) { System.out.println("Result:");

obj.divide(ambilKata, s); //pakai kunci ASCII dari 32-126

System.out.println("ini ya guys :" + obj.hasilenkripsi);

Log.i("Kata Asal", ambilKata); enKata = obj.hasilenkripsi; Log.i("Kata Hasil", enKata); obj.cofact(obj.keymatrix, s);

System.out.print("inversi key " + obj.invkey); }

}

hasilencrypt.setText(enKata);

waktuakhirhill = System.currentTimeMillis(); selisihhill = waktuakhirhill - waktumulaihill;

Toast.makeText(BuatPesan.this, "lama enkripsi Hill Cipher " + Long.toString(selisihhill), Toast.LENGTH_SHORT).show();

}

} catch (Exception e1) { e1.printStackTrace(); }

} });

send.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

String pesan = hasilencrypt.getText().toString(); String nomor = nomorKontak.getText().toString(); if (pesan.length() > 0 && nomor.length() > 0) { try {

// proses kirim sms

SmsManager sms = SmsManager.getDefault();

sms.sendTextMessage(nomor, null, pesan, null, null);

// proses simpan sms yang terkirim

ContentValues values = new ContentValues(); values.put("address", nomor);

values.put("body", pesan); getContentResolver().insert(

Uri.parse("content://sms/sent"), values);

Toast.makeText(BuatPesan.this,

"Pesan berhasil dikirim", Toast.LENGTH_SHORT) .show();

finish();

} catch (Exception e) {

Toast.makeText(BuatPesan.this, "Pesan gagal dikirim", Toast.LENGTH_SHORT).show();

e.printStackTrace(); }

} else {

Toast.makeText(BuatPesan.this,

"Nomor atau Isi Pesan Masing Kosong", Toast.LENGTH_SHORT).show(); } } }); } }


(6)

3. LihatPesan.java import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.nio.charset.Charset; import java.util.Random;

public class LihatPesan extends Activity {

private static final Charset UTF8_CHARSET = Charset.forName("UTF-8"); final int tipe_enkripsi=128;

private long

selisihhill,waktuawalhill,waktuakhirhill,selisihrabin,waktuawalrabin,waktuakhirrab in,selisihtotal;

TextView number, date, msg,hasilDekripsi;

Button forward, hapus,dekripsi,dekripsikunci,btndekriphill;

EditText kunci_p_dek,kunci_q_dek,nilai_k,kuncihill_Dek,hasildekkuncihill; public boolean pil_rad=true;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.lihatpesan); this.setTitle("Decrypt Message");

number = (TextView) findViewById(R.id.tvNumber); date = (TextView) findViewById(R.id.tvDate); msg = (TextView) findViewById(R.id.tvMsg);

hasilDekripsi = (TextView) findViewById(R.id.hasildekrip); dekripsi = (Button) findViewById(R.id.dekripsiBtn); forward = (Button) findViewById(R.id.btFrd);

btndekriphill=(Button) findViewById(R.id.btnDekripkunci); hapus = (Button) findViewById(R.id.hapus);

kunci_p_dek = (EditText) findViewById(R.id.kunci_p_dek); kunci_q_dek = (EditText) findViewById(R.id.kunci_q_dek);

hasildekkuncihill=(EditText) findViewById(R.id.hasildekkuncihill); kuncihill_Dek = (EditText) findViewById(R.id.kuncihill_dek); nilai_k = (EditText)findViewById(R.id.k_values);

kuncihill_Dek.setText(SimpanKunci.getCipherkey()); nilai_k.setText(SimpanKunci.getKkey());

btndekriphill.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) { // TODO Auto-generated method stub int a_inv = 0;

int flag = 0;

waktuawalrabin=System.currentTimeMillis();

String ambilkata2 = kuncihill_Dek.getText().toString(); String kunci_dek = kunci_p_dek.getText().toString(); String temp="";

String hasil2 = null; try {

String keyx = SimpanKunci.getCipherkey(); String p = kunci_p_dek.getText().toString(); String q = kunci_q_dek.getText().toString(); String k = SimpanKunci.getKkey();

if ("".equals(keyx)) {

kuncihill_Dek.setError("Your Cipherkey is Empty"); } else if ("".equals(p)) {


(7)

A-7

} else if ("".equals(q)) {

kunci_q_dek.setError("Private Keys cannot Empty"); } else if (p.equals(q)) {

kunci_p_dek.setError("Private Keys must be Different"); } else if (!p.matches("[0-9]*")) {

kunci_p_dek.setError("Private Keys must be a Number"); } else if (!q.matches("[0-9]*")) {

kunci_q_dek.setError("Private Keys must be a Number"); } else if (!fermat(Integer.parseInt(p))) {

kunci_p_dek.setError("Private Key must be a Prime Number");

} else if (!fermat(Integer.parseInt(q))) {

kunci_q_dek.setError("Private Key must be a Prime Number");

} else if (Integer.parseInt(p) % 4 != 3) {

kunci_p_dek.setError("Private Keys must have modulus 3 when devide by 4");

} else if (Integer.parseInt(q) % 4 != 3) {

kunci_q_dek.setError("Private Keys must have modulus 3 when devide by 4");

} else if ("".equals(k)) {

nilai_k.setError("K cannot Empty"); }else {

long startTime=System.currentTimeMillis(); int uvw = Integer.parseInt(p);

int xyz = Integer.parseInt(q); int n = uvw * xyz;

int P = (uvw + 1) / 4; int Q = (xyz + 1) / 4; int vals[] = gcd(uvw, xyz); int Yp = vals[1];

int Yq = vals[2];

int r, s, t, u, R, S, T, U;

String[] cipherteks = keyx.split(" ");

int[] arrayCiptext = new int[cipherteks.length]; String[] Kvalues = k.split(" ");

int[] arrayK = new int[Kvalues.length]; for (int i = 0; i < cipherteks.length; i++) { try {

arrayCiptext[i] = Integer.parseInt(cipherteks[i]); arrayK[i] = Integer.parseInt(Kvalues[i]);

} catch (NumberFormatException nfe) { }

int cipher = arrayCiptext[i]; int K = arrayK[i];

double mp = modExp(cipher, P, uvw); double mq = modExp(cipher, Q, xyz); int a1 = (int) (Yp * uvw * mq); int a2 = (int) (Yq * xyz * mp); r = ((a1 + a2) % n + n) % n; R = (K * n) + r;

String Rx = toBinary(R); s = ((a1 - a2) % n + n) % n; S = (K * n) + s;

String Sx = toBinary(S); t = ((-a1 + a2) % n + n) % n; T = (K * n) + t;

String Tx = toBinary(T); u = ((-a1 - a2) % n + n) % n; U = (K * n) + u;

String Ux = toBinary(U);

//tabelEnc tabelEnc= new tabelEnc(); char hsl;

if (check(Rx)) {

String RR = singlebin(Rx); long Rfinal = Long.parseLong(RR); long Rfin = toDecimal(Rfinal); hsl=tabelEnc.getChar((int)Rfin);

hasildekkuncihill.setText(hasildekkuncihill.getText().toString() + hsl); } else if (check(Sx)) {

String SS = singlebin(Sx);


(8)

long Sfinal = Long.parseLong(SS); long Sfin = toDecimal(Sfinal); hsl=tabelEnc.getChar((int)Sfin);

hasildekkuncihill.setText(hasildekkuncihill.getText().toString() + hsl); } else if (check(Tx)) {

String TT = singlebin(Tx); long Tfinal = Long.parseLong(TT); long Tfin = toDecimal(Tfinal); hsl=tabelEnc.getChar((int)Tfin);

hasildekkuncihill.setText(hasildekkuncihill.getText().toString() + hsl); } else if (check(Ux)) {

String UU = singlebin(Ux); long Ufinal = Long.parseLong(UU); long Ufin = toDecimal(Ufinal); hsl=tabelEnc.getChar((int)Ufin);

hasildekkuncihill.setText(hasildekkuncihill.getText().toString() + hsl); } else {

hasildekkuncihill.setText(""); }

}

//DekripsiAutokeyCipher(msgx, key.getText().toString()); long endTime=System.currentTimeMillis();

long duration = (endTime - startTime); SimpanKunci.Reset();

Toast.makeText(getApplicationContext(), "Decryption Time: "+duration+"ms", Toast.LENGTH_LONG).show();

}

} catch (Exception e) {

// TODO Auto-generated catch block e.printStackTrace();

}

//hasildekkunciaes.setText(temp);

waktuakhirrabin=System.currentTimeMillis(); selisihrabin=waktuakhirrabin-waktuawalrabin;

Toast.makeText(LihatPesan.this, "lama dekripsi rabin "+Long.toString(selisihrabin),Toast.LENGTH_SHORT).show();

} });

dekripsi.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) { int a_inv = 0;

int flag = 0;

String ambilKata = msg.getText().toString(); String deKata = "";

try {

if (!"".equals(hasildekkuncihill.getText().toString())) { waktuawalhill=System.currentTimeMillis();

String hasil2e=null; String keyaes_dek = hasildekkuncihill.getText().toString();

hillCipher obj1 = new hillCipher();

double sq = Math.sqrt(keyaes_dek.length()); System.out.println("ini double "+sq+" ini long "+(long)sq+" ini int "+(int)sq);

if (sq != (long) sq)

System.out.println("panjang kunci salah"); //0+3TLeT*9[I.MV5hk1z%z mOTR$QB>U

else {

int s = (int) sq;

if (obj1.check(keyaes_dek, s)) {

System.out.println("Result:"); obj1.cofact(obj1.keymatrix, s);

System.out.print("inversi key "+obj1.invkey); keyaes_dek=obj1.invkey;


(9)

A-9

} }

double sqt = Math.sqrt(keyaes_dek.length()); System.out.println("ini double "+sq+" ini long "+(long)sq+" ini int "+(int)sq);

if (sqt != (long) sqt)

System.out.println("panjang kunci salah"); //0+3TLeT*9[I.MV5hk1z%z mOTR$QB>U

else {

int s = (int) sqt;

if (obj1.check(keyaes_dek, s)) {

System.out.println("Result:");

obj1.divide(ambilKata, s); //pakai kunci ASCII dari 32-126

System.out.println("ini ya wee :"+obj1.hasilenkripsi);

deKata=obj1.hasilenkripsi; obj1.cofact(obj1.keymatrix, s);

System.out.print("inversi key "+obj1.invkey); } } waktuakhirhill=System.currentTimeMillis(); hasilDekripsi.setText(deKata); selisihhill=(waktuakhirhill-waktuawalhill); selisihtotal=selisihhill+selisihrabin;

Toast.makeText(LihatPesan.this, "waktu dekrips Hill Cipher "+Long.toString(selisihtotal),Toast.LENGTH_SHORT).show();

} else{

Toast.makeText(LihatPesan.this, "PlainText Kunci Hill masih kosong",Toast.LENGTH_SHORT).show();

}

} catch (Exception e) {

Log.i("Error", e.getMessage());hasilDekripsi.setText("kunci tidak memenuhi GCD atau tidak memenuhi syarat inversi modulo ");}

} }); }

@Override

protected void onStart() { super.onStart(); Intent i = getIntent();

number.setText(i.getStringExtra("no")); date.setText(i.getStringExtra("date")); msg.setText(i.getStringExtra("msg"));

forward.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent click = new Intent(LihatPesan.this, BuatPesan.class); click.putExtra("message", msg.getText());

startActivity(click);

} });

hapus.setOnClickListener(new OnClickListener() { @Override

public void onClick(View v) {

Dialogs.showConfirmation(LihatPesan.this, R.string.hapuspesan_dialog,

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

Intent i = getIntent(); String id_pesan_hapus = i

.getStringExtra("idpesan");


(10)

String id_thread_hapus = i

.getStringExtra("idthread");

// hapus pesan

Uri deleteUri = Uri.parse("content://sms");

getContentResolver() .delete(deleteUri,

"thread_id=? and _id=?", new String[] {

String.valueOf(id_thread_hapus), String.valueOf(id_pesan_hapus) }); finish(); Toast.makeText(LihatPesan.this,

"Pesan Terhapus", Toast.LENGTH_SHORT) .show();

// redirect data pesan onBackPressed(); } }); } }); }

public String toBinary(long n) { if (n == 0) {

return "0"; }

String binary = ""; while (n > 0) { long rem = n % 2; binary = rem + binary; n = n / 2;

}

return binary; }

public long toDecimal(long binary){ long decimal = 0;

long power = 0; while(true){

if(binary == 0){ break; } else {

long temp = binary%10;

decimal += temp*Math.pow(2, power); binary = binary/10;

power++; }

}

return decimal; }

public static int[] gcd(int p, int q) { if (q==0)

return new int[] { p, 1, 0 }; int[] vals = gcd(q, p % q); int d = vals[0];

int a = vals[2];

int b = vals[1] - (p / q) * vals[2]; return new int[] { d, a, b }; }

public static int modExp(int a, int b, int n) { if (b == 0) return 1;

long t = modExp(a, b/2, n); long c = (t*t)%n;

if (b%2 == 1) c = (c*a)%n;


(11)

A-11

return (int)c; }

public boolean check(String x){ boolean hsl = true;

int a = Math.round(x.length()/2); for(int i=0; i<a; ++i)

if (x.charAt(i)!=x.charAt(i+a)) hsl=false;

return hsl; }

public boolean fermat(int p){ boolean hasil=true;

Random rand = new Random(); int a=rand.nextInt(20)+1; if (a%p==0){

hasil=false; }

else if (modExp(a,p-1,p)!=1){ hasil=false;

}

return hasil; }

public String singlebin(String x){ String n="";

for(int y=0; y<Math.floor(x.length()/2); y++){ n= n+x.charAt(y);

}

return n; }

@Override

public void onBackPressed() {

Intent link = new Intent(LihatPesan.this, DataPesan.class); Intent i = getIntent();

link.putExtra("tipepesan", i.getStringExtra("asal")); startActivity(link);

}}

4. MainActivity.java

import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.app.Activity; import android.content.Intent;

public class MainActivity extends Activity { //Button tentang, bantuan;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main);

((Button) findViewById(R.id.btnPesanbaru)).setOnClickListener(new OnClickListener() {

public void onClick(View v) {

MainActivity.this.startActivity(new Intent( MainActivity.this, BuatPesan.class)); } }); ((Button) findViewById(R.id.btnPesankeluar)).setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent click = new Intent(MainActivity.this, DataPesan.class); click.putExtra("tipepesan", "sent");


(12)

startActivity(click); }

});

((Button) findViewById(R.id.btnPesanmasuk)).setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent click = new Intent(MainActivity.this, DataPesan.class); click.putExtra("tipepesan", "inbox"); startActivity(click); } }); ((Button) findViewById(R.id.btnBantuan)).setOnClickListener(new OnClickListener() { @Override

public void onClick(View arg0) { // TODO Auto-generated method stub

Intent i = new Intent(MainActivity.this, bantuan.class); startActivity(i); } }); ((Button) findViewById(R.id.btnTentang)).setOnClickListener(new OnClickListener() { @Override

public void onClick(View arg0) { // TODO Auto-generated method stub

Intent i = new Intent(MainActivity.this, tentang.class); startActivity(i);

} });

((Button) findViewById(R.id.btnKeluar)).setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); System.exit(0); } }); } }

5. DataPesan.java

import java.util.Date; import java.text.DateFormat; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.support.v4.widget.SimpleCursorAdapter; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import android.view.View;


(13)

A-13

private SimpleCursorAdapter dataAdapter; @Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.listpesan); this.setTitle("List Message"); displayListView();

}

private void displayListView() { Intent i = getIntent(); Uri uriSMS = Uri

.parse("content://sms/" + i.getStringExtra("tipepesan"));

Cursor cursor = getContentResolver().query(uriSMS, null, null, null,

null);

String[] columns = new String[] { "address", "body", "date" };

int[] to = new int[] { R.id.pengirim, R.id.isipesan, R.id.waktu };

dataAdapter = new SimpleCursorAdapter(this, R.layout.pesan_row, cursor,

columns, to, 0);

ListView listView = (ListView) findViewById(R.id.listView1); dataAdapter.setViewBinder(new

SimpleCursorAdapter.ViewBinder() { @Override

public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

// ubah nomer hape dengan nama yang ada dikontak

if (columnIndex == 2) {

TextView tv = (TextView) view; String pengirimDB =

cursor.getString(cursor

.getColumnIndex("address"));

// get contact name

Uri contactUri = Uri.withAppendedPath( ContactsContract.PhoneLookup.CONTENT_FILTER_URI,

Uri.encode(pengirimDB)); Cursor cur =

getContentResolver().query(contactUri, null,

null, null, null); ContentResolver contect_resolver = getContentResolver();

int size = cur.getCount(); if (size > 0 && cur != null) {

for (int i = 0; i < size; i++) { cur.moveToPosition(i); String id1 =

cur.getString(cur

.getColumnIndexOrThrow(ContactsContract.Contacts._ID));


(14)

Cursor phoneCur = contect_resolver

.query(contactUri, null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",

new String[] { id1 }, null);

if (phoneCur.moveToFirst()) {

String namaKontak = phoneCur.getString(phoneCur

.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAM E));

phoneCur.close(); tv.setText(namaKontak);

} else { tv.setText(pengirimDB);

} }

cur.close(); } else {

tv.setText(pengirimDB); }

return true; }

// konversi tanggal if (columnIndex == 4) {

TextView tv = (TextView) view;

String waktu = cursor.getString(cursor .getColumnIndex("date")); long l = Long.parseLong(waktu);

Date d = new Date(l); String date =

DateFormat.getDateInstance(DateFormat.LONG)

.format(d); String time =

DateFormat.getTimeInstance().format(d);

String view_waktu = date + " " + time; tv.setText(view_waktu);

return true; }

return false; }

});

// menampilkan daftar pesan listView.setAdapter(dataAdapter);


(15)

A-15

// jika di pesan di klik, maka akan dialihkan ke lihat pesan secara full

listView.setOnItemClickListener(new OnItemClickListener() { @Override

public void onItemClick(AdapterView<?> listView, View view,

int position, long id) { // Get the cursor, positioned to the corresponding row in the

// result set

Cursor cursor = (Cursor) listView.getItemAtPosition(position);

// Get the state's capital from this row in the database.

String view_pengirim = cursor.getString(cursor .getColumnIndexOrThrow("address"));

String view_isipesan = cursor.getString(cursor .getColumnIndexOrThrow("body")); String waktu = cursor.getString(cursor

.getColumnIndexOrThrow("date")); // konversi tanggal

long l = Long.parseLong(waktu); Date d = new Date(l);

String date = DateFormat.getDateInstance(DateFormat.LONG)

.format(d); String time =

DateFormat.getTimeInstance().format(d);

String view_waktu = date + " " + time;

String view_idpesan = cursor.getString(cursor .getColumnIndexOrThrow("_id")); String view_thread = cursor.getString(cursor .getColumnIndexOrThrow("thread_id"));

Intent click = new Intent(DataPesan.this, LihatPesan.class);

// get contact name

Uri contactUri = Uri.withAppendedPath( ContactsContract.PhoneLookup.CONTENT_FILTER_URI,

Uri.encode(view_pengirim)); Cursor cur =

getContentResolver().query(contactUri, null, null, null, null);

ContentResolver contect_resolver = getContentResolver();

int size = cur.getCount(); if (size > 0 && cur != null) {

for (int i = 0; i < size; i++) { cur.moveToPosition(i);

String id1 = cur.getString(cur .getColumnIndexOrThrow(ContactsContract.Contacts._ID));

Cursor phoneCur = contect_resolver

.query(contactUri,


(16)

null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID

+ " = ?", new String[] { id1 },

null); if (phoneCur.moveToFirst()) {

String namaKontak = phoneCur.getString(phoneCur .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAM E)); phoneCur.close(); click.putExtra("no", namaKontak);

} else {

click.putExtra("no", view_pengirim);

} }

cur.close(); } else {

click.putExtra("no", view_pengirim); }

// kirim data ke view pesan

click.putExtra("msg", view_isipesan); click.putExtra("idpesan", view_idpesan); click.putExtra("idthread", view_thread); click.putExtra("date", view_waktu); Intent i = getIntent();

click.putExtra("asal", i.getStringExtra("tipepesan")); startActivity(click); } }); } @Override

public void onBackPressed() {

Intent link = new Intent(DataPesan.this, MainActivity.class);

startActivity(link); finish();

} }

6. hillCipher.java

public class hillCipher { int keymatrix[][]; int linematrix[]; int resultmatrix[]; String hasilenkripsi = ""; String invkey = "";

public String divide(String temp, int s) { while (temp.length() > s) {

String sub = temp.substring(0, s); temp = temp.substring(s, temp.length()); perform(sub);

}

if (temp.length() == s) perform(temp);


(17)

A-17

else if (temp.length() < s) {

for (int i = temp.length(); i < s; i++) temp = temp + ' ';

perform(temp); }

return hasilenkripsi; }

//E>Ybm=PNu

public void perform(String line) { linetomatrix(line);

linemultiplykey(line.length()); result(line.length());

}

public void keytomatrix(String key, int len) { keymatrix = new int[len][len];

int c = 0;

for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) {

keymatrix[i][j] = (tabelEnc.getIndex(key.charAt((3*i)+j))); System.out.print(keymatrix[i][j] + " ");

c++; }

System.out.println(); }

}

public void linetomatrix(String line) { linematrix = new int[line.length()]; for (int i = 0; i < line.length(); i++) {

linematrix[i] = (tabelEnc.getIndex(line.charAt(i))); }

}

public void linemultiplykey(int len) { resultmatrix = new int[len]; for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) {

resultmatrix[i] += keymatrix[i][j] * linematrix[j]; }

resultmatrix[i] %= 97; }

}

public void result(int len) { //System.out.print("len "+len); String result = "";

for (int i = 0; i < len; i++) {

hasilenkripsi += tabelEnc.getChar(resultmatrix[i]); }

}

public boolean check(String key, int len) { keytomatrix(key, len);

int d = determinant(keymatrix, len); int mod = 97;

while (d < 0) { d = d + 97; mod = mod + 97; }

d = d % 97;

if (d == 0) {//YH)&F(lZ;

System.out.println("Invalid key!!! Key is not invertible because determinant=0..."); return false; } else { return true; } }

public int determinant(int A[][], int N) {


(18)

int res; if (N == 1) res = A[0][0]; else if (N == 2) {

res = A[0][0] * A[1][1] - A[1][0] * A[0][1]; } else {

res = 0;

for (int j1 = 0; j1 < N; j1++) { int m[][] = new int[N - 1][N - 1]; for (int i = 1; i < N; i++) { int j2 = 0;

for (int j = 0; j < N; j++) { if (j == j1)

continue;

m[i - 1][j2] = A[i][j]; j2++;

} }

res += Math.pow(-1.0, 1.0 + j1 + 1.0) * A[0][j1] * determinant(m, N - 1);

} }

return res; }

public void cofact(int num[][], int f) { int b[][], fac[][];

b = new int[f][f]; fac = new int[f][f]; int p, q, m, n, i, j; for (q = 0; q < f; q++) { for (p = 0; p < f; p++) { m = 0;

n = 0;

for (i = 0; i < f; i++) { for (j = 0; j < f; j++) { b[i][j] = 0;

if (i != q && j != p) { b[m][n] = num[i][j]; if (n < (f - 2)) n++;

else { n = 0; m++; } } } }

fac[q][p] = (int) Math.pow(-1, q + p) * determinant(b, f - 1); }

}

trans(fac, f); }

void trans(int fac[][], int r) { int i, j;

int b[][], inv[][]; b = new int[r][r]; inv = new int[r][r];

int d = determinant(keymatrix, r); int mi = mi(d % 97);

mi %= 97; if (mi < 0) mi += 97;

for (i = 0; i < r; i++) {

for (j = 0; j < r; j++) {

b[i][j] = fac[j][i]; }

}

for (i = 0; i < r; i++) {


(19)

A-19

{

inv[i][j] = b[i][j] % 97; if (inv[i][j] < 0) inv[i][j] += 97; inv[i][j] *= mi; inv[i][j] %= 97; }

}

matrixtoinvkey(inv, r); }

public int mi(int d) {

int q, r1, r2, r, t1, t2, t; r1 = 97;

r2 = d; t1 = 0; t2 = 1;

while (r1 != 1 && r2 != 0) {

q = r1 / r2; r = r1 % r2; t = t1 - (t2 * q); r1 = r2;//"ay&k1F N r2 = r;

t1 = t2; t2 = t; }

return (t1 + t2); }

public void matrixtoinvkey(int inv[][], int n) {

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++) {

invkey += (tabelEnc.getChar(inv[i][j])); }

} }}

7. tabelEnc.java

/**

* Created by Fitri on 16/04/2016. */

public class tabelEnc { static char tabel[] =

{'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','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','0','1','2','3','4','5','6','7','8',' 9',' ','.',',','@','#','$','%','&','-','+','(',')','*','"','\'',':',';',

'!','?','_','/','~','|','^','=','{','}','\\','[',']','<','>','®','€','©'}; public static int getIndex(char x) {

for (int i=0;i<97;i++) { if (x == (tabel[i])){ return i;

} }

return -1; }

public static char getChar(int x) { return tabel[x];

} }


(20)

8. SimpanKunci.java

public class SimpanKunci {

private static String cipherkey="", Kkey = ""; public static void setCipherkey(String c){ cipherkey += c + " ";

}

public static String getCipherkey(){

return cipherkey; }

public static void setKkey(String c){

Kkey += c + " "; }

public static String getKkey(){

return Kkey; }

public static void Reset(){ cipherkey = "";

Kkey = ""; }

}

9. Dialog.java

import android.app.AlertDialog; import android.content.Context;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

public class Dialogs {

public static void showConfirmation(Context context, int message, OnClickListener onYes) {

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( context);

// set title

alertDialogBuilder.setTitle(R.string.confirmation);

// set dialog message alertDialogBuilder

.setMessage(message) .setCancelable(false)

.setPositiveButton("Ya", onYes) .setNegativeButton("Tidak",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int id) {

dialog.cancel(); }

});

// create alert dialog

AlertDialog alertDialog = alertDialogBuilder.create();

// show it

alertDialog.show(); }


(21)

A-21

10. bantuan.java

import android.app.Activity; import android.os.Bundle;

public class bantuan extends Activity { @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.bantuan); this.setTitle("Help");

} }

11. tentang.java

import android.app.Activity; import android.os.Bundle;

public class tentang extends Activity { @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.tentang); this.setTitle("About");

} }


(22)

D

AFTAR

R

IWAYAT

H

IDUP

CURRICULUM VITAE

I. DATA PRIBADI /Personal Identification

Nama Lengkap : Fitri Rahmadhani

Tempat/Tgl. Lahir : Medan / 28 Februari 1995

Jenis Kelamin : Perempuan

Agama : Islam

Kebangsaan : Indonesia

Alamat : Jalan AR Hakim Gg.Nangka No.42 A Medan Area, Medan, Sumatera Utara, Indonesia 20216

Telepon : +6285277328530

Moto Hidup : Bermanfaat bagi Orang Lain

Email : fitri.rahmadhani80@gmail.com

II. KEMAMPUAN / Capabilities

Bahasa : Bahasa Indonesia, Bahasa Inggris

Bahasa Pemrograman : C#, PHP, Java for Mobile

Database : MySQL

Lainnya : HTML, CSS, Photoshop, Ms. Office, Adobe Flash

III. PENDIDIKAN FORMAL / Formal Education

 [ 2012 – 2016 ] S1 Ilmu Komputer, Fakultas Ilmu Komputer dan Teknologi Informasi Universitas Sumatera Utara

 [ 2009 – 2012 ] SMA Swasta Eria Medan

 [ 2006 – 2009 ] SMP Swasta Al Washliyah Medan

 [ 2000 – 2006 ] SD Swasta Nurhasanah Medan IV. PENDIDIKAN NON-FORMAL / Informal Education

 [ 2001 – 2006 ] Ta’limul Qur’an Lil Aulad (TQA) Al- Fauzi, Medan

 [ 2011 – 2012 ] Ganesha Operation, Medan. V. PRESTASI / Achievements

1) Delegasi dari Indonesia di Young ICT Leaders Forum, Busan, Korea Selatan [2015]

2) Pengajar Muda Gerakan USU Mengajar [2014]

3) Finalis Desain ARTechno Universitas Sumatera Utara [2014]

4) Juara 2 Desain Poster “Islamic Booming” Aladiyansyah Expo Universitas Sumatera Utara [2014]

5) Juara 2 Desain Poster “Keep Health Tooth” Mukernas FKG Nasional [2014]

6) Juara 3 Fotografi “Healhty Smile” Mukernas FKG Nasional [2014]

7) Honorable Participant Of SGC English Universitas Sumatera Utara [2014]

8) Juara 3 Menulis Puisi untuk Ibu Universitas Sumatera Utara [2013]


(23)

B - 2

VI. PENGALAMAN KERJA / Working Experience

1) Desainer Grafis di Mitra Jaya Solusindo, Medan [2016]

2) Asisten Laboratorium di Ilmu Komputer Laboratory Center (IKLC) Fasilkom-TI USU, Medan [2013-2016]

3) Volunteer Desain di WWF Indonesia [2016] VII. PENGALAMAN BERBICARA / Speaking Experience

1) Pemateri Animasi di Al-Khuwarizmi Academy Al-Khuwarizmi USU, Universitas Sumatera Utara [2015]

2) Pemateri Animasi di IMILKOM Goes to School, Universitas Sumatera Utara [2015]

3) Instruktur di Training Islam Ceria dan Kreatif (TRICK), UKMI Al-Khuwarizmi Fasilkom-TI Universitas Sumatera Utara [2014]

VIII. PELATIHAN DAN SEMINAR / Trainings & Workshop

1) Peserta Pelatihan “Builiding Strong Indonesia Digitalpreneur with Distruptive Mindset” by Indigo in DiLo, Medan [2016]

2) Peserta Seminar Bukalapak [2015]

3) Peserta Pelatihan Design Top Coder Universitas Sumatera Utara [2015]

4) Peserta Seminar dan Workshop Windows Phone Microsoft Indonesia [2014]

5) Peserta Seminar Nasional Literasi Informasi (SENARAI) Fasilkom-TI Universitas Sumatera Utara [2014]

6) Peserta Training Junior Multimedia dan Fundamental Graphical from KOMINFO [2014]

7) Peserta Workshop Desain Grafis [2013]

8) Peserta Seminar Kongres Nasional ILP2MI (Ikatan Lembaga Penalaran dan Penelitian Mahasiswa Indonesia) Universitas Sumatera Utara [2013]

9) Peserta Training Islam Ceria dan Kreatif, UKMI Al-Khuwarizmi, Medan [2013]

10) Peserta Pelatihan Dasar Organisasi IMILKOM USU [2013]

11) Peserta Pelatihan dan Kesekretariatan IMILKOM USU [2013]

12) Peserta Seminar Smartfren Library “Kulik Lebih Jauh lagi Teknologi Rev B” Universitas Sumatera Utara [2012]

13) Peserta Seminar One Day Building Line Follower Robot Universitas Sumatera Utara [2012]

14) Peserta Training Ramadhan UKMI AlKhuwarizmi Universitas Sumatera Utara [2012]

15) Peserta Training dan Workshop Linux KSL (Kelompok Studi Linux) Universitas Sumatera Utara [2012]

16) Peserta Seminar “Perempuan dan Ruang Publik” Universitas Sumatera Utara dan Universitas Paramadina [2012]

17) Peserta Pesantren Kilat Ramadhan, SMA Swasta Eria Medan [2010;2011] XI. PENGALAMAN ORGANISASI / Organizational Experiences

1) Sekretaris Relawan TIK (Indonesian ICT Volunteers) Komisariat USU [2013 – Sekarang]

2) Manager Digital Marketing Communication AIESEC [2015 – 2016]

3) Sekretaris Jenderal Pemerintahan Mahasiswa (PEMA) Fasilkom-TI Universitas Sumatera Utara [2015 – 2016]

4) Bendahara Smart Generation Community (SGC) Universitas Sumatera Utara [2014 – 2015]

5) Sekretaris Komisi Pemilihan Umum (KPU) Universitas Sumatera Utara [2014-2015]

6) Sekretaris Bidang Syiar UKMI Al-Khuwarizmi Universitas Sumatera Utara [2014-2015]

7) Divisi Blogger Sahabat Beasiswa Untuk Negeri [2013-2014]

8) Bendahara Kelompok Studi Linux (KSL) Universitas Sumatera Utara [2012 – 2013]

9) Koordinator Bidang Budi Pekerti Siswa OSIS SMA Eria Medan [2011-2012]


(24)

1) Anggota Publikasi dan Dokumentasi di Penyambutan Mahasiswa Baru Ilmu Komputer Universitas Sumatera Utara [2014]

2) Sekretaris di Science Competition se-Sumatera Utara [2014]

3) Anggota Publikasi dan Dokumentasi Pekan Olahraga dan Seni (PORSENI) IMILKOM USU [2014]

4) Bendahara di Pesta Akbar Mentoring Universitas Sumatera Utara [2014]

5) Wakil Sekretaris ARTechno Universitas Sumatera Utara [2014]

6) Sekretaris Training Islam Ceria dan Kreatif (TRICK) IX UKMI Al Khuwarizmi Universitas Sumatera Utara [2013]

7) Tim Kreatif di Dakwah Expo 6 Universitas Sumatera Utara [2013]

8) Panitia Pelaksana pada Pelatihan Sistem Informasi Geografis di S1 Ilmu Komputer USU [2013]

9) Anggota Acara di Kuliah Umum Indonesia-Jepang Universitas Sumatera Utara [2013]

10) Tim Kreatif di Al Khuwarizmi Festival Universitas Sumatera Utara [2013]

11) Anggota Konsumsi di Dies Natalis S1 Ilmu Komputer ke-11 Universitas Sumatera Utara [2012]

XI. PENGABDIAN / Social Volunteer

1) Pengabdian SLB Yayasan Pembinaan Anak Cacat (YPAC) Relawan TIK Sumatera Utara [2016]

2) Pengabdian Masyarakat SMATerpadu Al-Bukhari Muslim Medan [2016]

3) Pengabdian Masyarakat SMP Negeri 1 Binjai Sumatera Utara [2016]

4) Gerakan 1001 Al Quran UKMI Ad Dakwah Universitas Sumatera Utara [2015]

5) Bakti Sosial Panti Asuhan Bani Adam UKMI Al Khuwarizmi Universitas Sumatera Utara [2014]

6) Pengabdian Masyarakat SMA Pakam dan Tanjung Morawa Sumatera Utara [2014]

7) Bakti Sosial Gunung Sinabung Relawan TIK Sumut [2014]

8) Pengabdian Masyarakat TK Uswatun Hasanah Medan Relawan TIK Sumatera Utara [2013] XI. PROJEK YANG TELAH DIKERJAKAN / Portofolio Project

1) Website “Sewa Kost” Projek Pemrograman Internet

2) IKLC Portal Projek Pemrograman Visual dengan C#

3) Animasi Company Profile UKMI Al Khuwarizmi Projek Pengajaran Berbantuan Komputer

4) Aplikasi Chef’s Key Projek Mobile Programming

5) Website “Desa Jatikusuma Namorambe” Projek Sistem Manajemen Database Lanjutan 6) Website KOM A Directory Projek Sistem Informasi

7) Interface Design Game Faster Android Projek Kinyu Dev

8) Interface Design Portal IKLC for Mobile Projek IKLC Dev XIV. LAINNYA / Others

1) Penerima Beasiswa Peningkatan Prestasi Akademik Fasilkom-TI USU [2013 – 2014]

2) Peserta Olimpiade Nasional Kimia di SMA Negeri 4 Medan [2011] (CV Updated on May, 25th, 2016)


(25)

DAFTAR PUSTAKA

Ambler, S. W. 2005. The Elements of UML™ 2.0 Style. Cambridge University Press: Cambridge.

Ariyus, D. 2008. Pengantar Ilmu Kriptografi: Teori, Analisis dan Implementasi. ANDI: Yogyakarta

Entprise, Jubilee. 2010. Step By Step Ponsel Android. PT Elex Media Komputindo: Jakarta

Fauzana, 2013. Analisis dan perancangan sistem autentikasi pengguna pada web menggunakan metode multiple-key RSA. Skripsi. Universitas Sumatera Utara. Galbraith, Steven D. 2012. Mathematics of Public Key Cryptography. Cambridge

University Press: New York.

Gaspersz, Vincent. 1997. Manajemen Kualitas: Penerapan konsep-konsep kualitas dalam manajemen bisnis total. Gramedia Pustaka Utama: Jakarta.

Harahap, A.A. 2014. Implementasi Sistem Keamanan Data Menggunakan Steganografi Teknik Pemetaan Titik Hitam dengan Pencarian Sekuensial dan Rabin Cryptosystem. Skripsi. Universitas Sumatera Utara.

Kromodimoeljo, S. 2010. Teori dan Aplikasi Kriptografi. SPK IT Consulting: Jakarta. Lipschutz, S. & Lipson, M. L. 2007. Schaum’s Outline of: Theory and problems of

discrete mathematics. McGraw-Hill: New York.

Mollin, Richard. A. 2007.An Introduction to Cryptography 2nd Ed. Taylor & Francis Group, LLC. United State of America.

Munir, R. 2006. Kriptografi. Informatika: Bandung.

Nasution, R. N. N. 2015. Implementasi Algoritma Hill Cipher dan RSA pada Enkripsi Hybrid Pesan SMS di Android. Skripsi. Medan. Universitas Sumatera Utara. Paar, C. & Pelzl, J. 2010. Understanding Cryptography. Springer-Verlag: Berlin. Rosen, K. H. 2012. Discrete Mathematics and Its Applications. 7th Edition. McGraw-

Hill: New York.


(26)

Sadikin, R. 2012. Kriptografi untuk Keamanan Jaringan dan Implementasinya dalam Bahasa Java. ANDI: Yogyakarta.

Schneier, B. 1996. Applied Cryptography: Protocols, Algorithms and Source Code in C. 2nd Edition. John Wiley & Sons, Inc: New Jersey

Simamora, Jonathan. 2015. Implementasi Algoritma One Time Pad dan Algoritma Hill Cipher pada SMS. Skripsi. Medan. Universitas Sumatera Utara.

Stallings, W. 2011. Cryptography and Network Security: Principles and practice. 5th Edition. Pearson Education, Inc.: USA.

Verma. A & Gakhar.A. 2015. Design and Development of Algorithm Using Chemical Cryptography. Journal of Computer Science 643-648. (Online) www.sciencedirect.com/science/article/pii/S1877050915021948 (Diakses 13 Maret 2016)

Wandani, H. 2012. Implementasi sistem keamanan data dengan menggunakan teknik steganografi end of file (EOF) dan Rabin public key cryptosystem. Skripsi. Universitas Sumatera Utara.

Zarlis, M. & Handrizal. 2008. Algoritma dan Pemrograman: Teori dan praktik dalam pascal. Edisi Kedua. USU Press: Medan.


(27)

BAB 3

ANALISIS DAN PERANCANGAN SISTEM

3.1. Analisis Sistem

Analisis sistem merupakan salah satu tahapan dalam perancangan sebuah sistem. Analisis sistem bertujuan untuk memahami dan mendeskripsikan dengan jelas apa yang harus dilakukan dalam proses perancangan sebuah sistem. Secara umum analisis sistem terbagi atas analisis masalah, analisis kebutuhan dan analisis proses. Analisis masalah bertujuan untuk memahami kelayakan masalah. Analisis kebutuhan dilakukan untuk menjelaskan fungsi-fungsi yang ditawarkan dan yang mampu dikerjakan sistem. Sedangkan analisis proses untuk memodelkan tingkah laku sistem.

3.1.1. Analisis masalah

Masalah yang akan diselesaikan dengan menggunakan sistem ini adalah bagaimana mengamankan pesan teks dan mengamankan kunci pesan tersebut dari pihak-pihak yang tidak berwenang (pihak ketiga). Masalah utama didalam penelitian ini adalah bagaimana menerapkan algortima Hill Cipher dan Algoritma Rabin Public Key dalam pengamanan data teks berbasis Android.

Masalah pada penelitian ini diidentifikasikan dengan menggunakan diagram Ishikawa. Diagram Ishikawa atau yang sering dikenal dengan Cause and Effect Diagram adalah diagram yang digunakan untuk memahami dan mengidentifikasi serta menggambarkan beberapa masalah yang terjadi pada sistem dan akibat yang ditimbulkan oleh masalah.

Permasalahan pada penelitian ini secara umum dapat ditunjukkan pada diagram Ishikawa yaitu pada Gambar 3.1.


(28)

Gambar 3.1 Diagram Ishikawa Analisis Masalah

Diagram Ishikawa diusulkan pertama kali oleh Kaoru Ishikawa dari Jepang. Diagram ini merupakan pendekatan terstruktur yang memungkinkan dilakukan suatu analisis lebih terperinci dalam menemukan penyebab-penyebab suatu masalah, ketidaksesuaian dan kesenjangan yang ada. Selanjutnya, diagram ini dapat digunakan dalam diskusi dengan brainstorming untuk mengidentifikasi mengapa suatu masalah terjadi (Gaspersz, 1997).

Pada Gambar 3.1, dapat disimpulkan bahwa permasalahannya adalah muncul rasa curiga atau ingin tahu dari pihak ketiga terhadap kerahasian sebuah pesan yang disebabkan faktor perubahan ciphertext dan penggunaan menggunakan satu kunci yang tidak aman dalam mengirimkan pesan kepada orang lain.

Solusi yang dapat ditawarkan adalah dengan mengunci ciphertext dengan algortima Hill Cipher serta mengunci cipherkey dengan algoritma Rabin Public Key dalam pengiriman pesan.

3.1.2. Analisis kebutuhan

Didalam analisis kebutuhan ini terdapat dua kebutuhan yaitu kebutuhan fungsional dan kebutuhan non fungsional.

3.1.2.1. Kebutuhan fungsional

Kebutuhan fungsional adalah menjelaskan proses-proses aktifitas yang dapat dilakukan oleh sistem dalam melakukan pelayanan yang dilakukan sistem dan kebutuhan yang harus dipenuhi oleh sistem, yaitu:


(29)

30

1. Fungsi Pembangkit Kunci

Untuk melakukan enkripsi dan dekripsi sistem membutuhkan pembangkit kunci untuk memudahkan pengguna dalam menentukan kunci yang akan digunakan. Pada sistem, kunci yang dibangkitkan dimasukkan langsung oleh pengguna. 2. Fungsi Enkripsi

Fungsi enkripsi pada sistem digunakan untuk membuat plaintext menjadi ciphertext. Sebelum melakukan enkripsi, sistem terlebih dahulu melakukan enkripsi kunci.

3. Fungsi Dekripsi

Fungsi dekripsi pada sistem digunakan untuk membuat ciphertext menjadi plaintext. Namun, sebelum melakukan dekripsi pesan, pengguna sudah memiliki kunci yang sesuai sehingga pengguna dapat melakukan dekripsi ciphertext menjadi plaintext.

3.1.2.2. Kebutuhan nonfungsional

Kebutuhan non-fungsional adalah mendeskripsikan fitur, karakteristik dan batasan lainnya seperti performa, penggunaan, model penyimpanan data, dokumentasi, kontrol, dan ekonomi. Terdapat beberapa hal yang menjadi syarat kebutuhan non-fungsional antara lain:

1. Performa

Sistem yang dibangun dapat menampilkan dan menyimpan hasil dari fungsi kriptografi yang dilakukan oleh sistem.

2. Mudah dipelajari dan digunakan

Sistem yang dibangun memiliki tampilan yang user friendly dan tampilan yang sederhana.

3. Dokumentasi

Sistem yang dibangun memiliki panduan penggunaan. 4. Manajemen Kualitas

Sistem yang dibangun akan memiliki kualitas yang baik yaitu pada proses kriptografi cepat.

5. Kontrol

Sistem yang dibangun akan menampilkan pesan error untuk setiap input yang tidak sesuai.


(30)

Dalam hal ini sistem mengamankan kunci yang digunakan.

3.1.3. Analisis proses

Pada penelitian ini sistem yang dibangun menggunakan algoritma Hill Cipher untuk melakukan proses enkripsi dan dekripsi pesan dan Rabin Public Key dalam melakukan proses enkripsi dan dekripsi kunci pesan.

Pada awalnya, pengirim mengirim pesan lalu dan setelah itu dienkripsi oleh algortima Hill Cipher. Setelah pesan dienkripsi, pengirim memasukkan kunci Hill, kunci P dan Q dimana kunci P dan Q merupakan bilangan prima dan dienkripsi menggunakan algoritma Rabin. Pencarian greatest common divisor menggunakan algoritma extended Euclidean. Untuk membangkitkan kunci pada algoritma Rabin Cryptosystem, digunakan algoritma Fermat untuk menemukan bilangan prima atau menentukan keprimaan suatu bilangan. Setelah semua proses dilakukan, pesan akan dikirim kepada penerima. Proses selanjutnya adalah penerima menerima pesan yang telah dienkripsi oleh pengirim. Setelah pesan masuk, penerima memasukkan kunci P dan Q untuk dekripsi kunci Hill yang telah diinputkan pengirim. Setelah kunci didekripsi, maka pesan dapat didekripsi dan pesan asli dapat diketahui oleh penerima.

3.2. Pemodelan (UML)

Unified Modeling Language (UML) digunakan sebagai bahasa spesifikasi standar suatu model yang berfungsi untuk membantu merancang sebuah sistem. Pemodelan sistem dilakukan untuk menunjukkan dan mendeskripsikan gambaran dari sistem yang akan dibangun. Pada penelitian ini dilakukan pemodelan dengan menggunakan UML untuk mendesain serta merancang sistem. Model UML yang digunakan dalam penelitian ini antara lain adalah usecase diagram, activity diagram serta sequence diagram.

3.2.1. Use-Case Diagram

Diagram usecase digunakan untuk menggambarkan hubungan antara aktor dengan fungsi atau layanan yang disediakan oleh sistem (Ambler, 2005).

Aktor yang terlibat atau mempunyai interaksi dengan sistem pada penelitian ini adalah pengirim dan penerima. Hubungan antara aktor dengan fungsi (usecase) yang


(31)

32

tersedia pada sistem dihubungkan oleh garis lurus menyatakan bahwa aktor tersebut melakukan inisiasi atau mengajukan permintaan terhadap suatu usecase. Hubungan yang menyatakan suatu usecase dapat dilaksanakan dengan syarat yaitu kelakuan yang harus terpenuhi (include) digambarkan oleh garis putus-putus dengan tanda panah terbuka. Pada hubungan include, yang menjadi syarat dari suatu usecase adalah usecase pada pangkal tanda panah. Diagram usecase pada penelitian ini dapat dilihat pada Gambar 3.2.

Gambar 3.2 Diagram Use-Case

Pada Gambar 3.2 terdapat actor yang mempunyai peran yaitu sebagai pengirim atau penerima. Actor (pengirim pesan) mengenkripsikan pesan terlebih dahulu dengan algoritma Hill Cipher setelah plaintext dienkripsikan menjadi ciphertext lalu kunci dari Hill Cipher dienkripsikan dengan algoritma Rabin. Kemudian Actror (penerima) membutuhkan kunci Rabin untuk mendeksripsikan Ciphertext Hill dan didekripsi lagi dengan kunci Hill Cipher menjadi Plaintext kunci Hill Cipher yang digunakan untuk mendeksripsikan pesan yang sebenarnya.

Berikut ini merupakan tabel narrative usecase yang dapat dilihat pada Tabel 3.1 Tabel 3.1 Narrative Use-Case Enkripsi Pesan

Use-case Name Enkripsi Pesan Design Scope Sistem (black box)

Goal Level User-goal

Stakeholder and Interest

Pengirim (Pengguna): dapat mengenkripsikan pesan dan kunci pesan untuk menjaga keamanan pesan.


(32)

Pengirim (Pengguna) menginputkan pesan dan kunci.

Minimal Guarantee Sistem akan memberikan pesan error ketika enkripsi pesan gagal.

Success Guarantee Sistem akan memberikan pesan enkripsi telah sukses. Trigger Pengguna menekan tombol enkripsi pesan.

Main Success Scenario

1. Pengirim menginputkan plaintext yang akan dienkripsi 2. Pengirim melakukan proses enkripsi kunci

3. Pengirim melakukan proses enkripsi pesan dengan Hill Cipher

4. Sistem akan melakukan enkripsi kunci dengan Rabin Public Key

5. Sistem akan melakukan enkripsi pesan.

6. Sistem akan memberikan pesan bahwa enkripsi pesan dan kunci pesan telah sukses.

Extensions 1. Kunci enkripsi tidak lengkap atau kosong.

a. Sistem akan memberikan pesan kepada pengirim untuk dilakukan cek ulang kembali input-an yang telah diberikan.

Berikut ini merupakan tabel narrative usecase yang dapat dilihat pada Tabel 3.2 yang menjelaskan narrative usecase dekripsi pesan.

Tabel 3.2 Narrative Use-Case Dekripsi Pesan Use-case Name Dekripsi Pesan

Design Scope Sistem (black box)

Goal Level User-goal

Stakeholder and Interest

Penerima dapat mendekripsikan kembali cipherkey dan ciphertext ke dalam bentuk plaintext.

Precondition Penerima menerima ciphertext

Minimal Guarantee Sistem akan memberikan pesan error ketika dekripsi pesan gagal.

Success Guarantee

Sistem akan memberikan pesan dekripsi telah sukses. Trigger Pengguna dapat menekan tombol Dekripsi Pesan. Main Succes

Scenario 1. Penerima memiliki kunci kunci privat P dan Q

2. Penerima mengdekripsikan kunci Pesan dengan Kunci Rabin.

3. Penerima mengdekripsikan ciphertext menjadi plaintext.

4. Sistem akan melakukan dekripsi pesan dengan Hill Cipher.


(33)

34

5. Sistem akan memberikan pesan bahwa dekripsi telah sukses.

6. Sistem akan menampilkan plaintext 3.2.2. Sequence Diagram

Diagram sequence menggambarkan interaksi antar objek dan menggambarkan komunikasi antar objek-objek tersebut (Ambler, 2005). Berikut Sequence Diagram dari sistem yang dirancang dapat dilihat pada gambar 3.3 dan gambar 3.4.

Gambar 3.3 Diagram Sequence untuk Enkripsi

Gambar 3.4 Diagram Sequence untuk Dekripsi


(34)

Diagram aktivitas (activity diagram) menggambarkan proses bisnis atau urutan aktivitas dalam sebuah sistem. Activity Diagram juga bertujuan untuk membantu bagaimana memahami proses dan menggambarkan setiap interaksi yang ada antara beberapa usecase yang digunakan (Ambler, 2005). Activity Diagram dari sistem dapat dilihat pada Gambar 3.5 dan Gambar 3.6.


(35)

36

Gambar 3.6. Activity Diagram Dekripsi


(36)

Flowchart atau diagram alir merupakan gambar atau bagan yang memperlihatkan urutan dan hubungan antar proses dengan pernyataannya (Zarlis & Handrizal, 2008). Berikut adalah flowchart sistem yang dapat dilihat pada Gambar 3.7.

Gambar 3.7 Flowchart Sistem

New Message

Inbox

Sent

Info

Encrypt Message

Select Message

Select Message

Show info aplication

Cypertext Message

Decrypt Message

Decrypt Message Start

End

Send Message

Message

Message

Information Y

Y

Y

Y T

T

T


(37)

38

Dari Gamber 3.7, dapat dilihat bahwa terdapat empat proses. Proses pertama yaitu New Message, dimana ketika membuat pesan baru hal yang dilakukan adalah mengenkripsi pesan, lalu pesan dienkripsi dan selanjutnya pesan dikirim. Untuk proses Kedua dan Ketiga hampir sama, yaitu pada Inbox dan Sent hal yang dilakukan adalah mendekripsi pesan, lalu pesan didekripsi, dan akan terlihat pesan aslinya. Perbedaannya adalah untuk Inbox dilakukan oleh penerima pesan, sedangkan untuk Sent dilakukan oleh pengirim untuk melihat apakah pesan tersebut berhasil dikirim dan didekripsi oleh penerima.

3.3.1. Flowchart Enkripsi Pesan dengan Algoritma Hill Cipher

Berikut adalah flowchart enkripsi pesan dari sistem yang dibangun dapat dilihat pada Gambar 3.8

Gambar 3.8 Flowchart Enkripsi Pesan dengan Algoritma Hill Cipher Hill Key, SMS

Encrypt SMS Hill Key

Ciphertext Start

End


(38)

Berikut adalah flowchart enkripsi kunci pesan dari sistem yang dibangun dapat dilihat pada Gambar 3.9

Gambar 3.9 Flowchart Enkripsi Kunci dengan Algoritma Rabin Public Key Hill Key, Rabin Key

Encrypt Hill Key with Rabin Key

Cipherkey

Start


(39)

40

3.3.3. Flowchart Dekripsi Pesan dan Kunci Pesan

Berikut adalah flowchart dekripsi pesan dari sistem yang dibangun dapat dilihat pada gambar 3.10

Gambar 3.10 Flowchart dekripsi pesan dan Kunci Pesan

3.4. Perancangan Antarmuka

Perancangan antarmuka adalah desain awal dari tampilan sistem yang akan sistem dibangun. Antarmuka harus dirancang dengan memperhatikan faktor pengguna sehingga sistem yang dibangun dapat memberikan kenyamanan dan kemudahan untuk digunakan oleh pengguna. Sistem yang dibangun terdiri dari form utama atau home, pengirim, dan penerima.

Plaintext Decrypt Cipher SMS

With Hill Key

Ciphertext, Ciphertext Rabin Key, Hill Key

Decrypt Cipher Hill Key

Hill Key Start

End


(40)

Form Utama adalah tampilan awal dari sistem ini dijalankan. Gambar 3.11 menunjukkan tampilan sementara dari form utama yaitu home.

Gambar 3.11 Rancangan Form Utama Keterangan Gambar 3.11:

Tabel 3.3 Tabel keterangan Gambar 3.11

No. Nama Keterangan

1. Button Create Message Tombol untuk membuat pesan baru 2. Button Inbox Tombol untuk melihat pesan masuk

3. Button Sent Tombol untuk melihat pesan yang telah dikirim 4. Button Help Tombol untuk melihat cara menggunakan aplikasi 5. Button About Tombol untuk melihat pembuat aplikasi

6. Button Exit Tombol untuk keluar dari aplikasi

3.4.2. Form Pengirim

Pada halaman form pengirim ini, pengguna dapat melakukan proses enkripsi pesan dan kunci pesan yang akan dikirim ke penerima. Gambar 3.12 menunjukkan tampilan sementara dari form pengirim.


(41)

42

Gambar 3.12 Rancangan Form Pengirim Keterangan Gambar 3.12 :

Tabel 3.4 Tabel keterangan Gambar 3.12

No. Nama Keterangan

1. Edit teks Nomor Handphone

Memasukkan nomor tujuan yang akan dikirim pesan.

2. Button Search Untuk mencari nomor di dalam kontak handphone 3. Edit teks Insert

Message

Untuk memasukkan pesan asli atau plaintext yang akan dienkripsi

4. Edit teks Kunci Hill Untuk memasukkan kunci Hill yang akan dienkripsi

5. Edit teks P Untuk memasukkan nilai P yang merupakan bilangan prima dalam proses enkripsi kunci 6. Edit teks Q Untuk memasukkan nilai Q yang merupakan

bilangan prima dalam proses enkripsi kunci 7. Button Encrypt Key Untuk proses enkripsi kunci

8. Edit teks Hasil Enkripsi Untuk melihat hasil enkripsi kunci

9. Edit teks Public Key Untuk melihat kunci publik dari hasil enkripsi kunci

10. Edit teks K Value Untuk melihat nilai K dari hasil enkripsi kunci 11. Button Encrypt

Message Untuk proses enkripsi pesan

12. Edit teks Ciphertext Untuk melihat ciphertext hasil enkripsi pesan Keterangan:

1) Pengguna dapat menginputkan nomor atau memilih contact yang sudah tersimpan maupun belum tersimpan di smartphone.


(42)

3) Pengguna mengisi kunci Hill Cipher untuk mengenkripsi pesan dan selanjutnya menekan tombol enkripsi pesan,.

4) Pengguna mengisi nilai P dan Q untuk mengenkripsi kunci Rabin

5) Proses selanjutnya akan muncul kunci Rabin, kunci publik, dan nilai K yang dienkripsi dan setelah itu muncul ciphertext ketika menekan tombol enkripsi pesan

6) Proses selanjutnya tekan tombol send untuk mengirim pesan ke nomor tujuan. 3.4.3 Form Penerima

Form Penerima adalah halaman dimana pengguna dapat melakukan proses dekripsi pesan dan dekripsi kunci pesan dari si pengirim. Gambar 3.13 menunjukkan tampilan sementara dari form penerima.

Gambar 3.13 Rancangan Form Penerima Keterangan Gambar 3.13 :

Tabel 3.5 Tabel keterangan Gambar 3.13

No. Nama Keterangan

1. Edit teks Ciphertext Untuk melihat ciphertext yang dikirim dari pengirim

2. Edit teks K Value Untuk melihat nilai K

3. Edit teks P Untuk memasukkan nilai P yang telah disepakati 4. Edit teks Q Untuk memasukkan nilai Q yang telah disepakati 5. Button Decrypt Key Untuk proses dekripsi kunci


(43)

44

6. Edit teks Ciphertext

Hill Untuk melihat hasil enkripsi ciphertext 7. Edit teks Kunci Hill Untuk melihat kunci dari hasil dekripsi kunci 8. Button Decrypt

Message Untuk proses dekripsi pesan

9. Edit teks Ciphertext Untuk melihat plaintext hasil dekripsi pesan Keterangan :

1) Nomor pengirim, Ciphertext, Cipherkey, dan Kunci K adalah pesan masuk yang sudah di enkripsi oleh pengirim.

2) Sebelumnya pengguna harus memiliki nilai P dan nilai Q. Dalam hal ini sudah disepakati oleh pengirim dan penerima untuk mengdekripsikan Kunci Hill. 3) Setelah terenkripsi kunci, penerima menekan tombol dekripsi pesan untuk

mendapatkan plaintext.

3.4.5. Form Bantuan

Form Bantuan adalah halaman untuk mengetahui informasi dari sistem yang dibuat. Gambar 3.14 menunjukkan tampilan sementara dari form bantuan.

Gambar 3.14. Rancangan Form Bantuan


(44)

BAB 4

IMPLEMENTASI DAN PENGUJIAN

4.1. Implementasi

Pada tahapan ini akan dibahas mengenai implementasi sistem, dimana implementasi merupakan penerapan dari apa yang telah direncanakan.

4.1.1. Tampilan splash screen

Tampilan Splash Screen merupakan antarmuka awal saat aplikasi dijalankan. Pada halaman ini merupakan desain pengenalan nama aplikasi yang dapat dilihat pada Gambar 4.1.


(45)

46

4.1.2. Tampilan home

Tampilan Home merupakan menu untuk aktivitas yang akan dilakukan dalam aplikasi ini. Pada form ini terdapat buat pesan, pesan masuk, pesan keluar, bantuan, tentang dan keluar. Form Main Menu akan ditampilkan pada Gambar 4.2.

Gambar 4.2. Home

4.1.3. Tampilan halaman enkripsi

Tampilan halaman enkripsi pesan merupakan form yang berisikan implementasi dari proses enkripsi dengan menggunakan Algortima Hill Cipher dan Algoritma Rabin Public Key. Form ini berisikan beberapa field input data dan field output data. Data yang harus dimasukkan pada form ini adalah plaintext, kunci hill, P, dan Q. Data yang dihasilkan dari form ini adalah ciphertext, cipherkey, public key, dan nilai K. Tampilan form encryption akan ditunjukkan pada Gambar 4.3.


(46)

Gambar 4.3. Halaman Enkripsi 4.1.4. Tampilan halaman dekripsi

Tampilan halaman dekripsi merupakan form yang berisikan implementasi dari proses dekripsi dengan mengunakan Algortima Hill Cipher dan Rabin Public Key. Form ini berisikan beberapa field input data dan field output data. Data yang harus dimasukkan pada form ini adalah cipherkey, nilai P, Q, dan nilai K. Data yang dihasilkan dari form ini adalah plaintext dan kunci Hill. Untuk lebih lengkapnya tampilan form decryption ditunjukkan pada Gambar 4.4.


(47)

48

4.1.5. Tampilan halaman inbox

Tampilan halaman inbox merupakan tampilan dari pesan masuk yang ada dan otomatis dari smartphone. Tampilan halaman inbox dapat dilihat pada Gambar 4.5.

Gambar 4.5. Halaman Inbox

4.1.6. Tampilan halaman sent

Tampilan halaman sent merupakan tampilan dari pesan keluar yang terkirim dan otomatis dari smartphone. Tampilan halaman inbox dapat dilihat pada Gambar 4.6.

Gambar 4.6. Halaman Sent


(48)

Gambar 4.7. berikut ini adalah tampilan dari halaman tentang dari aplikasi yang berisi identitas singkat penulis, logo universitas, program studi dan fakultas, dan judul skripsi.

Gambar 4.7. Halaman Tentang

4.1.8. Tampilan halaman bantuan

Tampilan halaman bantuan merupakan informasi tentang aplikasi ini. Tampilan halaman bantuan dapat dilihat pada Gambar 4.8. berikut ini.


(49)

50

4.2. Pengujian Sistem

Pengujian dilakukan terhadap sistem untuk membuktikan bahwa sistem yang telah dibangun berjalan dengan baik serta sesuai dengan analisis dan perancangan sistem yang telah dibuat sebelumnya.

Adapun spesifikasi perangkat keras yang digunakan untuk melakukan pengujian sistem adalah sebagai berikut.

1. Prosesor Intel® Core™ i3-2430M CPU @ 2.40Ghz (4CPUs), 2.4GHz. 2. Memori (RAM) 4096MB DDR3

3. Resolusi Display Monitor 1355 × 768

Spesifikasi perangkat lunak yang digunakan untuk melakukan pengujian sistem adalah sebagai berikut.

1. Sistem Operasi Windows 7 Ultimate 64-bit 2. Android Studio

3. Smartphone Android 4. Adb Installer

Pada tahap ini, penulis melakukan pengujian dengan cara membandingkan hasil dari proses enkripsi dan dekripsi yang dihasilkan oleh sistem yang dibangun terhadap hasil proses enkripsi dan dekripsi yang diperoleh melalui perhitungan manual.

4.2.1. Pengujian hasil enkripsi dan dekripsi 4.2.1.1. Pengujian hasil enkripsi dan dekripsi sistem

Pengujian enkripsi menggunakan sistem yang dibangun terhadap contoh tersebut akan menghasilkan ciphertext, cipherkey. Pada tahap ini, penulis melakukan pengujian form enkripsi dengan cara menginputkan contoh sebagai berikut:

1. Pesan yang akan dienkripsi adalah Indonesia

2. Kunci yang digunakan pada Hill Cipher adalah ilkom2012.

Setelah contoh tersebut diinputkan ke dalam form enkripsi kemudian menekan tombol Enkripsi kunci dan Enkripsi Pesan maka akan dihasilkan output pada Gambar 4.9.


(50)

Gambar 4.9. Proses enkripsi dan hasilnya

Tabel 4.1 Keterangan Gambar Proses Enkripsi dan Hasilnya

Nomor Keterangan

1 Masukkan nomor tujuan untuk mengirim ciphertext

2 Klik tombol search untuk mengambil nomor dari kontak smartphone 3 Masukkan plaintext yang akan dikirim

4 Masukkan kunci yang akan dienkripsi 5 Masukkan nilai P untuk mengenkripsi kunci 6 Masukkan nilai Q untuk mengenkripsi kunci

7 Klik tombol enkripsi kunci untuk proses enkripsi kunci 8 Hasil dari enkripsi kunci yang akan dikirim

9 Klik tombol enkripsi pesan untuk proses enkripsi pesan 10 Nilai public key yang diperoleh ketika meng-enkripsi kunci 11 Nilai K yang diperoleh ketika meng-enkripsi kunci

12 Hasil dari enkripsi pesan


(51)

52

Gambar 4.10. Proses dekripsi dan hasilnya

Tabel 4.2 Keterangan Gambar Proses Dekripsi dan Hasilnya

Nomor Keterangan

1 Informasi kontak pengirim 2 Informasi waktu pengiriman

3 Ciphertext yang masuk setelah dikirim oleh pengirim 4 Cipherkey yang masuk setelah dikirim oleh pengirim 5 Nilai K yang masuk setelah dikirim oleh pengirim

6 Masukkan nilai P untuk mengdekripsi kunci dalam hal ini sesuai kesepakatan pengirim dan penerima

7 Masukkan nilai Q untuk mengdekripsi kunci sesuai kesepakatan pengirim dan penerima

8 Klik tombol Decrypt Key untuk mendekripsi kunci 9 Hasil dari dekripsi kunci

10 Klik tombol Decrypt Key untuk mendekripsi pesan 11 Hasil dari dekripsi pesan

12 Kilik tombol Forward untuk meneruskan pesan 13 Klik tombol Delete Message untuk menghapus pesan

4.2.1.2. Pengujian hasil enkripsi dan dekripsi dengan perhitungan manual a. Enkripsi Manual dengan Algoritma Hill Cipher

Sebelum memasuki langkah-langkah proses enkripsi, tabel yang digunakan pada penelitian ini adalah tabel Encoding Android yang dapat dilihat pada Tabel 4.3 berikut.


(1)

vii

IMPLEMENTATION OF HILL CIPHER AND RABIN PUBLIC KEY FOR SENDING SHORT MESSAGE SERVICE (SMS)

ABSTRACT

Each incoming SMS on the device is a privacy person. Security and confidentiality message is one important aspect. To keep a secret SMS needed a security system like security application from a message. There are several ways and techniques that are used to maintain the confidentiality of message, namely Cryptography where the message disguised as a password. In this research, the author makes implementation of a combination between symmetric and asymmetric algorithms based on Android system. Symmetric algorithm used Hill Cipher algorithms to encrypt and decrypt messages and asymmetric algorithms used Rabin Public Key algorithms to encrypt and decrypt the symmetric key algorithm. Plaintext lenght after the encryption process will same after decryption process. The time needed for encryption tend to be short than the time required for the decryption process, this is due to the process of decryption Rabin Public Key algorithm has four keys that must be solved to be the real key but the time needed for encryption and decryption process still relatively very short.


(2)

DAFTAR ISI

Halaman

Persetujuan ii

Pernyataan iii

Ucapan Terima Kasih iv

Abstrak vi

Abstract vii

Daftar Isi viii

Daftar Tabel x

Daftar Gambar xi

Daftar Lampiran xii

Bab 1 Pendahuluan

1.1. Latar Belakang 1

1.2. Rumusan Masalah 2

1.3. Batasan Masalah 2

1.4. Tujuan Penelitian 3

1.5. Manfaat Penelitian 3

1.6. Metodologi Penelitian 3

1.7. Sistematika Penulisan 4

Bab 2 Landasan Teori

2.1. Kriptografi 6

2.1.1. Terminologi 6

2.1.2. Tujuan kriptografi 7

2.2. Sistem Kriptografi 7

2.3. Kriptografi Berdasarkan Kunci yang Dipakai 7

2.3.1. Sistem kriptografi simetri 8

2.3.2. Sistem kriptografi asimetri 8

2.3.3. Fungsi Hash 11

2.4. Teori Bilangan Integer 11

2.4.1. Faktor persekutuan terbesar (greatest common divisor) 11

2.4.2. Aritmatika Modulo 11

2.4.3. Algoritma Extended Euclidean 12

2.4.4. Chinese Remainder Theorem 12


(3)

ix

2.7. Android 26

2.8. Penelitian yang relevan 27

Bab 3 Analisis dan Perancangan Sistem

3.1. Analisis Sistem 28

3.1.1. Analisis masalah 28

3.1.2. Analisis kebutuhan 29

3.1.3. Analisis proses 31

3.2. Pemodelan (UML) 31

3.2.1. Use-case Diagram 31

3.2.2. Sequence diagram 34

3.2.3. Activity diagram 35

3.3. Flowchart sistem 37

3.3.1. Flowchart enkripsi Hill Cipher 38

3.3.2. Flowchart enkripsi Rabin Public Key 39 3.3.2. Flowchart dekripsi pesan dan kunci pesan 40

3.4. Perancangan Antarmuka 39

3.4.1. Form utama 41

3.4.2. Form pengirim 41

3.4.3. Form penerima 43

3.4.4. Form bantuan 44

Bab 4 Implementasi dan Pengujian

4.1. Implementasi 45

4.1.1. Tampilan splash screen 45

4.1.2. Tampilan home 46

4.1.3. Tampilan antarmuka halaman enkripsi 47 4.1.4. Tampilan antarmuka halaman dekripsi 47

4.1.5. Tampilan antarmuka halaman inbox 48

4.1.6. Tampilan antarmuka halaman sent 48

4.1.4. Tampilan antarmuka halaman tentang 49 4.1.5. Tampilan antarmuka halaman bantuan 49

4.2. Pengujian Sistem 50

4.2.1. Pengujian hasil enkripsi dan dekripsi 50 4.2.2. Pengujian lama waktu enkripsi dan dekripsi 64

Bab 5 Kesimpulan dan Saran 67

5.1. Kesimpulan 67

5.2. Saran 67


(4)

DAFTAR TABEL

Halaman

Tabel 2.1. Transformasi Alphanumerik 18

Tabel 2.2. Enkripsi Hill Cipher 19

Tabel 2.3. Mencari Adjoint dari Matriks K 20

Tabel 2.4. Proses Determinan Matriks K 21

Tabel 2.5. Proses Pembulatan 22

Tabel 2.6. Proses Saling Invers 22

Tabel 2.7. Tabel Ciphertext 22

Tabel 2.8. Proses Dekripsi Hill Cipher 23

Tabel 3.1. Narrative Use-Case Enkripsi Pesan 32

Tabel 3.2. Narrative Use-Case Dekripsi Pesan 33

Tabel 3.3. Tabel Keterangan Gambar 3.11 40

Tabel 3.4. Tabel Keterangan Gambar 3.12 41

Tabel 3.5. Tabel Keterangan Gambar 3.13 42

Tabel 4.1. Keterangan Gambar Proses Enkripsi dan Hasilnya 50 Tabel 4.2. Keterangan Gambar Proses Dekripsi dan Hasilnya 51

Tabel 4.3. Tabel Encoding Android 52

Tabel 4.4. Proses Enkripsi Hill Cipher 52

Tabel 4.5. Tabel Hasil Enkripsi Hill Cipher 53

Tabel 4.6. Hasil Konversi m menjadi Tabel Encoding, Biner, dan Desimal 53 Tabel 4.7. Penyelesaian Extended Euclidean pada Dekripsi 55 Tabel 4.8. Tabel Hasil Konversi dan Penentuan Plaintext 61

Tabel 4.9. Hasil Konversi Plaintext 62

Tabel 4.10. Hasil Pengujian Enkripsi dengan Variasi Panjang Plaintext 63 Tabel 4.11. Hasil Pengujian Dekripsi dengan Variasi Panjang Ciphertext 64 Tabel 4.12. Perbandingan Waktu Enkripsi dan Dekripsi 64


(5)

xi

DAFTAR GAMBAR

Halaman

Gambar 2.1. Skema Proses Enkripsi dan Dekripsi 6

Gambar 2.2. Skema Kriptografi Simetris 8

Gambar 2.3. Skema Kriptografi Asimetris 9

Gambar 2.4. Skema Kriptografi Asimetri Nirkunci Publik 10

Gambar 2.5. Ilustrasi Enkripsi Hill Cipher 18

Gambar 2.6. Ilustrasi Dekripsi Hill Cipher 20

Gambar 2.7. Logo Android 26

Gambar 3.1. Diagram Ishikawa Analisis Masalah 29

Gambar 3.2. Diagram Use-Case 32

Gambar 3.3. Diagram Sequence untuk Enkripsi 34

Gambar 3.4. Diagram Sequence untuk Dekripsi 34

Gambar 3.5. Activity Diagram Dekripsi 35

Gambar 3.6. Activity Diagram Enkripsi 36

Gambar 3.7. Flowchart Sistem 37

Gambar 3.8. Flowchart Enkripsi Pesan Algoritma Hill Cipher 38 Gambar 3.9. Flowchart Enkripsi Pesan Algoritma Rabin Public Key 39 Gambar 3.10. Flowchart Dekripsi Pesan dan Kunci Pesan 40

Gambar 3.11. Rancangan Form Utama 41

Gambar 3.12. Rancangan Form Pengirim 42

Gambar 3.13. Rancangan Form Penerima 43

Gambar 4.1. Splash Screen 44

Gambar 4.2. Home 45

Gambar 4.3. Halaman Enkripsi 46

Gambar 4.4. Halaman Dekripsi 46

Gambar 4.5. Halaman Inbox 47

Gambar 4.6. Halaman Sent 47

Gambar 4.7. Halaman Tentang 48

Gambar 4.8. Halaman Bantuan 48

Gambar 4.9. Proses Enkripsi dan Hasilnya 50

Gambar 4.10. Proses Dekripsi dan Hasilnya 51

Gambar 4.11. Grafik Pengaruh Panjang Plaintext dengan Lama Proses Enkripsi 63 Gambar 4.12. Grafik Pengaruh Panjang Ciphertext dengan Lama Proses Dekripsi 64 Gambar 4.13. Grafik Perbandingan Waktu Enkripsi dan Dekripsi 65


(6)

DAFTAR LAMPIRAN

Halaman

Lampiran 1 Listing Program A-1