Implementasi Kombinasi Algoritma Vigenere Cipher dan Myszkowski Transposition Pada Aplikasi Penyandian Pesan Berbasis Android

(1)

LISTING PROGRAM 1. MainActivity.java package com.example.ilmukomputer.mycipher; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.InputType; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TabHost; import android.widget.TextView; import android.widget.Toast;

public class MainActivity extends AppCompatActivity { @Override

protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme);

super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

TabHost tab = (TabHost) findViewById(R.id.tabHost); tab.setup();

TabHost.TabSpec spec1 = tab.newTabSpec("Pengamanan"); spec1.setIndicator("PENGAMANAN");

spec1.setContent(R.id.layout1); tab.addTab(spec1);

TabHost.TabSpec spec2 = tab.newTabSpec("Pengungkapan"); spec2.setIndicator("PENGUNGKAPAN");

spec2.setContent(R.id.layout2); tab.addTab(spec2);

for(int i=0;i<tab.getTabWidget().getChildCount();i++) {

TextView tv = (TextView)

tab.getTabWidget().getChildAt(i).findViewById(android.R.id.title); tv.setTextColor(Color.parseColor("#FFFFFF"));

tv.setTextSize(15); }

buttonClick(); pengamanan(); pengungkapan(); }

private boolean checkInput(String pesan, String key1, String key2){

int i, j;

if(pesan.length() > 0 && key1.length() >= 2 && key2.length() >= 2) {

if(pesan.length() >= key1.length() && pesan.length() >= key2.length()) {


(2)

A-2

}

for(i=0; i<key2.length(); i++){ j = (int) key2.charAt(i);

if(j < 48 || j > 57){

return false; }

} }

else{

return false; }

}

else{

return false; }

return true; }

private void pengamanan(){

final EditText et_plaintext_en = (EditText) findViewById(R.id.et_plaintext_en);

final EditText et_key1_en = (EditText) findViewById(R.id.et_key1_en);

final EditText et_key2_en = (EditText) findViewById(R.id.et_key2_en);

final TextView tv_ciphertext_en = (TextView) findViewById(R.id.tv_ciphertext_en);

ImageButton b_encrypt = (ImageButton) findViewById(R.id.b_encrypt); b_encrypt.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v) {

String plaintext = et_plaintext_en.getText().toString(); String key1 = et_key1_en.getText().toString();

String key2 = et_key2_en.getText().toString();

if (checkInput(plaintext, key1, key2)) {

String key = "", ciphertext1 = "", ciphertext2 = "";

int i, j, k, pesan, kecil = 0, tmp = 0; //enkripsi vigenere

for (i = 0; i < plaintext.length(); i++) { j = i % key1.length();

key += key1.charAt(j); }

for (i = 0; i < plaintext.length(); i++) { j = (int) plaintext.charAt(i);

k = (int) key.charAt(i);

pesan = ((j - 32) + (k - 32)) % 95; pesan += 32;

ciphertext1 += (char) pesan; }

//ciphertext2 = ciphertext1; //ciphertext1 = plaintext; //enkripsi myszkowski

int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext1.length() / kol);

char[][] matrix = new char[bar][kol];

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

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

if (tmp < ciphertext1.length()) {

matrix[i][j] = ciphertext1.charAt(tmp); tmp++;

} else {

matrix[i][j] = Character.MIN_VALUE; }

} }


(3)

break; }

}

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

if (Integer.parseInt(key2.charAt(i) + "") > tmp && Integer.parseInt(key2.charAt(i) + "") < kecil) {

kecil = Integer.parseInt(key2.charAt(i) + ""); }

}

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

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

if (Integer.parseInt(key2.charAt(j) + "") == kecil && matrix[i][j] != Character.MIN_VALUE) {

ciphertext2 += matrix[i][j]; }

} }

tmp = kecil; }

tv_ciphertext_en.setText(ciphertext2);

Toast.makeText(MainActivity.this, "Pengamanan Sukses", Toast.LENGTH_LONG).show();

}

else{

tv_ciphertext_en.setText("");

Toast.makeText(MainActivity.this, "Periksa Kembali Inputan Anda", Toast.LENGTH_LONG).show();

} } }); }

private void pengungkapan(){

final EditText et_ciphertext_de = (EditText) findViewById(R.id.et_ciphertext_de);

final EditText et_key1_de = (EditText) findViewById(R.id.et_key1_de);

final EditText et_key2_de = (EditText) findViewById(R.id.et_key2_de);

final TextView tv_plaintext_de = (TextView) findViewById(R.id.tv_plaintext_de);

ImageButton b_decrypt = (ImageButton) findViewById(R.id.b_decrypt); b_decrypt.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

String ciphertext2 = et_ciphertext_de.getText().toString(); String key1 = et_key1_de.getText().toString();

String key2 = et_key2_de.getText().toString();

if (checkInput(ciphertext2, key1, key2)) { String key="", ciphertext1="", plaintext="";

int i, j, k=0, pesan, kecil=0, tmp=-1; //dekripsi myszkowski

int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext2.length()/kol);

char[][] matrix = new char[bar][kol];

while(k < ciphertext2.length()) {

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

if(Integer.parseInt(key2.charAt(i) + "") > tmp) { kecil = Integer.parseInt(key2.charAt(i) + "");


(4)

A-4

if(Integer.parseInt(key2.charAt(j)+"") == kecil){

if(i == bar-1 && j >= kol-((bar*kol)-ciphertext2.length())){

}

else {

matrix[i][j] = ciphertext2.charAt(k); k++;

} } } }

tmp = kecil; }

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

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

if(ciphertext1.length() < ciphertext2.length()){ ciphertext1 += matrix[i][j];

} } }

//plaintext = ciphertext1; //ciphertext1 = ciphertext2; //dekripsi vigenere

for(i=0; i<ciphertext1.length(); i++){ j = i % key1.length();

key += key1.charAt(j); }

for(i=0; i<ciphertext1.length(); i++){ j = (int) ciphertext1.charAt(i); k = (int) key.charAt(i);

if(j >= k) {

pesan = ((j - 32) - (k - 32)) % 95; }

else{

pesan = ((j - 32) + 95 - (k - 32)) % 95; }

pesan += 32;

plaintext += (char) pesan; }

tv_plaintext_de.setText(plaintext);

Toast.makeText(MainActivity.this, "Pengungkapan Sukses", Toast.LENGTH_LONG).show();

}

else{

tv_plaintext_de.setText("");

Toast.makeText(MainActivity.this, "Periksa Kembali Inputan Anda", Toast.LENGTH_LONG).show();

} } }); }

private void buttonClick(){

final EditText et_plaintext_en = (EditText) findViewById(R.id.et_plaintext_en);

final EditText et_key1_en = (EditText) findViewById(R.id.et_key1_en);

final EditText et_key2_en = (EditText) findViewById(R.id.et_key2_en);

final TextView tv_ciphertext_en = (TextView) findViewById(R.id.tv_ciphertext_en);

final EditText et_ciphertext_de = (EditText) findViewById(R.id.et_ciphertext_de);

final EditText et_key1_de = (EditText) findViewById(R.id.et_key1_de);

final EditText et_key2_de = (EditText) findViewById(R.id.et_key2_de);


(5)

public void onClick(View v) { et_plaintext_en.setText(""); et_key1_en.setText(""); et_key2_en.setText(""); tv_ciphertext_en.setText("");

Toast.makeText(MainActivity.this, "Kolom Inputan Telah Direset", Toast.LENGTH_SHORT).show();

} });

final ImageButton b_clear_de = (ImageButton) findViewById(R.id.b_clear_de); b_clear_de.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v) { et_ciphertext_de.setText(""); et_key1_de.setText(""); et_key2_de.setText(""); tv_plaintext_de.setText("");

Toast.makeText(MainActivity.this, "Kolom Inputan Telah Direset", Toast.LENGTH_SHORT).show();

} });

CheckBox cb_view1_en = (CheckBox) findViewById(R.id.cb_view1_en); cb_view1_en.setOnCheckedChangeListener(new

CompoundButton.OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { et_key1_en.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); } else{ et_key1_en.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); } } });

CheckBox cb_view1_de = (CheckBox) findViewById(R.id.cb_view1_de); cb_view1_de.setOnCheckedChangeListener(new

CompoundButton.OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { et_key1_de.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); } else{ et_key1_de.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); } } });

CheckBox cb_view2_en = (CheckBox) findViewById(R.id.cb_view2_en); cb_view2_en.setOnCheckedChangeListener(new

CompoundButton.OnCheckedChangeListener() {


(6)

A-6

});

CheckBox cb_view2_de = (CheckBox) findViewById(R.id.cb_view2_de); cb_view2_de.setOnCheckedChangeListener(new

CompoundButton.OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { et_key2_de.setInputType(InputType.TYPE_CLASS_NUMBER); } else{ et_key2_de.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD); } } });

final ImageButton b_help_en = (ImageButton) findViewById(R.id.b_help_en); b_help_en.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

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

} });

final ImageButton b_help_de = (ImageButton) findViewById(R.id.b_help_de); b_help_de.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

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

} });

final ImageButton b_about_en = (ImageButton) findViewById(R.id.b_about_en); b_about_en.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

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

} });

final ImageButton b_about_de = (ImageButton) findViewById(R.id.b_about_de); b_about_de.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

Intent i = new Intent(MainActivity.this, AboutActivity.class); startActivity(i); } }); } } 2. HelpActivity.java package com.example.ilmukomputer.mycipher; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.InputType; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText;


(7)

*/

public class HelpActivity extends AppCompatActivity { @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.activity_help);

ImageButton b_back = (ImageButton) findViewById(R.id.b_back); Button b_penggunaan = (Button) findViewById(R.id.b_penggunaan); Button b_algoritma = (Button) findViewById(R.id.b_algoritma);

final TextView tv_bantuan = (TextView) findViewById(R.id.tv_bantuan); b_back.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(HelpActivity.this, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(i); }

});

b_penggunaan.setOnClickListener(new View.OnClickListener() { @Override

public void onClick(View v) {

tv_bantuan.setText("Terdiri dari proses Pengamanan dan Pengungkapan. Pada Pengamanan, tulis pesan asli yang " +

"ingin disandi pada Kolom Pesan, kunci pertama pada Kolom Kunci 1 dan kunci kedua pada Kolom Kunci 2, kemudian klik " +

"Button Proses untuk memulai Pengamanan. Hasil Pengamanan berupa pesan tersandi yang tidak dapat dibaca.\nPada " +

"Pengungkapan, tulis pesan tersandi hasil dari proses Pengamanan pada Kolom Pesan, kunci pertama pada Kolom Kunci 1 dan " +

"kunci kedua pada Kolom Kunci 2, kemudian klik Button Proses untuk memulai Pengungkapan. Hasil Pengungkapan berupa pesan " +

"asli yang dapat dibaca."); }

});

b_algoritma.setOnClickListener(new View.OnClickListener() { @Override

public void onClick(View v) {

tv_bantuan.setText("Menggunakan dua buah algoritma Kriptografi yaitu algoritma Vigenere Cipher dan Myszkowski Transposition. " +

"Pada proses Pengamanan, pesan asli dienkripsi menggunakan algoritma Vigenere Cipher, kemudian hasilnya dienkripsi " +

"lagi menggunakan algoritma Myszkowski Transposition menjadi pesan tersandi. Sedangkan pada proses Pengungkapan, " +

"pesan tersandi didekripsi menggunakan algoritma Myszkowski transposition, kemudian hasilnya didekripsi lagi menggunakan " +

"algoritma Vigenere Cipher menjadi pesan asli."); }

});

ImageButton encrypt = (ImageButton) findViewById(R.id.b_encrypt); encrypt.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

tv_bantuan.setText("Button yang digunakan untuk memulai proses Pengamanan atau Pengungkapan. Pada proses Pengungkapan, button " +

"bergambar gembok terbuka. Apabila proses berhasil maka akan ditampilkan pemberitahuan Pengamanan atau Pengungkapan " +

"Sukses. Apabila inputan tidak sesuai maka akan ditampilkan pemberitahuan Periksa Kembali Inputan Anda.");

Toast.makeText(HelpActivity.this, "Button Proses", Toast.LENGTH_SHORT).show();


(8)

A-8

Toast.LENGTH_SHORT).show(); }

});

ImageButton help = (ImageButton) findViewById(R.id.b_help_en); help.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

tv_bantuan.setText("Button untuk menampilkan Halaman Bantuan penggunaan (halaman ini). Bantuan yang disediakan yaitu penjelasan " +

"mengenai Penggunaan aplikasi dan apa saja yang ada pada Halaman Pengamanan atau Pengungkapan. Selain itu, Halaman Bantuan " +

"juga berisi penjelasan Algoritma yang digunakan untuk memproses pesan. Gunakan button bergambar panah di kiri atas untuk " +

"kembali ke Halaman Pengamanan.");

Toast.makeText(HelpActivity.this, "Button Bantuan", Toast.LENGTH_SHORT).show();

} });

ImageButton about = (ImageButton) findViewById(R.id.b_about_en); about.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

tv_bantuan.setText("Button untuk menampilkan Halaman Tentang. Halaman ini berisi informasi mengenai pembuat aplikasi. Gunakan button " +

"bergambar panah di kiri atas untuk kembali ke Halaman Pengamanan.");

Toast.makeText(HelpActivity.this, "Button Tentang", Toast.LENGTH_SHORT).show();

} });

EditText pesan = (EditText) findViewById(R.id.et_plaintext_en); pesan.setInputType(InputType.TYPE_NULL);

pesan.setOnTouchListener(new View.OnTouchListener() { @Override

public boolean onTouch(View v, MotionEvent event) {

tv_bantuan.setText("Kolom untuk menulis pesan yang ingin diproses. Pesan terdiri dari karakter ASCII 32 hingga 126. Apabila muncul " +

"pemberitahuan Periksa Kembali Input Anda, maka mungkin saja salah satu karakter pesan yang digunakan tidak sesuai. " +

"Pesan dapat di-copy ke clipboard dan di-paste dengan menahan klik pada teks. Gunakan button yang muncul pada kanan " +

"atas setelah teks di-select");

Toast.makeText(HelpActivity.this, "Kolom Pesan", Toast.LENGTH_SHORT).show();

return false; }

});

EditText key1 = (EditText) findViewById(R.id.et_key1_en); key1.setInputType(InputType.TYPE_NULL);

key1.setOnTouchListener(new View.OnTouchListener() { @Override

public boolean onTouch(View v, MotionEvent event) {

tv_bantuan.setText("Kolom untuk menulis kunci pertama. Kunci terdiri dari karakter ASCII 32 hingga 126. Minimal panjang kunci " +

"yang digunakan adalah 2 karakter dan maksimal sepanjang pesan. Apabila muncul pemberitahuan Periksa Kembali Input " +

"Anda, maka mungkin saja kunci yang digunakan tidak sesuai."); Toast.makeText(HelpActivity.this, "Kolom Kunci 1",

Toast.LENGTH_SHORT).show();

return false; }

});

EditText key2 = (EditText) findViewById(R.id.et_key2_en); key2.setInputType(InputType.TYPE_NULL);


(9)

Apabila muncul pemberitahuan Periksa Kembali Inputan " +

"Anda, maka mungkin saja kunci yang digunakan tidak sesuai."); Toast.makeText(HelpActivity.this, "Kolom Kunci 2",

Toast.LENGTH_SHORT).show();

return false; }

});

TextView hasil = (TextView) findViewById(R.id.tv_ciphertext_en); hasil.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

tv_bantuan.setText("Kolom untuk menampilkan pesan hasil proses Pengmanan atau Pengungkapan. Pesan dapat di-copy ke clipboard " +

"dengan menahan klik pada teks. Gunakan button yang muncul di kanan atas setelah teks di-select.");

Toast.makeText(HelpActivity.this, "Kolom Hasil Proses", Toast.LENGTH_SHORT).show();

return false; }

});

final CheckBox view1 = (CheckBox) findViewById(R.id.cb_view1_en); view1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(view1.isChecked()){

tv_bantuan.setText("Bila kotak diceklis maka akan memperlihatkan kunci pertama");

Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 1", Toast.LENGTH_SHORT).show();

}

else{

tv_bantuan.setText("Bila kotak tidak diceklis maka akan menyembunyikan kunci pertama");

Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 1", Toast.LENGTH_SHORT).show();

} } });

final CheckBox view2 = (CheckBox) findViewById(R.id.cb_view2_en); view2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(view2.isChecked()){

tv_bantuan.setText("Bila kotak diceklis maka akan memperlihatkan kunci kedua");

Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 2", Toast.LENGTH_SHORT).show();

}

else{

tv_bantuan.setText("Bila kotak tidak diceklis maka akan menyembunyikan kunci kedua");

Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 2", Toast.LENGTH_SHORT).show(); } } }); } }


(10)

A-10

/**

* Created by ILMUKOMPUTER on 8/6/2016. */

public class AboutActivity extends AppCompatActivity { @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.activity_about);

ImageButton b_back = (ImageButton) findViewById(R.id.b_back); b_back.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(AboutActivity.this, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); } }); } } 4. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.ilmukomputer.mycipher.MainActivity" android:background="@drawable/background">

<TabHost

android:id="@+id/tabHost"

android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout

android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TabWidget

android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"

android:background="@color/colorPrimary"></TabWidget> <FrameLayout

android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent"> <include

android:id="@+id/layout1"

layout="@layout/layout_encrypt" android:layout_width="match_parent"

android:layout_height="match_parent"></include> <include

android:id="@+id/layout2"

layout="@layout/layout_decrypt" android:layout_width="match_parent"

android:layout_height="match_parent"></include> </FrameLayout>

</LinearLayout> </TabHost>


(11)

<TextView

android:id="@+id/tv_ciphertext_en" android:layout_width="fill_parent" android:layout_height="fill_parent" android:hint="Pesan Tersandi" android:background="@drawable/box" android:gravity="left"

android:textIsSelectable="true" android:padding="20dp"

android:layout_margin="10dp"

android:layout_below="@+id/et_key2_en" android:layout_above="@+id/et_plaintext_en" android:layout_alignParentEnd="true" /> <ImageButton

android:id="@+id/b_encrypt" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_encrypt" android:gravity="center"

android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" /> <EditText

android:id="@+id/et_plaintext_en" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="text"

android:hint="Tulis Pesan" android:maxLines="1" android:minHeight="40dp"

android:background="@drawable/box" android:gravity="center_vertical" android:padding="10dp"

android:layout_toStartOf="@+id/b_encrypt" android:layout_marginLeft="10dp"

android:layout_marginBottom="10dp" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" /> <EditText

android:id="@+id/et_key1_en"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10"

android:inputType="textPassword" android:hint="Kunci 1"

android:maxLines="1"

android:background="@drawable/box" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp"

android:layout_below="@+id/b_clear_en"

android:layout_toStartOf="@+id/cb_view1_en" /> <EditText

android:id="@+id/et_key2_en"

android:layout_width="wrap_content" android:layout_height="wrap_content"


(12)

A-12

android:layout_toStartOf="@+id/cb_view2_en" android:layout_alignStart="@+id/et_key1_en" /> <ImageButton

android:id="@+id/b_clear_en" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_clear" android:gravity="center"

android:layout_marginBottom="10dp" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" /> <ImageButton

android:id="@+id/b_about_en" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_about" android:gravity="center"

android:layout_toRightOf="@+id/b_help_en" android:layout_marginBottom="10dp" android:layout_alignParentTop="true" /> <ImageButton

android:id="@+id/b_help_en" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_help" android:gravity="center"

android:layout_alignParentStart="true" android:layout_marginBottom="10dp" android:layout_alignParentTop="true" /> <CheckBox

android:id="@+id/cb_view1_en" android:layout_width="40dip" android:layout_height="40dip" android:gravity="center"

android:layout_below="@+id/b_clear_en" android:layout_alignBottom="@+id/et_key1_en" android:layout_alignParentEnd="true" /> <CheckBox

android:id="@+id/cb_view2_en" android:layout_width="40dip" android:layout_height="40dip" android:gravity="center"

android:layout_below="@+id/et_key1_en" android:layout_alignBottom="@+id/et_key2_en" android:layout_alignParentEnd="true" /> </RelativeLayout>

6. layout_decrypt.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

android:layout_height="match_parent"> <TextView

android:id="@+id/tv_plaintext_de" android:layout_width="fill_parent" android:layout_height="fill_parent" android:hint="Pesan Asli"

android:background="@drawable/box" android:gravity="left"

android:textIsSelectable="true" android:padding="20dp"


(13)

android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_decrypt" android:gravity="center"

android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" /> <EditText

android:id="@+id/et_ciphertext_de" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="text"

android:hint="Tulis Pesan Tersandi" android:maxLines="1"

android:minHeight="40dp"

android:background="@drawable/box" android:gravity="center_vertical" android:padding="10dp"

android:layout_toStartOf="@+id/b_decrypt" android:layout_marginLeft="10dp"

android:layout_marginBottom="10dp" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" /> <EditText

android:id="@+id/et_key1_de"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10"

android:inputType="textPassword" android:hint="Kunci 1"

android:maxLines="1"

android:background="@drawable/box" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp"

android:layout_below="@+id/b_clear_de"

android:layout_toStartOf="@+id/cb_view1_de" /> <EditText

android:id="@+id/et_key2_de"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10"

android:inputType="numberPassword" android:hint="Kunci 2"

android:maxLines="1"

android:background="@drawable/box" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:layout_marginTop="5dp"

android:layout_below="@+id/et_key1_de" android:layout_toStartOf="@+id/cb_view2_de" android:layout_alignStart="@+id/et_key1_de" /> <ImageButton

android:id="@+id/b_clear_de" android:layout_width="50dip"


(14)

A-14

android:background="@drawable/ic_about" android:gravity="center"

android:layout_toRightOf="@+id/b_help_de" android:layout_marginBottom="10dp" android:layout_alignParentTop="true" /> <ImageButton

android:id="@+id/b_help_de" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_help" android:gravity="center"

android:layout_alignParentStart="true" android:layout_marginBottom="10dp" android:layout_alignParentTop="true" /> <CheckBox

android:id="@+id/cb_view1_de" android:layout_width="40dip" android:layout_height="40dip" android:gravity="center"

android:layout_below="@+id/b_clear_de" android:layout_alignBottom="@+id/et_key1_de" android:layout_alignParentEnd="true" /> <CheckBox

android:id="@+id/cb_view2_de" android:layout_width="40dip" android:layout_height="40dip" android:gravity="center"

android:layout_below="@+id/et_key1_de" android:layout_alignBottom="@+id/et_key2_de" android:layout_alignParentEnd="true" /> </RelativeLayout>

7. activity_help.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.ilmukomputer.mycipher.HelpActivity" android:background="@drawable/background">

<ImageButton

android:id="@+id/b_back" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_back" android:gravity="center"

android:layout_marginBottom="10dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" /> <TextView

android:id="@+id/tv_menu_bantuan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Menu Bantuan"

android:textSize="50sp"

android:layout_marginBottom="20dp" android:layout_below="@+id/b_back" android:layout_centerHorizontal="true" /> <Button

android:id="@+id/b_penggunaan" android:layout_width="wrap_content" android:layout_height="wrap_content"


(15)

android:id="@+id/b_algoritma" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Algoritma"

android:layout_below="@+id/b_penggunaan" android:layout_alignParentStart="true" android:layout_alignEnd="@+id/b_penggunaan" android:minHeight="90dp" />

<TextView

android:id="@+id/tv_bantuan" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Penjelasan"

android:layout_marginRight="10dp" android:padding="20dp"

android:gravity="center"

android:background="@drawable/box"

android:layout_alignBottom="@+id/b_algoritma" android:layout_toEndOf="@+id/b_penggunaan" android:layout_below="@+id/tv_menu_bantuan" android:layout_marginTop="10dp"

android:layout_marginBottom="10dp" /> <FrameLayout

android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/tv_bantuan" android:layout_alignParentBottom="true" android:layout_toEndOf="@+id/b_penggunaan" android:padding="20dp"

android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:background="@drawable/box"> <include

android:id="@+id/layout3"

layout="@layout/layout_encrypt" android:layout_width="wrap_content"

android:layout_height="wrap_content"></include> </FrameLayout>

</RelativeLayout>

8. activity_about.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.ilmukomputer.mycipher.AboutActivity" android:background="@drawable/background">

<ImageButton

android:id="@+id/b_back" android:layout_width="50dip" android:layout_height="50dip"

android:background="@drawable/ic_back" android:gravity="center"

android:layout_marginBottom="10dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" /> <TextView


(16)

A-16

android:layout_height="fill_parent" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_centerHorizontal="true" android:layout_below="@+id/tv_menu_tentang" android:src="@drawable/cover" />


(17)

CURRICULUM VITAE

DATA PRIBADI

PENDIDIKAN FORMAL

1999–2000 TK Angkasa Lanud Padang

2000–2004 SD An-Nur Pekanbaru

2004–2006 SD Angkasa 1 Lanud Padang

2006–2009 SMPN 7 Padang

2009–2010 SMAN 10 Padang

2010–2012 SMAN 4 Pekanbaru

2012–sedang berlangsung Universitas Sumatera Utara Program Studi : S1 IlmuKomputer

KEMAMPUAN

Programming C++, C#, Java

Database MySQL

Nama Lengkap Faisal Ridho

Jenis Kelamin 121401055

Tempat, Tanggal Lahir Medan, 25 Mei 1994

Agama Islam

Alamat Jl. Jermal VII Komp. Graha Jermal A.20

No.HP 081269946242

E-mail buatkirimtugas@gmail.com

Alamat Orang Tua Jl. Jermal VII Komp. Graha Jermal A.20


(18)

DAFTAR PUSTAKA

Achmad, R. 2011. Pengukuran kekuatan kunci pada vigenere cipher. (Online)

http://informatika.stei.itb.ac.id/~rinaldi.munir/Kriptografi/2010-2011/Makalah1/Makalah1-IF3058-Sem1-2010-2011-058.pdf (27 Juli 2016). Asror, K. 2015. Peningkatan sistem keamanan pesan pada perangkat mobile android

dengan enkripsi dekripsi menggunakan algoritma affine cipher dan vigenere cipher. Skripsi. Universitas Dian Nuswantoro Semarang.

Badan Pengembangan dan Pembinaan Bahasa.2008. Kamus Besar Bahasa Indonesia Dalam Jaringan.(Online) http://badanbahasa.kemdikbud.go.id/kbbi/ (14 Maret 2016).

Bhateja, A. & Kumar, S. 2014. Genetic algorithm with elitism for cryptanalysis of vigenere cipher. Proceedings of International Conference Issues and Challenges in Intelligent Computing Techniques (ICICT). pp. 373-377.

Bhateja, A.K., Bhateja, A., Chaudhury, S. & Saxena, P.K. 2014. Cryptanalysis of vigenere cipher using cuckoo search. Applied Soft Computing 26: 315-324. Bhowmick, A., Lal, A.V. & Ranjan, N. 2015. Enhanced 6x6 playfair cipher using

double myszkowski transposition. International Journal of Engineering Research and Technology 4(7): 1100-1104.

Dharwiyanti, S. & Wahono, R.S. 2003. Pengantar unified modeling language (UML). (Online). http://setia.staff.gunadarma.ac.id/Downloads/files/6077/ Modul_UML.pdf (27 Juli 2016).

Fahrianto, F., Masruroh, S.U. & Ando, N.Z. 2014. Encrypted SMS application on android with combination of caesar cipher and vigenere algorithm. Proceedings of International Conference on Cyber and IT Management (CITSM), pp. 31-33.

Girsang, T.T. 2010. Analisis kerahasiaan data menggunakan algoritma vigenere cipher dalam sistem pengamanan data. Skripsi. Universitas Sumatera Utara.

Nacira, G. & Abdelaziz, A. 2005. Secured net-banking by θ-vigenere in syverson’s

protocol. Proceedings of 3rdACS/IEEE International Conference on Computer Systems and Applications, pp. 1-6.


(19)

Shabara, S. 2015. Enkripsi SMS pada smartphone berbasis android dengan metode vigenere dan transposisi kolom. Skripsi. Universitas Dian Nuswantoro Semarang.

Singh, G. & Supriya. 2013. Modified vigenere encryption algorithm and its hybrid implementation with base64 and AES. Proceedings of 2nd International Conference on Advanced Computing, Networking and Security (ADCONS), pp. 232-237.

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

Zhang, L., Gao, T. & Yang, R. 2014. DNA coding and central dogma based image encryption using vigenere cipher and chaos map. Proceedings of 5th International Conference on Intelligent Control and Information Processing (ICICIP). pp. 80-85.


(20)

BAB 3

ANALISIS DAN PERANCANGAN

3.1. Analisis Sistem

Analisis sistem adalah tahapan yang dilakukan untuk menguraikan sebuah sistem agar mendapatkan gambaran tentang apa yang akan dirancang dan diimplementasikan pada program. Dalam tugas akhir ini, ada tiga tahap analisis sistem yaitu : analisis masalah, analisis persyaratan dan analisis proses.

3.1.1. Analisis masalah

Permasalahan yang akan diselesaikan pada sistem ini adalah mengamankan pesan dari pihak ketiga yang tidak berhak mengetahui isi dari pesan dengan mengimplementasikan kombinasi algoritma Vigenere cipher dan Myszkowski transposition. Untuk mengidentifikasi masalah tersebut digunakan diagram Ishikawa (fishbone diagram). Diagram Ishikawa sistem ini dapat dilihat pada Gambar 3.1.


(21)

Gambar 3.1 Diagram Ishikawa

Berdasarkan Gambar 3.1, permasalahan yang dihadapi pada penelitian ini adalah perlunya meningkatkan keamanan pesan dengan kombinasi algoritma kriptografi, dan penyebab munculnya permasalahan tersebut terdiri dari beberapa kategori, yaitu manusia, metode, material dan mesin.

Pada kategori manusia, masalah disebabkan oleh pengirim dan penerima ingin merahasiakan pesan dan pihak ketiga melakukan penyadapan karena rasa ingin tahu. Pada kategori metode, masalah disebabkan oleh panjang kunci dari algoritma Vigenere cipher dapat diketahui karena kunci diulangi hingga sepanjang plaintext. Pada kategori material, masalah disebabkan oleh pesan berbentuk teks rentan disadap saat dikirimkan ke penerima. Pada kategori mesin, masalah disebabkan oleh perangkat smartphone lebih mudah dibawa dibandingkan komputer dan belum adanya aplikasi pada smartphone yang menggunakan kombinasi algoritma Vigenere cipher dan Myszkowski transposition. Solusi yang ditawarkan adalah mengamankan pesan dengan mengacak posisi huruf hasil enkripsi Vigenere cipher dengan menggunakan algoritma Myszkowski transposition berbasis android.


(22)

16

3.1.2.1. Persyaratan fungsional

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

1. Fungsi Enkripsi

Pengguna dapat melakukan proses enkripsi pesan dari plaintext menjadi ciphertext dengan menggunakan kunci enkripsi yang telah dimasukkan.

2. Fungsi Dekripsi

Pengguna dapat melakukan proses dekripsi pesan dari ciphertext kembali menjadi plaintext dengan menggunakan kunci yang telah dimasukkan.

3.1.2.2. Persyaratan non-fungsional

Persyaratan non-fungsional meliputi karakteristik berikut ini : 1. Performa

Sistem yang akan dibangun dapat menampilkan hasil enkripsi dan dekripsi. 2. Mudah dipelajari dan digunakan

Sistem yang akan dibangun memiliki tampilan sederhana dan user friendly sehingga mudah dipelajari dan digunakan oleh pengguna.

3. Hemat Biaya

Sistem yang akan dibangun tidak membutuhkan perangkat pendukung tambahan yang membutuhkan biaya yang besar.

4. Dokumentasi

Sistem yang akan dibangun dapat menyimpan data hasil proses. 5. Kontrol

Sistem akan menampilkan pemberitahuan bila pengguna salah atau tidak lengkap memasukkan data input.


(23)

awal dilakukan kebalikan dari proses sebelumnya yaitu ciphertext didekripsi menggunakan algoritma Myszkowski transposition, kemudian hasilnya didekripsi dengan menggunakan algoritma Vigenere cipher. Proses enkripsi menggunakan kunci yang sama dengan kunci dekripsi.

3.2. Pemodelan Sistem

Pemodelan (modeling) adalah proses merancang piranti lunak sebelum melakukan pengkodean. Dengan menggunakan model, diharapkan pengembangan piranti lunak dapat memenuhi semua kebutuhan pengguna dengan lengkap dan tepat (Dharwiyanti & Wahono, 2003).

3.2.1. Unified Modeling Language (UML)

Unified modeling language adalah bahasa yang menjadi standar dalam industri untuk visualisasi, merancang dan mendokumentasikan sistem piranti lunak (Dharwiyanti & Wahono, 2003). Model UML yang digunakan pada penelitian ini antara lain adalah use case diagram, activity diagram serta sequence diagram.

3.2.1.1. Use case diagram

Use case diagram merupakan penggambaran fungsionalitas yang diharapkan dari sebuah sistem. Sebuah use case merepresentasikan sebuah interaksi antara aktor dengan sistem (Dharwiyanti & Wahono, 2003). Adapun use case dari sistem yang akan dibangun pada penelitian ini dapat dilihat pada Gambar 3.2.


(24)

18

Gambar 3.2 Use Case Diagram

Pada gambar 3.2, digambarkan hanya ada seorang aktor yaitu pengguna. Pengguna dapat menginput data, melakukan proses pengamanan dan pengungkapan. Use case pengamanan dan pengungkapan membutuhkan pengecekan inputan agar dapat dijalankan. Untuk lebih jelasnya, use case pengamanan dapat dilihat pada Tabel 3.1.

Tabel 3.1 Deskripsi Use Case Pengamanan

Name Pengamanan

Actors Pengguna

Description Proses memasukkan pesan asli dan kunci, kemudian melakukan enkripsi menggunakan algoritma Vigenere dan Myszkowski, lalu menampilkan hasilnya

Basic Flow Pengguna memasukkan pesan asli dan kunci, kemudian menekan tombol enkripsi

Alternate Flow Pengguna memilih menu Pengungkapan Pre Condition Pengguna telah membuka menu Pengamanan Post Condition Pengguna mendapatkan pesan tersandi


(25)

Tabel 3.2 Deskripsi Use Case Pengungkapan

Name Pengungkapan

Actors Pengguna

Description Proses memasukkan pesan tersandi dan kunci, kemudian

melakukan dekripsi dengan algoritma Vigenere dan Myszkowski, lalu menampilkan hasilnya

Basic Flow Pengguna memasukkan pesan tersandi dan kunci, kemudian menekan tombol dekripsi

Alternate Flow Pengguna memilih menu Pengamanan

Pre Condition Pengguna telah memilih menu Pengungkapan Post Condition Pengguna mendapatkan pesan asli

3.2.1.2. Activity diagram

Activity diagram merupakan penggambaran berbagai alir aktivitas dalam sistem yang sedang dirancang, bagaimana alir awal, decision yang mungkin terjadi dan berakhir. Diagram ini dapat dibagi menjadi beberapa object swimlane untuk menggambarkan objek mana yang bertanggung jawab untuk aktivitas tertentu (Dharwiyanti & Wahono, 2003).

Gambar 3.3 menunjukkan activity diagram untuk proses pengamanan. Proses dimulai dari pengguna memilih menu pengamanan dan sistem akan menampilkan halaman pengamanan. Kemudian pengguna memasukkan pesan asli (plaintext), kunci pertama (key1) dan kunci kedua (key2), lalu menekan tombol enkripsi. Sistem melakukan pengecekan inputan, bila cek gagal maka proses selesai dan bila cek sukses, sistem melakukan enkripsi plaintext menggunakan algoritma Vigenere cipher dengan key1 untuk menghasilkan pesan tersandi pertama (ciphertext1). Ciphertext1 selanjutnya dienkripsi menggunakan algoritma Myszkowski transposition dengan key2 untuk menghasilkan pesan tersandi kedua (ciphertext2), kemudian menampilkan hasilnya dan proses selesai.


(26)

20

Gambar 3.3 Activity Diagram Pengamanan

Gambar 3.4 menunjukkan activity diagram untuk proses pengungkapan. Proses dimulai dari pengguna memilih menu pengungkapan dan sistem menampilkan halaman pengungkapan. Kemudian pengguna memasukkan ciphertext2, key1 dan key2, lalu menekan tombol dekripsi. Sistem melakukan pengecekan inputan, bila cek gagal proses selesai dan bila cek sukses, sistem melakukan dekripsi ciphertext2 menggunakan algoritma Myszkowski transposition dengan key2 untuk menghasilkan ciphertext1. Ciphertext1 selanjutnya didekripsi menggunakan algoritma Vigenere cipher dengan key1 untuk menghasilkan plaintext, kemudian menampilkan hasilnya dan proses selesai.


(27)

Gambar 3.4 Activity Diagram Pengungkapan

3.2.1.3. Sequence diagram

Sequence diagram merupakan penggambaran skenario atau langkah-langkah yang dilakukan sebagai respons dari sebuah event untuk menghasilkan output tertentu. Sequence diagram terdiri dari waktu pada vertikal dan objek-objek yang terkait pada horizontal (Dharwiyanti & Wahono, 2003). Sequence diagram dari proses pengamanan dapat dilihat pada Gambar 3.5.


(28)

22

Gambar 3.5 Sequence Diagram Pengamanan

Pada Gambar 3.5 dapat dilihat bahwa pertama pengguna memasukkan plaintext, key1 dan key2 pada pengamanan. Kemudian plaintext dan key1 digunakan untuk dienkripsi menjadi ciphertext1. Ciphertext1 dienkripsi lagi menggunakan key2 untuk mendapatkan ciphertext2. Setelah itu, ciphertext2 ditampilkan kepada pengguna. Sequence diagram dari proses pengungkapan dapat dilihat pada Gambar 3.6.


(29)

Pada Gambar 3.6 dapat dilihat bahwa pertama pengguna memasukkan ciphertext2, key1 dan key2 pada pengungkapan. Kemudian ciphertext2 dan key2 digunakan untuk didekripsi menjadi ciphertext1. Ciphertext1 didekripsi lagi menggunakan key1 untuk mendapatkan plaintext kembali. Setelah itu, plaintext ditampilkan kepada pengguna.

3.2.2. Flowchart

Flowchart merupakan gambar atau bagan yang memperlihatkan urutan dan hubungan antar proses beserta pernyataannya. Gambaran ini dinyatakan dengan simbol dan garis penghubung. Flowchart berguna untuk memudahkan dalam melakukan pengecekan bagian-bagian dalam analisis masalah (Zarlis & Handrizal, 2008).

3.2.2.1. Flowchart sistem

Flowchart sistem yaitu bagan dengan simbol tertentu yang menggambarkan urutan prosedur dan proses suatu file dalam suatu media menjadi file di dalam media lain, dalam suatu sistem pengolahan data (Zarlis & Handrizal, 2008). Flowchart dari sistem yang akan dibangun dapat dilihat pada Gambar 3.7.


(30)

24

Gambar 3.7 Flowchart Sistem

Pada Gambar 3.7 sistem dimulai dengan menentukan pilihan halaman menu, yaitu menu pengamanan atau pengungkapan. Halaman pengamanan berfungsi untuk mengenkripsi pesan asli menjadi pesan tersandi. Halaman pengungkapan berfungsi untuk mendekripsikan pesan tersandi kembali menjadi pesan asli.

3.2.2.2. Flowchart program pengamanan

Flowchart program yaitu bagan dengan simbol-simbol tertentu yang menggambarkan urutan proses dan hubungan antar proses secara mendetail di dalam suatu program (Zarlis & Handrizal, 2008). Flowchart program pengamanan dapat dilihat pada Gambar 3.8.


(31)

Gambar 3.8 Flowchart Pengamanan 3.2.2.3. Flowchart program pengungkapan


(32)

26

Gambar 3.9 Flowchart Pengungkapan

3.2.3. Pseudocode

Pseudocode adalah kode yang mirip dengan kode pemrogaman yang sebenarnya seperti Pascal, atau C, sehingga lebih tepat digunakan untuk menggambarkan algoritma yang akan dikomunikasikan kepada pemrogram (Zarlis & Handrizal, 2008). Pseudocode pada penelitian ini dibagi menjadi empat yaitu enkripsi Vigenere,


(33)

3.2.3.1. Pseudocode enkripsi Vigenere

Pseudocode enkripsi Vigenere dapat dilihat pada Gambar 3.10.

Gambar 3.10 Pseudocode Enkripsi Vigenere 3.2.3.2. Pseudocode enkripsi Myszkowski

Pseudocode enkripsi Myszkowski dapat dilihat pada Gambar 3.11.

Kamus :

plaintext, key1, key, ciphertext1 : string pesan, i, j, k : integer

Algoritma :

Input (plaintext) Input (key1)

For (i=0; i<plaintext.length(); i++) j = i % key1.length()

key += key1.charAt(j) EndFor

For (i=0; i<plaintext.length(); i++) j = (int) plaintext.charAt(i) k = {int} key.charAt(i)

pesan = ((j-32) + (k-32)) % 95 pesan += 32

ciphertext += (char) pesan EndFor


(34)

28

Gambar 3.11 Pseudocode Enkripsi Myszkowski

3.2.3.3. Pseudocode dekripsi Myszkowski

Pseudocode dekripsi Myszkowski dapat dilihat pada Gambar 3.12.

Kamus :

ciphertext1, ciphertext2, key2 : string bar, kol, tmp, kecil, i, j, k : integer matrix[bar,kol] : array of char

Algoritma :

Input (ciphertext1) Input (key2)

tmp = 0

kol = key2.length()

bar = ceil(ciphertext1.length() / kol) For (i=0; i<bar i++)

For (j=0; j<kol; j++)

If (tmp < ciphertext1.length())

matrix[i,j] = ciphertext1.charAt(tmp) tmp++

Else

matrix[i][j] = null EndIf

EndFor EndFor tmp = -1

While (ciphertext2.length() < ciphertext1.length()) For (i=0; i<kol; i++)

If (int.parse(key2.char(i)) > tmp) kecil = int.parse(key2.char(i)) break()

EndIf EndFor

For (i=0; i<kol; i++)

If (int.parse(key2.char(i)) > tmp & int.parse(key2.char(i) < kecil)

kecil = int.parse(key2.char(i)) EndIf

EndFor

For (i=0; i<bar; i++) For (j=0; j<kol; j++)

If (int.parse(key2.char(j)) == kecil & matrix[i][j] != null)

ciphertext2 += matrix[i,j] EndIf

EndFor EndFor tmp = kecil EndWhile


(35)

Gambar 3.12 Pseudocode Dekripsi Myszkowski

Kamus :

ciphertext1, ciphertext2, key2 : string bar, kol, tmp, kecil, i, j, k : integer matrix[bar,kol] : array of char

Algoritma :

Input (ciphertext2) Input (key2)

k = 0 tmp = -1

kol = key2.length()

bar = ceil(ciphertext2.length() / kol) While (k < ciphertext2.length())

For (i=0; i<kol; i++)

If (int.parse(key2.char(i)) > tmp) kecil = int.parse(key2.char(i)) break()

EndIf EndFor

For (i=0; i<kol; i++)

If (int.parse(key2.char(i)) > tmp & int.parse(key2.char(i) < kecil)

kecil = int.parse(key2.char(i)) EndIf

EndFor

For (i=0; i<bar; i++) For (j=0; j<kol; j++)

If (int.parse(key2.char(j)) == kecil)

If (i==bar-1 & j>=kol-((kol*bar)-ciphertext2.length()) Else

matrix[i,j] = ciphertext2.char(k) k++

EndIf EndIf EndFor EndFor tmp = kecil EndWhile

For (i=0; i<bar i++) For (j=0; j<kol; j++)

If (ciphertext1.length() < ciphertext2.length()) ciphertext1 += matrix[i,j]

EndIf EndFor EndFor


(36)

30

Gambar 3.13 Pseudocode Dekripsi Vigenere

3.3. Perancangan Antarmuka (Interface)

Perancangan antarmuka (interface) merupakan bagian yang penting dalam membangun sebuah sistem. Antarmuka yang dirancang harus memperhatikan kenyamanan dan kemudahan pengguna dalam menjalankan sistem.

3.3.1. Screen launcher

Screen launcher merupakan gambar yang muncul saat sistem dibuka pertama kali. Screen launcher akan digunakan untuk menampilkan logo aplikasi saat sistem sedang melakukan proses untuk menampilkan halaman pengamanan. Rancangan screen launcher dapat dilihat pada Gambar 3.14.

Kamus :

ciphertext1, key1, key, plaintext : string pesan, i, j, k : integer

Algoritma :

Input (ciphertext1) Input (key1)

For (i=0; i<ciphertext1.length(); i++) j = i % key1.length()

key += key1.charAt(j) EndFor

For (i=0; i<ciphertext1.length(); i++) j = (int) ciphertext1.charAt(i) k = {int} key.charAt(i)

If (j >= k)

pesan = ((j-32) - (k-32)) % 95 Else

pesan = ((j-32) + 95 – (k-32)) % 95 EndIf

EndFor

pesan += 32

ciphertext += (char) pesan EndFor


(37)

Gambar 3.14 Rancangan Screen Launcher

3.3.2. Halaman pengamanan

Halaman pengamanan merupakan halaman yang ditampilkan setelah screen launcher. Halaman ini akan digunakan untuk memasukkan plaintext, key1 dan key2, melakukan proses enkripsi, serta menampilkan ciphertext2. Rancangan halaman Pengamanan dapat dilihat pada Gambar 3.15.


(38)

32

Gambar 3.15 Rancangan Halaman Pengamanan

Pada Gambar 3.15 ditunjukkan bahwa halaman pengamanan terdiri dari beberapa komponen, yaitu Tab, Button, CheckBox, EditText dan TextView. Keterangan komponen tersebut dapat dilihat pada Tabel 3.3.

Tabel 3.3 Keterangan Gambar Rancangan Halaman Pengamanan

No Keterangan

1 Tab Pengamanan untuk menampilkan halaman pengamanan 2 Tab Pengungkapan untuk menampilkan halaman pengungkapan 3 Button Bantuan untuk menampilkan halaman bantuan

4 Button Tentang untuk menampilkan halaman tentang 5 Button Reset untuk mengosongkan semua kolom masukkan 6 Button Enkripsi untuk memulai proses enkripsi

7 CheckBox Lihat Kunci 1 untuk menampilkan atau menyembunyikan key1 8 CheckBox Lihat Kunci 2 untuk menampilkan atau menyembunyikan key2 9 EditText Kunci 1 untuk memasukkan key1


(39)

3.3.3. Halaman pengungkapan

Halaman pengungkapan merupakan halaman yang ditampilkan saat pengguna menekan Tab Pengungkapan. Halaman ini akan digunakan untuk memasukkan ciphertext2, key1 dan key2, melakukan proses dekripsi serta menampilkan plaintext. Rancangan halaman pengungkapan dapat dilihat pada Gambar 3.16

Gambar 3.16 Rancangan Halaman Pengungkapan

Pada Gambar 3.16 ditunjukkan bahwa halaman pengungkapan terdiri dari beberapa komponen, yaitu Tab, Button, CheckBox, EditText dan TextView. Keterangan komponen tersebut dapat dilihat pada Tabel 3.4.


(40)

34

Tabel 3.4 Keterangan Gambar Rancangan Halaman Pengungkapan

No Keterangan

1 Tab Pengamanan untuk menampilkan halaman pengamanan 2 Tab Pengungkapan untuk menampilkan halaman pengungkapan 3 Button Bantuan untuk menampilkan halaman bantuan

4 Button Tentang untuk menampilkan halaman tentang 5 Button Reset untuk mengosongkan semua kolom masukkan 6 Button Dekripsi untuk memulai proses dekripsi

7 CheckBox Lihat Kunci 1 untuk menampilkan atau menyembunyikan key1 8 CheckBox Lihat Kunci 2 untuk menampilkan atau menyembunyikan key2 9 EditText Kunci 1 untuk memasukkan key1

10 EditText Kunci 2 untuk memasukkan key2

11 EditText Ciphertext untuk memasukkan ciphertext2 12 TextView Plaintext untuk menampilkan plaintext

3.3.4. Halaman bantuan

Halaman bantuan merupakan halaman yang ditampilkan saat pengguna menekan Button Bantuan. Halaman ini akan digunakan untuk membantu pengguna dalam menjalankan sistem. Rancangan halaman bantuan dapat dilihat pada Gambar 3.17.


(41)

Gambar 3.17 Rancangan Halaman Bantuan

Pada Gambar 3.17 ditunjukkan bahwa halaman bantuan terdiri dari beberapa komponen, yaitu Button, TextView dan FrameLayout. Keterangan komponen tersebut dapat dilihat pada Tabel 3.5.

Tabel 3.5 Keterangan Gambar Rancangan Halaman Bantuan

No Keterangan

1 Button Kembali untuk kembali ke halaman pengamanan

2 Button Penggunaan untuk memberikan informasi penggunaan aplikasi 3 Button Algoritma untuk memberikan informasi algoritma yang digunakan 4 TextView Judul untuk menampilkan judul halaman

5 TextView Bantuan untuk menampilkan informasi yang dipilih

6 FrameLayout Komponen untuk menampilkan informasi komponen pada halaman pengamanan atau pengungkapan


(42)

36

Gambar 3.18 Rancangan Halaman Tentang

Pada Gambar 3.17 ditunjukkan bahwa halaman tentang terdiri dari beberapa komponen seperti Button, TextView dan ImageView. Keterangan komponen tersebut dapat dilihat pada Tabel 3.6.

Tabel 3.6 Keterangan Gambar Rancangan Halaman Tentang

No Keterangan

1 Button Kembali untuk kembali ke halaman pengamanan 2 TextView Judul untuk menampilkan judul halaman


(43)

4.1. Implementasi

Setelah sistem yang akan dibangun dianalisis dan dirancang, selanjutnya dilakukan implementasi sistem tersebut menjadi sebuah program. Sistem dibangun menggunakan Android Studio dengan bahasa pemrograman Java.

4.1.1. Implementasi pseudocode enkripsi Vigenere

Pada bagian ini pseudocode enkripsi Vigenere diimplementasikan ke dalam bahasa Java. Berikut potongan source code proses enkripsi Vigenere dapat dilihat pada Gambar 4.1.

Gambar 4.1 Potongan Source Code Enkripsi Vigenere 4.1.2. Implementasi pseudocode enkripsi Myszkowski

Pada bagian ini pseudocode enkripsi Myszkowski diimplementasikan ke dalam bahasa Java. Berikut potongan source code proses enkripsi Myszkowski dapat dilihat pada Gambar 4.2.

for (i = 0; i < plaintext.length(); i++) { j = i % key1.length();

key += key1.charAt(j); }

for (i = 0; i < plaintext.length(); i++) { j = (int) plaintext.charAt(i);

k = (int) key.charAt(i);

pesan = ((j - 32) + (k - 32)) % 95; pesan += 32;

ciphertext1 += (char) pesan; }


(44)

38

Gambar 4.2 Potongan Source Code Enkripsi Myszkowski 4.1.3. Implementasi pseudocode dekripsi Myszkowski

Pada bagian ini pseudocode dekripsi Myszkowski diimplementasikan ke dalam bahasa Java. Berikut potongan source code dekripsi Myszkowski dapat dilihat pada Gambar 4.3.

int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext1.length() / kol);

char[][] matrix = new char[bar][kol];

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

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

if (tmp < ciphertext1.length()) {

matrix[i][j] = ciphertext1.charAt(tmp); tmp++;

}

else {

matrix[i][j] = Character.MIN_VALUE; }

} }

tmp = -1;

while (ciphertext2.length() < ciphertext1.length()) {

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

if (Integer.parseInt(key2.charAt(i) + "") > tmp) { kecil = Integer.parseInt(key2.charAt(i) + "");

break; }

}

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

if (Integer.parseInt(key2.charAt(i) + "") > tmp && Integer.parseInt(key2.charAt(i) + "") < kecil) {

kecil = Integer.parseInt(key2.charAt(i) + ""); }

}

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

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

if (Integer.parseInt(key2.charAt(j) + "") == kecil && matrix[i][j] != Character.MIN_VALUE) {

ciphertext2 += matrix[i][j]; }

} }

tmp = kecil; }


(45)

Gambar 4.3 Potongan Source Code Dekripsi Myszkowski 4.1.4. Implementasi pseudocode dekripsi Vigenere

Pada bagian ini pseudocode dekripsi Vigenere diimplementasikan ke dalam bahasa Java. Berikut potongan source code dekripsi Vigenere dapat dilihat pada Gambar 4.4.

int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext2.length()/kol);

char[][] matrix = new char[bar][kol];

while(k < ciphertext2.length()) {

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

if(Integer.parseInt(key2.charAt(i) + "") > tmp) { kecil = Integer.parseInt(key2.charAt(i) + "");

break; }

}

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

if(Integer.parseInt(key2.charAt(i) + "") > tmp && Integer.parseInt(key2.charAt(i) + "") < kecil) {

kecil = Integer.parseInt(key2.charAt(i) + ""); }

}

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

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

if(Integer.parseInt(key2.charAt(j)+"") == kecil){

if(i == bar-1 && j >= kol-((bar*kol)-ciphertext2.length())){

}

else {

matrix[i][j] = ciphertext2.charAt(k); k++;

} } } }

tmp = kecil; }

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

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

if(ciphertext1.length() < ciphertext2.length()){ ciphertext1 += matrix[i][j];

} } }


(46)

40

Gambar 4.4 Potongan Source Code Dekripsi Vigenere

4.1.5. Implementasi enkripsi Vigenere cipher

Pada bagian ini dijelaskan proses implementasi algoritma Vigenere cipher pada enkripsi. Sebelum melakukan enkripsi, kunci yang digunakan terlebih dahulu diulangi hingga memiliki panjang yang sama dengan plaintext. Sebagai contoh digunakan plaintext“FAISAL RIDHO” dengan key1 “ILKOM” dan key2 “7414”.

4.1.5.1. Proses pengulangan kunci

Pada proses ini, key1 diulangi hingga memiliki panjang yang sama dengan plaintext. Berikut adalah proses pengulangan kunci untuk algoritma Vigenere cipher :

plaintext : “FAISAL RIDHO“

key1 : “ILKOM”

key : “ILKOMILKOMIL”

Keterangan :

plaintext = pesan yang akan dienkripsi

key1 = kunci yang digunakan untuk algoritma Vigenere cipher for(i=0; i<ciphertext1.length(); i++){

j = i % key1.length(); key += key1.charAt(j); }

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

j = (int) ciphertext1.charAt(i); k = (int) key.charAt(i);

if(j >= k) {

pesan = ((j - 32) - (k - 32)) % 95; }

else{

pesan = ((j - 32) + 95 - (k - 32)) % 95; }

pesan += 32;

plaintext += (char) pesan; }


(47)

4.1.5.2. Proses pengubahan karakter menjadi ASCII

Pada proses ini plaintext dan key1 diubah menjadi ASCII. Tabel ASCII yang digunakan untuk mengubah karakter menjadi ASCII ditunjukkan pada Tabel 4.1.

Tabel 4.1 Tabel ASCII

Char ASCII Char ASCII Char ASCII Char ASCII Char ASCII

(spasi) 32 3 51 F 70 Y 89 l 108

! 33 4 52 G 71 Z 90 m 109

34 5 53 H 72 [ 91 n 110

# 35 6 54 I 73 \ 92 o 111

$ 36 7 55 J 74 ] 93 p 112

% 37 8 56 K 75 ^ 94 q 113

& 38 9 57 L 76 _ 95 r 114

39 : 58 M 77 ` 96 s 115

( 40 ; 59 N 78 a 97 t 116

) 41 < 60 O 79 b 98 u 117

* 42 = 61 P 80 c 99 v 118

+ 43 > 62 Q 81 d 100 w 119

, 44 ? 63 R 82 e 101 x 120

- 45 @ 64 S 83 f 102 y 121

. 46 A 65 T 84 g 103 z 122

/ 47 B 66 U 85 h 104 { 123

0 48 C 67 V 86 i 105 | 124

1 49 D 68 W 87 j 106 } 125

2 50 E 69 X 88 k 107 ~ 126

Berikut adalah proses pengubahan karakter plaintext dan key1 menjadi ASCII sesuai Tabel 4.1 :


(48)

42 =‘R’= 82 =‘K’= 75

=‘I’= 73 =‘O’= 79 =‘D’= 68 =‘M’= 77 =‘H’= 72 =‘I’= 73 =‘O’= 79 =‘L’= 76

4.1.5.3. Proses enkripsi Vigenere cipher

Pada proses ini plaintext dienkripsi menjadi ciphertext1 dengan menggunakan kunci yang telah diulangi. Pada penelitian ini, pesan yang digunakan terdiri dari 95 karakter ASCII dari 32 hingga 126, sehingga rumus yang digunakan untuk proses enkripsi yaitu :

− 32 = ( − 32) + ( − 32) 95

atau dapat juga ditulis :

= (( − 32) + ( − 32) 95) + 32

proses enkripsi dilakukan sebagai berikut :

= ((70 − 32) + (73 − 32) 95) + 32 = 111 = ((65 − 32) + (76 − 32) 95) + 32 = 109 = ((73 − 32) + (75 − 32) 95) + 32 = 116 = ((83 − 32) + (79 − 32) 95) + 32 = 35 = ((65 − 32) + (77 − 32) 95) + 32 = 110 = ((76 − 32) + (73 − 32) 95) + 32 = 117 = ((32 − 32) + (76 − 32) 95) + 32 = 76 = ((82 − 32) + (75 − 32) 95) + 32 = 125 = ((73 − 32) + (79 − 32) 95) + 32 = 120 = ((68 − 32) + (77 − 32) 95) + 32 = 113 = ((72 − 32) + (73 − 32) 95) + 32 = 113 = ((79 − 32) + (76 − 32) 95) + 32 = 123

4.1.5.4. Proses pengubahan ASCII menjadi karakter

Pada proses ini angka ASCII diubah kembali menjadi karakter sesuai Tabel 4.1. Berikut adalah proses pengubahan menjadi karakter :

= 111=‘o’

= 109= ‘m’

= 116= ‘t’

= 35= ‘#’


(49)

= 120= ‘x’

= 113= ‘q’

= 113= ‘q’

= 123= ‘{‘

sehingga diperoleh ciphertext1“omt#nuL}xqq{“.

4.1.6. Implementasi enkripsi Myszkowski transposition

Pada bagian ini dijelaskan proses implementasi algoritma Myszkowski transposition pada enkripsi. Pesan yang akan dienkripsi yaitu ciphertext1 hasil dari enkripsi algoritma Vigenere cipher. Sebelum melakukan enkripsi, ciphertext1 terlebih dahulu disusun menjadi sebuah matriks.

4.1.6.1. Proses penyusunan matriks

Pada proses ini ciphertext1“omt#nuL}xqq{“disusun menjadi matriks dengan panjang kolom sama dengan panjang key2 “7414”. Sedangkan panjang baris sama dengan pembulatan ke atas dari panjang ciphertext1 setelah dibagi dengan panjang kolom. Berikut adalah proses penyusunan matriks :

kolom = panjang key2 = 4 baris =12 4⁄ = 3

ciphertext1 disusun perbarisnya atau dari kiri ke kanan. Matriks enkripsi ciphertext1 dapat dilihat pada Tabel 4.2.

Tabel 4.2 Tabel Matriks Enkripsi

7 4 1 4

o M t #

n U L }


(50)

44

4.1.7. Implementasi dekripsi Myszkowski Transposition

Pada bagian ini dijelaskan proses implementasi algoritma Myszkowski transposition pada dekripsi. Pesan yang akan didekripsi yaitu ciphertext2 hasil dari enkripsi algoritma Myszkowski transposition. Proses dekripsi.dilakukan dengan menyusun ciphertext2 kembali menjadi matriks terlebih dahulu.

4.1.7.1. Proses penyusunan matriks

Pada proses ini ciphertext2“tLqm#u}q{onx”disusun menjadi matriks dengan panjang

kolom sama dengan panjang key2 “7414”. Sedangkan panjang baris sama dengan

pembulatan ke atas dari panjang ciphertext1 setelah dibagi dengan panjang kolom. Berikut adalah proses penyusunan matriks :

kolom = panjang key2 = 4 baris =12 4⁄ = 3

Ciphertext2 diisi satu-persatu ke dalam matriks perkolomnya sesuai kunci dari yang terkecil hingga terbesar. Untuk angka yang sama ditulis dari kiri ke kanan. Berikut ini adalah proses penyusunan matriks dekripsi.

Ciphertext2“tLq”disusun dari atas ke bawah pada kolom 3 atau kolom kunci 1 terlebih dahulu. Proses ini ditunjukkan pada Tabel 4.3.

Tabel 4.3 Tabel Matriks Dekripsi Tahap 1

7 4 1 4

t L q

Kemudian, ciphertext2 “m#u}q{” disusundari kiri ke kanan pada kolom 2 dan 4 atau kolom kunci 4. Proses ini ditunjukkan pada Tabel 4.4.


(51)

Tabel 4.4 Tabel Matriks Dekripsi Tahap 2

7 4 1 4

m t #

u L }

q q {

Selanjutnya, ciphertext2 yang tersisa “onx” disusun dari atas ke bawah pada

kolom 1 atau kolom kunci 7. Proses ini ditunjukkan pada Tabel 4.5. Tabel 4.5 Tabel Matriks Dekripsi Tahap 3

7 4 1 4

o m t #

n u L }

x q q {

4.1.7.2. Proses dekripsi Myszkowski transposition

Pada proses ini dilakukan pembacaan matriks setelah matriks disusun seperti Tabel 4.5. Pembacaan matriks dilakukan perbarisnya atau dari kiri ke kanan, sehingga diperoleh ciphertext1“omt#nuL}xqq{“.

4.1.8. Implementasi dekripsi Vigenere cipher

Pada bagian ini dijelaskan proses implementasi algoritma Vigenere cipher pada dekripsi. Sebelum melakukan enkripsi, kunci yang digunakan terlebih dahulu diulangi hingga memiliki panjang yang sama dengan ciphertext1.

4.1.8.1. Proses pengulangan kunci

Pada proses ini, key1 “ILKOM” diulangi hingga memiliki panjang yang sama dengan


(52)

46

Keterangan :

ciphertext1 = pesan yang akan didekripsi

key1 = kunci yang digunakan untuk algoritma Vigenere cipher key = key1 yang telah diulangi hingga sepanjang plaintext

4.1.8.2. Proses pengubahan karakter menjadi ASCII

Pada proses ini plaintext dan key1 diubah menjadi ASCII. Berikut adalah proses pengubahan karakter ciphertext1 dan key1 menjadi ASCII sesuai Tabel 4.1.

= ‘o’ = 111 = ‘I’ = 73 = ‘m’ = 109 = ‘L’ = 76 = ‘t’ = 116 = ‘K’ = 75 = ‘#’ = 35 = ‘O’ = 79 = ‘n’ = 110 = ‘M’ = 77 = ‘u’ = 117 = ‘I’ = 73 = ‘L’ = 76 = ‘L’ = 76 = ‘}’ = 125 = ‘K’ = 75 = ‘x’ = 120 = ‘O’ = 79 = ‘q’ = 113 = ‘M’ = 77 = ‘q’ = 113 = ‘I’ = 73 = ‘{‘= 123 = ‘L’ = 76

4.1.8.3. Proses dekripsi Vigenere cipher

Pada proses ini ciphertext1 didekripsi menjadi plaintext dengan menggunakan kunci yang telah diulangi. Rumus yang digunakan untuk proses dekripsi yaitu :

− 32 = ( − 32) − ( − 32) 95; untuk ≥ − 32 = ( − 32) + 95 − ( − 32) 95; untuk <

atau dapat juga ditulis :

= (( − 32) − ( − 32) 95) + 32; untuk ≥ = (( − 32) + 95 − ( − 32) 95) + 32; untuk <

proses dekripsi dilakukan sebagai berikut :

= (111 − 32) − (73 − 32) 95 + 32 = 70 = (109 − 32) − (76 − 32) 95 + 32 = 65 = (116 − 32) − (75 − 32) 95 + 32 = 73 = (35 − 32) + 95 − (79 − 32) 95 + 32 = 83 = (110 − 32) − (77 − 32) 95 + 32 = 65 = (117 − 32) − (73 − 32) 95 + 32 = 76


(53)

= (113 − 32) − (77 − 32) 95 + 32 = 68 = (113 − 32) − (73 − 32) 95 + 32 = 72 = (123 − 32) − (76 − 32) 95 + 32 = 79

4.1.8.4. Proses pengubahan ASCII menjadi karakter

Pada proses ini angka ASCII diubah kembali menjadi karakter sesuai Tabel 4.1. Berikut adalah proses pengubahan menjadi karakter :

= 70 =‘F’

= 65 =‘A’

= 73 =‘I’

= 83 =‘S’

= 65 =‘A’

= 76 =‘L’

= 32 = (spasi) = 82 =‘R’

= 73 =‘I’

= 68 =‘D’

= 72 =‘H’

= 79 =‘O’

sehingga diperoleh plaintext“FAISAL RIDHO”.

4.2. Pengujian

Setelah dilakukan perancangan dan implementasi, selanjutnya sistem harus diuji. Pengujian dilakukan dengan menggunakan Black Box Testing. Black Box Testing merupakan pengujian yang terfokus pada spesifikasi fungsional dari perangkat lunak. Pengujian dilakukan pada masing-masing halaman.


(54)

48

Tabel 4.6 Pengujian Screen Launcher Jenis

Black Box

Pengujian Hasil yang diharapkan

Hasil Pengujian Keterangan

Behavior Testing

Membuka dan menutup aplikasi secara berulang-ulang

Screen launcher ditampilkan sebelum halaman pengamanan terbuka

Diterima

4.2.2. Pengujian halaman pengamanan

Pengujian pada halaman pengamanan dilakukan dengan menggunakan jenis Black Box Testing yaitu Limit Testing, Sample Testing dan Robustness Testing. Pengujian dilakukan untuk mengetahui apakah aplikasi telah mampu melakukan pengamanan dan mampu mengatasi error akibat kesalahan inputan. Hasil pengujian pada halaman pengamanan dapat dilihat pada tabel 4.7.


(55)

Tabel 4.7 Pengujian Halaman Pengamanan Jenis

Black Box

Pengujian Hasil yang diharapkan

Hasil Pengujian Keterangan

Limit Testing

Panjang kunci1 = (panjang plaintext - 1)

Sistem melakukan pengamanan dan

menampilkan hasilnya

Diterima

Panjang kunci1 = panjang plaintext

Sistem melakukan pengamanan dan

menampilkan hasilnya


(56)

50

Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan) Panjang

kunci1 = (panjang plaintext + 1)

Sistem menampilkan pemberitahuan

“Pesan Harus

Lebih Panjang

dari Kunci”

Diterima

Panjang kunci2 = (panjang plaintext -1)

Sistem melakukan pengamanan dan

menampilkan hasilnya

Diterima

Panjang kunci2 = panjang plaintext

Sistem melakukan pengamanan dan

menampilkan hasilnya


(57)

Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan) Panjang

kunci1 = (panjang plaintext + 1)

Sistem menampilkan pemberitahuan

“Pesan Harus

Lebih Panjang

dari Kunci”

Diterima

Sample Testing

Panjang plaintext=12, panjang kunci1=5 dan panjang kunci2=4

Sistem melakukan pengamanan dan

menampilkan hasilnya

Diterima

Panjang plaintext=6, panjang kunci1=3 dan panjang kunci2=4

Sistem melakukan pengamanan dan

menampilkan hasilnya


(58)

52

Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan) Robustness Testing Plaintext memiliki karakter ASCII 165 (diluar 32 hingga 126) Sistem menampilkan pemberitahuan “Karakter Pesan Tidak Sesuai” Diterima Kunci1 memiliki karakter ASCII 165 (diluar 32 hingga 126) Sistem menampilkan pemberitahuan “Karakter Kunci1 Tidak Sesuai” Diterima Pesan tidak diinput Sistem menampilkan pemberitahuan “Input Tidak Boleh Kosong” Diterima


(59)

Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan) Kunci1

tidak diinput

Sistem menampilkan pemberitahuan

“Input Tidak

Boleh

Kosong”

Diterima

Kunci2 tidak diinput

Sistem menampilkan pemberitahuan

“Input Tidak

Boleh

Kosong”

Diterima

4.2.3. Pengujian halaman pengungkapan

Pengujian pada halaman pengungkapan dilakukan dengan menggunakan jenis Black Box Testing yaitu Limit Testing, Sample Testing dan Robustness Testing. Pengujian


(60)

54

Tabel 4.8 Pengujian Halaman Pengungkapan Jenis

Black Box

Pengujian Hasil yang diharapkan

Hasil Pengujian Keterangan

Limit Testing

Panjang kunci1 = (panjang plaintext - 1)

Sistem melakukan pengamanan dan

menampilkan hasilnya

Diterima

Panjang kunci1 = panjang plaintext

Sistem melakukan pengamanan dan

menampilkan hasilnya


(61)

Tabel 4.8 Pengujian Halaman Pengungkapan (lanjutan) Panjang

kunci1 = (panjang plaintext + 1)

Sistem menampilkan pemberitahuan

“Pesan Harus

Lebih Panjang

dari Kunci”

Diterima

Panjang kunci2 = (panjang plaintext -1)

Sistem melakukan pengamanan dan

menampilkan hasilnya

Diterima

Panjang kunci2 = panjang plaintext

Sistem melakukan pengamanan dan

menampilkan hasilnya


(1)

vii IMPLEMENTATION OF VIGENERE CIPHER ALGORITHM AND

MYSZKOWSKI TRANSPOSITION COMBINATION ON ANDROID BASED MESSAGE ENCRYPTION

APPLICATION

ABSTRACT

Humans have a desire to communicate with each other, such as via text message. Some messages are only intended for certain people. Required security using cryptographic algorithm to protect messages from people who are not entitled to know the message contents. Vigenere cipher algorithm is used to encrypt a message, then the result is encrypted using Myszkowski transposition algorithm to cover the weakness of Vigenere cipher. The result of this research showed that Myszkowski transposition can cover the weakness of Vigenere cipher, depending on the length of key used. Testing using Kasiski method on encrypted messageusing key2 “055”, the length of key1 is 2 or 5 characters. When using key2 “01055”, the length of key1 is 2 characters. And when using key2 “121401055” the length of key1 can not be determined.


(2)

DAFTAR ISI

Hal.

Persetujuan ii

Pernyataan iii

Penghargaan iv

Abstrak vi

Abstract vii

Daftar Isi viii

Daftar Tabel xi

Daftar Gambar xii

Bab 1 Pendahuluan

1.1 Latar Belakang 1

1.2 Rumusan Masalah 2

1.3 Batasan Penelitian 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 Algoritma 6

2.2 Kriptografi 6

2.2.1 Vigenere cipher 9

2.2.2 Myszkowski transposition 11

2.3 Metode Kasiski 12

2.4 Android 12

2.5 Penelitian Relevan 13

Bab 3 Analisis dan Perancangan

3.1 Analisis Sistem 14

3.1.1 Analisis masalah 14

3.1.2 Analisis persyaratan 15

3.1.2.1 Persyaratan fungsional 16 3.1.2.2 Persyaratan non-fungsional 16

3.1.3 Analisis proses 16

3.2 Pemodelan Sistem 17

3.2.1 Unified Modelling Language (UML) 17

3.2.1.1 Use case diagram 17

3.2.1.2 Activity diagram 19

3.2.1.3 Sequence diagram 21

3.2.2 Flowchart 23


(3)

ix 3.2.2.3 Flowchart program pengungkapan 25

3.2.3 Pseudocode 26

3.2.3.1 Pseudocode enkripsi Vigenere 27 3.2.3.2 Pseudocode enkripsi Myszkowski 27 3.2.3.3 Pseudocode dekripsi Myszkowski 28 3.2.3.4 Pseudocode dekripsi Vigenere 29

3.3 Perancangan Antarmuka (Interface) 30

3.3.1 Screen launcher 30

3.3.2 Halaman pengamanan 31

3.3.3 Halaman pengungkapan 33

3.3.4 Halaman bantuan 34

3.3.5 Halaman tentang 35

Bab 4 Implementasi dan Pengujian

4.1 Implementasi 37

4.1.1 Implementasi pseudocode enkripsi Vigenere 37 4.1.2 Implementasi pseudocode enkripsi Myszkowski 37 4.1.3 Implementasi pseudocode dekripsi Myszkowski 38 4.1.4 Implementasi pseudocode dekripsi Vigenere 39 4.1.5 Implementasi enkripsi Vigenere cipher 40 4.1.5.1 Proses pengulangan kunci 40 4.1.5.2 Proses pengubahan karakter menjadi ASCII 41 4.1.5.3 Proses enkripsi Vigenere cipher 42 4.1.5.4 Proses pengubahan ASCII menjadi karakter 42 4.1.6 Implementasi enkripsi Myszkowski transposition 43 4.1.6.1 Proses penyusunan matriks 43 4.1.6.2 Proses enkripsi Myszkowski transposition 43 4.1.7 Implementasi dekripsi Myszkowski transposition 44 4.1.7.1 Proses penyusunan matriks 44 4.1.7.2 Proses dekripsi Myszkowski transposition 45 4.1.8 Implementasi dekripsi Vigenere cipher 45 4.1.8.1 Proses pengulangan kunci 45 4.1.8.2 Proses pengubahan karakter menjadi ASCII 46 4.1.8.3 Proses enkripsi Vigenere cipher 46 4.1.8.4 Proses pengubahan ASCII menjadi karakter 47

4.2 Pengujian 47

4.2.1 Pengujian screen launcher 47

4.2.2 Pengujian halaman pengamanan 48

4.2.3 Pengujian halaman pengungkapan 53

4.2.4 Pengujian halaman bantuan 58

4.2.5 Pengujian halaman tentang 59

4.2.6 Pengujian keamanan 60

4.2.6.1 Pengujian Vigenere cipher 60 4.2.6.2 Pengujian kombinasi Vigenere dan Myszkowski 65 4.2.6.2.1 Menggunakan kunci 055 68 4.2.6.2.2 Menggunakan kunci 01055 69 4.2.6.2.3 Menggunakan kunci 111111111 70 4.2.6.3 Pembahasan hasil pengujian 70


(4)

Bab 5 Kesimpulan dan Saran 71

5.1 Kesimpulan 71

5.2 Saran 71

Daftar Pustaka 72

Listing Program A-1


(5)

xi DAFTAR TABEL

Hal.

Tabel 2.1. Bujur Sangkar Vigenere Cipher 10

Tabel 2.2. Tabel Substritusi Algoritma Vigenere Cipher 10

Tabel 3.1. Deskripsi Use Case Pengamanan 18

Tabel 3.2. Deskripsi Use Case Pengungkapan 19

Tabel 3.3. Keterangan Gambar Rancangan Halaman Pengamanan 32 Tabel 3.4. Keterangan Gambar Rancangan Halaman Pengungkapan 34 Tabel 3.5. Keterangan Gambar Rancangan Halaman Bantuan 35 Tabel 3.6. Keterangan Gambar Rancangan Halaman Tentang 36

Tabel 4.1. Tabel ASCII 41

Tabel 4.2. Tabel Matriks Enkripsi 43

Tabel 4.3. Tabel Matriks Dekripsi Tahap 1 44

Tabel 4.4. Tabel Matriks Dekripsi Tahap 2 45

Tabel 4.5. Tabel Matriks Dekripsi Tahap 3 45

Tabel 4.6. Pengujian Screen Launcher 48

Tabel 4.7. Pengujian Halaman Pengamanan 49

Tabel 4.8. Pengujian Halaman Pengungkapan 54

Tabel 4.9. Pengujian Halaman Bantuan 59

Tabel 4.10. Pengujian Halaman Tentang 60

Tabel 4.11. Deretan Huruf Berulang Vigenere 61


(6)

DAFTAR GAMBAR

Hal.

Gambar 2.1. Klasifikasi Metode Enkripsi 8

Gambar 3.1. Diagram Ishikawa 15

Gambar 3.2. Use Case Diagram 18

Gambar 3.3. Activity Diagram Pengamanan 20

Gambar 3.4. Activity Diagram Pengungkapan 21

Gambar 3.5. Sequence Diagram Pengamanan 22

Gambar 3.6. Sequence Diagram Pengungkapan 22

Gambar 3.7. Flowchart Sistem 24

Gambar 3.8. Flowchart Pengamanan 25

Gambar 3.9. Flowchart Pengungkapan 26

Gambar 3.10. Pseudocode Enkripsi Vigenere 27

Gambar 3.11. Pseudocode Enkripsi Myszkowski 28

Gambar 3.12. Pseudocode Dekripsi Myszkowski 29

Gambar 3.13. Pseudocode Dekripsi Vigenere 30

Gambar 3.14. Rancangan Screen Launcher 31

Gambar 3.15. Rancangan Halaman Pengamanan 32

Gambar 3.16. Rancangan Halaman Pengungkapan 33

Gambar 3.17. Rancangan Halaman Bantuan 35

Gambar 3.18. Rancangan Halaman Tentang 36

Gambar 4.1. Potongan Source Code Enkripsi Vigenere 37 Gambar 4.2. Potongan Source Code Enkripsi Myszkowski 38 Gambar 4.3. Potongan Source Code Dekripsi Myszkowski 39 Gambar 4.4. Potongan Source Code Dekripsi Vigenere 40